更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

C++开发类中成员变量的初始化顺序

  • 发布:C++培训
  • 来源:网络
  • 时间:2018-05-07 16:48

对于类中的成员变量的初始化要注意:

考虑:

 

#include<iostream>

using namespace std;

class A

{

private:

int n1;

int n2;

public:

A():n2(0),n1(n2+2){}

void Print(){

cout << "n1:" << n1 << ", n2: " << n2 <<endl;

}

};

int main()

{

A a;

a.Print();

getchar();

return 1;

}

复制代码

输出以上结果的时候,以为是n1:2,n2:0吗

错了!

复制代码

#include<iostream>

using namespace std;

class A

{

private:

int n1;

int n2;

public:

//A():n2(0),n1(n2+2){} //n1:-858993458, n2: 0

//A():n1(n2+2),n2(0){} //n1:-858993458, n2: 0

//A():n1(0),n2(n1+2){}//n1:0, n2: 2

A():n2(n1+2),n1(0){}//n1:0, n2: 2

void Print(){

cout << "n1:" << n1 << ", n2: " << n2 <<endl;

}

};

int main()

{

A a;

a.Print();

getchar();

return 1;

}

总结:既然如此,我们在写初始化列表时最好按成员变量出现的顺序来写,这样不容易出现混淆。

尝试运行以上的例子,可以发现,在用T():name(),name2():{}的形式进行初始化的时候,初始化的顺序是与类中本来类的变量位置的顺序有关,与T():name(),name2():{}的形式中变量名的顺序无关。

为什么要这样做?为什么C++不按初始化列表的顺序来初始化成员变量呢?

因为我们知道初始化的顺序应该与析构的顺序相反,也就是说,如果有两个成员变量 A 和 B ,初始化顺序为 A -> B ,那么在这个类被析构时,应该先析构 B 再析构 A。而对一个类来说 constructor 可能有多个,初始化列表也会有多个,所以如果我们要按初始化列表的顺序来进行初始化,那么我们就得记住这个顺序,以便在析构时决定析构的顺序。所以C++就选择了简单的点的方法,按成员变量出现的顺序来初始化。

 

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C++中的单例模式
下一篇:C++开发中如何定义动态数组

C语言创建windows窗口实例

C++回调函数是什么?

C++ shared_ptr和动态数组

C语言有哪些关键词,C语言44个关键词大全

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省