Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2313935
  • 博文数量: 252
  • 博客积分: 5472
  • 博客等级: 大校
  • 技术积分: 3107
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-17 18:39
文章分类

全部博文(252)

文章存档

2012年(96)

2011年(156)

分类: C/C++

2012-06-04 10:22:36


  1. #include <iostream>
  2. #include<string>
  3. using namespace std;
  4. class base
  5. {
  6. private:
  7.  int m_i;
  8.  int m_j;
  9. public:
  10.  base(int i):m_j(i),m_i(m_j){}
  11.  base():m_j(0),m_i(m_j){}
  12.  int get_i() {return m_i;}
  13.  int get_j() {return m_j;}
  14. };
  15. int main(int argc,char*argv[])
  16. {
  17.  base obj(98);
  18.  cout<<obj.get_i() << endl << obj.get_j()<<endl;
  19.  return 0;
  20. }

虽然编译不出错,但是输出结果第一个值不能确定。如果我要是把第一个构造函数改为
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){}
就可以得到你要的结果了~

阅读(2735) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~