Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ GCC默认int数据成员初始化_C++ - Fatal编程技术网

C++ GCC默认int数据成员初始化

C++ GCC默认int数据成员初始化,c++,C++,下面的代码从未打印出计数器,假设编译器执行了一些智能操作,将int数据成员类型初始化为零 include <iostream> using namespace std; class A { public: int a; int b; A(): b(a), a(b) { } }; int main() { A* p = new A; int counter = 0; while (!(p->a)) {

下面的代码从未打印出计数器,假设编译器执行了一些智能操作,将int数据成员类型初始化为零

include <iostream>

using namespace std;

class A {
  public:
    int a;
    int b;

    A(): b(a), a(b) { }
};

int main()
{
    A* p = new A;
    int counter = 0;

    while (!(p->a)) {
        p = new A;
        counter++;
    }

    cout << counter << endl;
}
包括
使用名称空间std;
甲级{
公众:
INTA;
int b;
A():b(A),A(b){}
};
int main()
{
A*p=新的A;
int计数器=0;
而(!(p->a)){
p=新A;
计数器++;
}

cout这是未定义的行为。
a
是第一个初始化的,它被初始化为
b
,这是一个未初始化的变量。如果要初始化值(或初始化为
0
):

请注意,初始化顺序是成员在类定义中出现的顺序,而不是在成员初始化列表中出现的顺序

下面的代码从未打印出计数器,假设编译器 将int数据成员类型初始化为 零

假设是错误的。未初始化变量的值是不确定的。它可能是某个随机数,恰好在内存中

将构造函数行更改为:

A(): b(0), a(0) { } 

此显式将值初始化为零,并且还清楚地传达意图。记住代码是供人类阅读的。计算机永远不会真正看到C++代码。

还请注意,以下内容是等效的:

A(): b(), a() { } 
虽然我个人不使用这种初始化方法



<> P>初始化不是代码唯一的问题。对于代码,你有巨大的内存泄漏,因为你没有<代码>删除<代码>实例:<代码> A<代码>你>代码>新< /Cord> ED。学习正确的现代C++,因为你的帖子显示你对语言基础不太了解。。您正在使用未初始化的变量来初始化其他变量。我只能说您很幸运地将它们设为零。pedantic-括号内的
0
是多余的。而且,不一定是未定义的值,而是程序的整个行为。@LuchianGrigore:因为深入研究pedantic:未初始化的变量是不确定的,不是未定义的。@ LuChiang-Gigor:“也明确地传达意图”。虽然有经验的C++程序员如我们自己理解什么“代码> A()),但(b)(<代码)>在<代码> cTor初始化器中,只有<代码> a(0)、b(0)< /> > IMO,才是更好的代码可读性。
A(): b(), a() { }