gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:26:26 26 4
gpt4 key购买 nike

我只是在测试下面显示的代码(学习 c++ 中的 oop)。

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

#include <iostream>

class Point {
private:
double x, y;

public:
static unsigned int pCount;

// constructor1 with no initial arguments
Point() {
x = 0.0f;
y = 0.0f;
std::cout << "Point()" << " x = " << x << " y = " << y
<< " point no: " << ++pCount << std::endl;
}

/*
// constructor1 alternative: calling another constructor
Point() {
Point(0.0f, 0.0f);
std::cout << "Point()" << std::endl;
}
*/

// constructor2 with initial arguments
Point(double cx, double cy) {
x = cx;
y = cy;
std::cout << "Point(double, double)" << " x = " << x << " y = " << y
<< " point no: " << ++pCount << std::endl;
}

void Show() {
std::cout << "Show()" << " x = " << x << " y = " << y << std::endl;
}

virtual ~Point() {
std::cout << "~Point()" << " x = " << x << " y = " << y
<< " point no: " << pCount-- << std::endl;
}
};

unsigned int Point::pCount = 0;

int main(int argc, char *argv[]) {
Point p1(2.5, 7.6);
Point p2;

p2.Show();
p1.Show();

return (0);
}

上面的代码将输出创建为:

Point(double, double) x = 2.5 y = 7.6 point no: 1
Point() x = 0 y = 0 point no: 2
Show() x = 0 y = 0
Show() x = 2.5 y = 7.6
~Point() x = 0 y = 0 point no: 2
~Point() x = 2.5 y = 7.6 point no: 1

但是,当我注释掉 constructor1 并取消注释 constructor1 alternative 时,创建的输出变得有点奇怪,如下所示:

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

我认为在后一种情况下(constructor1 alternative),会创建一个临时对象,然后将其指针传递给p2。无论如何,到目前为止,一切都很好......但我坚持分配给变量 xy 的值:前者显示 x = 0, y = 0 正如预期的那样;然而后者吐出 x = 4.63813e-310, y = 9.88131e-324,虽然值非常接近于零,但对我来说仍然很奇怪。

为什么后一种情况没有分配准确的“”值?

最佳答案

I think in the latter case (constructor1 alternative), a temporary object is created and then its pointer is passed to p2

你是对的,确实 build 了一个临时建筑,但它在 build 后立即被摧毁。您可能想像这样使用委托(delegate)构造函数:

Point() : Point(0.0, 0.0) {}

这将调用带有两个双参数的构造函数,并且两个数据成员都被初始化。请注意,您所指的“奇怪”行为只不过是未初始化的数据 - 数据成员包含垃圾值,因为它们尚未初始化。

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

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};

作为类接口(interface)一部分的附加功能(打印、到另一点的距离等)可以方便地在自由函数中定义。

关于c++ - 为什么构造函数调用构造函数会产生奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53571313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com