gpt4 book ai didi

C++ : 3 questions about initialization syntax, 值初始化和默认初始化

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:40 25 4
gpt4 key购买 nike

所以我非常努力地理解 C++ 中的初始化规则。

我写了下面的代码:

struct B {
int i;

// this prevents the definition of an implicit default constructor
B( int j ) : i(j) {}

};

struct C {
int i;

// i is not mentioned in the initializer list
// the compiler will call default constructor for i
C() {}

};


int main() {

int x( 1 );
cout << " x = " << x << endl;

// error: no matching function for call to ‘B::B()’
//B b4 = B();
//cout << " b4.i = " << b4.i << endl;

C c1;
cout << " c1.i = " << c1.i << endl;
}

1) x 被正确初始化为 1,但我不理解“int x(1)”这个符号。它不是值初始化的(我们会写“int x = int()”,然后 x 将为 0)。它也不是构造函数调用,因为内置类型没有构造函数。此外,下面的页面明确指出:“只有具有构造函数的类的对象才能使用函数式语法进行初始化”。

http://msdn.microsoft.com/en-us/library/w7wd1177(v=vs.100).aspx

2) 如果我取消注释 b4 的创建,它不会编译。因为我定义了构造函数,所以编译器不会生成隐式默认构造函数。这可以。但是为什么这会阻止使用“B()”创建临时值初始化对象呢?编写“B()”永远不是构造函数调用,对吗?

3) 正如 C 类的注释中所解释的,初始化列表中没有提到 i。因此,它应该是默认初始化的,这意味着对于 int 类型是未定义的。但是每次运行程序时输出都是“c1.i = 0”。

谢谢。

最佳答案

  1. int x(1); 与为内置类型编写 int x = 1; 相同。

  2. 对于具有用户定义构造函数(非 aggregate )的类型,编写 T() 总是 调用默认构造函数;这就是代码无法编译的原因。

  3. c1.i 确实是未初始化的,读取它是未定义的行为。您的编译器可能正在清零内存,尤其是在您没有启用优化的情况下;或者它只是碰巧打印出零的机会。您当然不能指望这种行为。这是 output from clang打印垃圾。

关于C++ : 3 questions about initialization syntax, 值初始化和默认初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17713665/

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