gpt4 book ai didi

c++ - 为什么默认构造函数只适用于类指针?

转载 作者:行者123 更新时间:2023-12-05 01:03:51 25 4
gpt4 key购买 nike

我一直在搞乱一个受 this answer 启发的默认构造函数示例。 .这个工作正常:

class Foo {
public:
int x;
Foo() = default;
};

int main() {
for (int i = 0; i < 100; i++) {
Foo* b = new Foo();
std::cout << b->x << std::endl;
}

但是当我用堆栈上的类实例尝试这个时,它没有!例如,如果我实例化像 Foo b 这样的类,我会收到一条错误消息,提示 使用了未初始化的局部变量 'b'

但是,当我将构造函数更改为 Foo() {} 时,使用 Foo b 进行实例化可以正常工作,并且我看到来自 b.x 符合预期。

当我在堆栈上实例化一个类时,为什么默认构造函数不起作用?

我用 MVSC C++17 编译了代码: Screenshot

最佳答案

这是因为 x 未初始化。读取未初始化的变量会使您的程序具有未定义的行为,这意味着它可能会在任何一天停止“工作”。它也可能在你认为一切都很好的时候做一些你没有意识到的奇怪的事情。

这些都是零初始化x:

Foo* b = new Foo();
Foo* b = new Foo{};
Foo b{};

虽然这些没有:

Foo *b = new Foo;
Foo b;

MSVC 可能无法捕获并警告您未初始化变量并稍后读取它的所有情况。不需要这样做 - 这就是为什么您可能会在一种情况下收到警告而在另一种情况下不会收到警告。

关于c++ - 为什么默认构造函数只适用于类指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73355758/

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