程序员面试宝典(三)P107

来源:互联网 发布:淘宝买药货到付款骗局 编辑:程序博客网 时间:2024/05/18 16:16
有这样一段代码#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){}
就可以得到你要的结果了~
呵呵~都是自己的理解,有什么不明白找我Q277369986~~~~~~
原创粉丝点击