有哪几种情况只能用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成员变量以及基类的构造函数都需要初始化列表。
对于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成员变量以及基类的构造函数都需要初始化列表。
相关文章推荐
- 哪几种情况只能用intialization list 而不能用assignment?
- 有哪几种情况只能用intialization list 而不能用assignment
- 有哪几种情况只能用intialization list 而不能用assignment?
- C++有哪几种情况只能用初始化列表,而不能用赋值?
- C++有哪几种情况只能用初始化列表,而不能用赋值?
- C++有哪几种情况只能用初始化列表,而不能用赋值?
- C++有哪几种情况只能用初始化列表,而不能用赋值?
- C++有哪几种情况只能用初始化列表,而不能用赋值?
- C++有哪几种情况只能用初始化列表,而不能用赋值?http://zhidao.baidu.com/link?url=omVOhkgo4ZtpRddk794ly-aX79VjboKv3c3noM5tdz
- 只能用intialization list 而不能用assignment
- 只能用初始化列表而不能使用赋值的情况一般有以下3种
- C++中只能使用初始化列表不能使用赋值的情况
- Android Studio布局预览功能不能使用的几种情况
- 电子邮件收发问题之二:只能收不能发的几种可能原因
- 电子邮件只能收不能发的几种可能原因
- 电子邮件问题:只能收不能发的几种可能原因
- 只能用intialization list而不能用assignment
- C++ 什么时候只能用intialization list而不能用assignment
- 解决 LINUX mysql不能通过IP连接 只能localhost 权限没问题情况下
- 造价工程师不能注册成功的几种常见情况