您的位置:首页 > 编程语言 > C语言/C++

有哪几种情况只能用intialization list 而不能用assignment

2013-03-09 15:59 330 查看
无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果都是相同的。不同之处在于,使用构造函数初始化列表初始化数据成员,没有定义初始化列表的构造函数在构造函数体中对数据成员赋值。
对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表。

还有一种情况就是,类的构造函数需要调用其基类的构造函数的时候。请看下面的代码:

1       #include <iostream>

2       using namespace std;

3

4       class A                      //A是父类

5       {

6       private:

7                int a;                   //private成员

8       public:

9               A() {}

10              A(int x):a(x) {}           //带参数的构造函数对a初始化

11              void printA()             //打印a的值

12              {

13                       cout << "a = " << a << endl;

14              }

15     };

16   

17     class B : public A //B是子类

18     {

19     private:

20              int b;

21     public:

22              B(int x, int y) : A(x)      //需要初始化b以及父类的a

23              {

24                       //a = x;           //a为private,无法在子类被访问,编译错误

25                       //A(x);            //调用方式错误,编译错误

26                       b = y;

27              }

28              void printB() //打印b的值

29              {

30                       cout << "b = " << b << endl;

31              }

32     };

33   

34     int main()

35     {

36              B b(2,3);

37            

38              b.printA();             //调用子类的printA()

39              b.printB();             //调用自己的printB()

40   

41              return 0;

42     }

从上面的程序可以看到,如果在子类的构造函数中需要初始化父类的private成员,直接对其赋值是不行的(代码24行),只有调用父类的构造函数才能完成对它的初始化。但在函数体内调用父类的构造函数也是不合法的(代码25行),只有采取22行中的初始化列表调用子类构造函数的方式。程序的执行结果如下:

1       a = 2

2       b = 3

当类中含有const、reference成员变量以及基类的构造函数都需要初始化列表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++