初始化列表成员变量的初始化
2015-10-10 21:55
225 查看
对于以下程序:
本想得到的结果是a,b都为90。但是实际结果却是:
也即此时输出的第一个数是一个随机数,第二个是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; 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。但是实际结果却是:
4273046 90 Process returned 0 (0x0) execution time : 0.101 s Press 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; }
结果:
90 90 Process returned 0 (0x0) execution time : 1.057 s Press any key to continue.
原因在于:在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。!!!!!!
要注意按照与成员变量声明一致的次序来编写构造函数初始化列表,此外,尽可能避免使用成员来初始化其他成员,一般情况下,通过(重复)使用构造函数的形参而不是使用对象的数据成员,可以避免由初始化的执行次序而引起的任何问题。
相关文章推荐
- 部分喷墨机初始化方法
- C#中数组初始化与数组元素复制的方法
- C#中结构(struct)的部分初始化和完全初始化实例分析
- c#对象初始化顺序实例分析
- 在windows下手动初始化PostgreSQL数据库教程
- js判断变量初始化的三种形式及推荐用的形式
- javascript 定义初始化数组函数
- js二维数组定义和初始化的三种方法总结
- C++类的静态成员初始化详细讲解
- 浅析C++中结构体的定义、初始化和引用
- 函数外初始化与函数内初始化详细解析
- PHP cURL初始化和执行方法入门级代码
- Java中List与Map初始化的一些写法分享
- java类中元素初始化顺序详解
- python类继承与子类实例初始化用法分析
- C++直接初始化与复制初始化的区别深入解析
- libevent 初始化与event_init
- JVM 之 类的加载与初始化
- 链栈的初始化与遍历
- 数组清空 初始化