使用空默认构造函数时成员中存在垃圾值的问题
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){}
它们都按预期工作。
- 为什么在没有括号的第一次尝试中,它生成了一个随机值,但
{}
有效,但在第二次尝试中它们都有效?
- 什么是用
{}
调用默认构造函数?
这是因为第二个构造函数用值初始化成员变量,而第一个构造函数留下不确定值的成员变量。
要么:
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_axis
和y_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_axis
和 y_axis
] 将被初始化为 0
.
我正在尝试使用默认构造函数创建一个非常基本的 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){}
它们都按预期工作。
- 为什么在没有括号的第一次尝试中,它生成了一个随机值,但
{}
有效,但在第二次尝试中它们都有效? - 什么是用
{}
调用默认构造函数?
这是因为第二个构造函数用值初始化成员变量,而第一个构造函数留下不确定值的成员变量。
要么:
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_axis
和y_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_axis
和 y_axis
] 将被初始化为 0
.