程序员面试宝典(三)P107

有这样一段代码
#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~~~~~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值