C++;:关于初始化语法、值初始化和默认初始化的3个问题 因此,我正在努力理解C++中的初始化规则。
我编写了以下代码:C++;:关于初始化语法、值初始化和默认初始化的3个问题 因此,我正在努力理解C++中的初始化规则。,c++,initialization,default,C++,Initialization,Default,我编写了以下代码: 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
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;
}
结构B{
int i;
//这将阻止隐式默认构造函数的定义
B(intj):i(j){}
};
结构C{
int i;
//初始化列表中没有提到我
//编译器将调用i的默认构造函数
C(){}
};
int main(){
int x(1);
库特
intx(1);
与编写内置类型的intx=1;
相同T()
总是调用默认构造函数;这就是代码不编译的原因c1.i
确实是未初始化的,读取它是未定义的行为。您的编译器可能正在将内存归零,特别是在您没有启用优化的情况下;或者它只是碰巧打印出零。您当然不能指望这种行为。这是打印垃圾intx(1);
称为直接初始化。它分别为本机类型和类定义。在后一种情况下,将调用构造函数
如果在调试模式下运行程序,则会显示: c1.i=-858993460
这是“Ccccc.cc”的值,这是C++调试模式中未初始化值的默认值。
自从C++ 11以来,我们通常将值初始化为<代码> int i {};< /C> >,并且对y 3有一个非常快的答案:读取值是未定义的行为。如果没有用户定义的构造函数,则<代码>()如果格式良好,则仍将调用默认构造函数,而默认构造函数必须隐式定义。“编写T()
始终调用默认构造函数”……除非涉及最麻烦的解析,否则它将声明参数的类型。8.5/7:“对T
类型的对象进行值初始化意味着:如果T
是具有用户提供构造函数的类类型[调用默认构造函数]。如果T
是一个非联合类类型,没有用户提供的构造函数,则该对象为零初始化,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数。如果T
是数组类型,则每个元素都进行值初始化。否则,该对象为零初始化。"@Casey谢谢,这可能是Praetorian回答下的回答。英文翻译:如果没有显式默认构造函数,则可以隐式定义一个。如果根本没有定义,则无法进行值初始化。如果隐式定义一个,但它什么也不做,则对象初始化为零。这是对您的po的答复int 2:“如果没有默认构造函数,就没有值初始化这类事情,”标准引号中的说法显然是错误的。值初始化是为数组(不能有构造函数)和没有默认构造函数的对象(例如,double
和foobar*
)定义的@Casey我是在OP的例子中说的。他不能对特定类类型的对象进行值初始化,因为它没有默认构造函数。(他似乎期望值初始化会产生一个临时值。)啊哈!认知上的不和谐终于出现了:我看到我们在谈论不同的目的。编辑中的要点更清楚。