C++ 为什么构造函数调用构造函数会产生奇怪的结果?

C++ 为什么构造函数调用构造函数会产生奇怪的结果?,c++,oop,constructor,C++,Oop,Constructor,我正在测试下面显示的代码(在c++中学习oop) (系统:linux,gcc编译器,带-std=c++11) 但是,当我注释掉constructor1并取消注释constructor1备选方案时,创建的输出有点奇怪,如下所示: Point(double, double) x = 2.5 y = 7.6 point no: 1 Point(double, double) x = 0 y = 0 point no: 2 ~Point() x = 0 y = 0 point no: 2 Point()

我正在测试下面显示的代码(在
c++
中学习
oop

(系统:linux,gcc编译器,带
-std=c++11

但是,当我注释掉
constructor1
并取消注释
constructor1备选方案时,创建的输出有点奇怪,如下所示:

Point(double, double) x = 2.5 y = 7.6 point no: 1
Point(double, double) x = 0 y = 0 point no: 2
~Point() x = 0 y = 0 point no: 2
Point()
Show() x = 4.64944e-310 y = 9.88131e-324
Show() x = 2.5 y = 7.6
~Point() x = 4.64944e-310 y = 9.88131e-324 point no: 1
~Point() x = 2.5 y = 7.6 point no: 0
我认为在后一种情况下(
constructor1alternative
),会创建一个临时对象,然后将其指针传递到
p2
。无论如何,到目前为止,一切都很好。。。但是我被分配给变量
x
y
的值卡住了:前者按预期显示
x=0,y=0
;然而,后者吐出了
x=4.63813e-310,y=9.88131e-324
,虽然值非常接近于零,但对我来说仍然很奇怪

为什么后一种情况不指定准确的“零”值

我认为在后一种情况下(
constructor1alternative
),会创建一个临时对象,然后将其指针传递给p2

你说得对,一个临时建筑确实建造了,但建造之后就被摧毁了。您可能希望使用如下委托构造函数:

Point() : Point(0.0, 0.0) {}
这将使用两个双参数调用构造函数,并初始化两个数据成员。请注意,您提到的“奇怪”行为只不过是未初始化的数据——数据成员包含垃圾值,因为它们尚未初始化

作为旁注(我知道你说过这是关于学习OOP的,所以不要太认真):在我看来,你的
类的两个坐标数据成员可以独立变化。因此,您的类不会管理不变量——在这种情况下,您可能需要考虑将类型简化为

struct Point { double x = 0.0; double y = 0.0; };
它允许默认构造

Point p; // both x and y are 0.0 now
以及聚合初始化

Point p{3.14, 42.0};
作为类接口一部分的附加功能(打印、到另一点的距离等)可以方便地在自由函数中定义

我认为在后一种情况下(
constructor1alternative
),会创建一个临时对象,然后将其指针传递给p2

你说得对,一个临时建筑确实建造了,但建造之后就被摧毁了。您可能希望使用如下委托构造函数:

Point() : Point(0.0, 0.0) {}
这将使用两个双参数调用构造函数,并初始化两个数据成员。请注意,您提到的“奇怪”行为只不过是未初始化的数据——数据成员包含垃圾值,因为它们尚未初始化

作为旁注(我知道你说过这是关于学习OOP的,所以不要太认真):在我看来,你的
类的两个坐标数据成员可以独立变化。因此,您的类不会管理不变量——在这种情况下,您可能需要考虑将类型简化为

struct Point { double x = 0.0; double y = 0.0; };
它允许默认构造

Point p; // both x and y are 0.0 now
以及聚合初始化

Point p{3.14, 42.0};
作为类接口一部分的附加功能(打印、到另一点的距离等)可以方便地在自由函数中定义