Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:关于初始化语法、值初始化和默认初始化的3个问题 因此,我正在努力理解C++中的初始化规则。_C++_Initialization_Default - Fatal编程技术网

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的例子中说的。他不能对特定类类型的对象进行值初始化,因为它没有默认构造函数。(他似乎期望值初始化会产生一个临时值。)啊哈!认知上的不和谐终于出现了:我看到我们在谈论不同的目的。编辑中的要点更清楚。