使用空默认构造函数时成员中存在垃圾值的问题

Problem with a junk value in a member when using an empty default constructor

我正在尝试使用默认构造函数创建一个非常基本的 class:

    class Point {
    public:
          Point() = default;//con 1
          explicit Point(double x): x_axis(x), y_axis(0){}//con 2
          Point(const Point &other) = default;
          ~Point() = default;
    private:
           double x_axis;
           double y_axis;
    }

当我尝试在 main() 函数中使用默认构造函数时,它会为 x_axis 生成随机垃圾值:

    Point p1;//generates random value
    Point p2{};//works as intended

这是为什么?当我像这样使用另一个构造函数(con 2)时:

    explicit Point(double x = 0): x_axis(x), y_axis(0){}

它们都按预期工作。

  1. 为什么在没有括号的第一次尝试中,它生成了一个随机值,但 {} 有效,但在第二次尝试中它们都有效?
  2. 什么是用 {} 调用默认构造函数?

这是因为第二个构造函数用值初始化成员变量,而第一个构造函数留下不确定值的成员变量。

要么:

class Point {
public:
    Point() : x_axis{}, y_axis{} {} // instead of  = default
...

class Point {
public:
    Point() = default;

    // ...
private:
    double x_axis{};     // {}     or
    double y_axis = 0.0; // = 0.0  
};

why in the first try, no brackets generated a random value but {} worked, and in the second try they both worked

在你写的第一次尝试时:

 Point p1; //this uses default constructor

这里使用默认构造函数,它只是默认初始化数据成员y_axisy_axis。由于这些是内置类型,因此它们具有不确定的值。

在你写的第二次尝试时:

Point p2{}; //this is zero initailization

上面是zero initialization意思是每个数据成员都初始化为0.


现在,当您提供以下构造函数时:

explicit Point(double x = 0): x_axis(x), y_axis(0) //this is a default constructor
{
}

上面是一个默认构造函数,它在构造函数初始化列表.

中用0初始化了两个数据成员

因此,这次当你写:

Point p1; //this uses the above provided default ctor

这次 p1 是使用默认 ctor 构造的,默认构造函数将两个数据成员都初始化为 0,因此 [=18= 的 x_axisy_axis ] 将被初始化为 0.