我正在尝试使用默认构造函数创建一个非常基本的类:
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为什么会这样呢?当我使用其他构造函数(Con2)时,如下所示:
explicit Point(double x = 0): x_axis(x), y_axis(0){}他们两人的工作都是按计划进行的。
为什么在第一次没有括号的尝试中,它会生成一个随机值,但是在第二次尝试中,它们都能工作?{}
发布于 2022-05-15 12:58:32
这是因为第二个构造函数用值初始化成员变量,而第一个构造函数留给成员变量不确定的值。
要么做:
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
};发布于 2022-05-15 13:01:49
为什么在第一次尝试中,没有括号生成随机值,但{}有效,在第二次尝试中,它们都工作。
在第一次尝试时,您写道:
Point p1; //this uses default constructor这里使用默认的ctor,它只是默认初始化、数据成员y_axis和y_axis。因为它们是在类型中构建的,所以它们具有不确定的值。
在第二次尝试中,您写道:
Point p2{}; //this is zero initailization上面的是,意味着每个数据成员被初始化为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构造的,默认ctor将两个数据成员初始化为0,因此x_axis和y_axis of p1都将初始化为0。
https://stackoverflow.com/questions/72248443
复制相似问题