初始化列表成员变量的初始化
来源:互联网 发布:mac属于几线品牌 编辑:程序博客网 时间:2024/06/06 02:55
对于以下程序:
#include <iostream>using namespace std;class Base{private: int a; int b;public: Base(int i):b(i),a(b){} Base():b(0),a(b){} int get_a(){return a;} int get_b(){return b;}};int main(){ Base base(90); cout<<base.get_a()<<endl<<base.get_b()<<endl; return 0;}
本想得到的结果是a,b都为90。但是实际结果却是:
427304690Process returned 0 (0x0) execution time : 0.101 sPress any key to continue.
也即此时输出的第一个数是一个随机数,第二个是90。
初始化列表的成员变量的初始化是根据成员变量的声明顺序初始化的!!!!。
变量a在变量b之前声明,那么在类Base的构造函数初始化成员列表中,变量a会先定义,变量b会后定义,也就是说变量a会先初始化,而变量b会后初始化,所以,在执行Base(int i): b(i),a(b)时,a的值用b来初始化,其结果将是一个随机值,而b的值是i=90.!!!!!!!!!!!!!!
改一下声明的顺序,或者初始化的顺序都可以得到90 90。
例如:
#include <iostream>using namespace std;class Base{private: //int a; int b; int a;//修改声明顺序public: Base(int i):b(i),a(b){} Base():b(0),a(b){} int get_a(){return a;} int get_b(){return b;}};int main(){ Base base(90); cout<<base.get_a()<<endl<<base.get_b()<<endl; return 0;}
结果:
9090Process returned 0 (0x0) execution time : 1.057 sPress any key to continue.
原因在于:在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。!!!!!!
要注意按照与成员变量声明一致的次序来编写构造函数初始化列表,此外,尽可能避免使用成员来初始化其他成员,一般情况下,通过(重复)使用构造函数的形参而不是使用对象的数据成员,可以避免由初始化的执行次序而引起的任何问题。
0 0
- 初始化列表成员变量的初始化
- C++为什么用初始化列表初始化类的成员变量
- 成员变量的初始化
- C++成员变量初始化列表和变量初始化顺序
- 初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的
- c++ 初始化列表与成员变量赋值的区别
- C++成员变量初始化列表执行顺序
- 成员初始化列表的句法
- C++成员变量的初始化
- 特殊成员变量的初始化
- 类的成员变量初始化
- C++成员变量的初始化
- 类的成员变量初始化
- C++成员变量的初始化
- C++ 成员变量的初始化
- 成员变量的初始化区别
- 成员变量的初始化顺序
- Java成员变量的初始化
- wampan安装后出现Forbidden You don't have permission to access / on this server. 解决办法
- Mac 10.11 El Capitan 安装caffe 注意事项
- 线段树(2) ----- hdu4578所得的线段树的效率探究
- php用协程实现多任务调度(转载于风雪之隅)
- jvm参数设置
- 初始化列表成员变量的初始化
- linux主要目录结构
- java8笔记一
- Python matplotlib 模块安装全解
- 第一次使用Hadoop的环境搭建
- 记录spring切面代码,
- poj Snowflakes snow snowflakes 哈希
- 软件功能测试需求分析
- SQL Server 2005 更改安装路径目录的问题,