- #include <iostream>
- #include<string>
- using namespace std;
- class base
- {
- private:
- int m_i;
- int m_j;
- public:
- base(int i):m_j(i),m_i(m_j){}
- base():m_j(0),m_i(m_j){}
- int get_i() {return m_i;}
- int get_j() {return m_j;}
- };
- int main(int argc,char*argv[])
- {
- base obj(98);
- cout<<obj.get_i() << endl << obj.get_j()<<endl;
- return 0;
- }
虽然编译不出错,但是输出结果第一个值不能确定。如果我要是把第一个构造函数改为
base(int i):m_j(i),m_i(i){}或是不让他用初始化列表,
而是用函数体实现,
base(int i) { m_j = i; m_i = m_j; }
其结果都是正确的,但是我不知道结果虽然正确了,其实质的用法对不对,而且也不明白为什么用初始化列表实现不了对m_i的初始化。
在一个对象初始化的时候,是这样初始化的:
1,先调用基类构造函数,按基类的声明顺序
2,调用各成员对象的构造函数,按在类中定义成员对象的顺序来调用
3,调用派生类的构造函数,初始化的顺序也是按定义的顺序来进行(这个顺序是不变的,不管初始化列表中的声明顺序如何)
你这里没有基类和成员对象,因此第一和第二步不用管它,你只需要看第三步,因为你在类中是先定义int m_i,再定义int m_j的,因此先初始化m_i,在初始化m_j,根据你的构造函数
base(int i):m_j(i),m_i(m_j){}
先把m_j(还没初始化之前是系统给的一个随机值)的值给m_i,再把i的值给m_j,
因此输出的是m_i是乱码,
m_j的值是i的值——那obj(98)是obj(i)? obj()什么意思?
你只要改成base(int i):m_j(m_i),m_i(i){}
就可以得到你要的结果了~
阅读(2740) | 评论(0) | 转发(0) |