C++有哪几种情况只能用初始化列表,而不能用赋值?
1) 初始化一个reference成员
2) 初始化一个const成员
3) 调用一个基类的构造函数,而该函数有一组参数
4) 调用一个数据成员对象的构造函数,而该函数有一组参数
(1)对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表;
初始化与赋值是不同的:
赋值是删除原值,赋予新值,构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化;
初始化列表就不一样了,开辟空间和初始化是同时完成的,直接给予一个值;
常量不能被赋值,只能被初始化,所以必须在初始化列表中完成;
C++的引用也一定要初始化,所以必须在初始化列表中完成。
【
1) 引用必须被初始化,指针不必;
2) 引用初始化以后不能被改变,指针可以改变所指的对象;
3) 不存在指向空值的引用,但是存在指向空值的指针。
】
------------------
必须用到初始化成员列表的四种情况:
2) 初始化一个const成员
3) 调用一个基类的构造函数,而该函数有一组参数
4) 调用一个数据成员对象的构造函数,而该函数有一组参数
摘自《C++对象模型》
下面的例子讲的就是调用基类的构造函数,而该函数有一组参数
- #include <iostream>
- using namespace std;
- class Base
- {
- public:
- Base(const string &str = "", int i = 0) : Bstr(str), _i(i) // 使用const引用避免复制,
- // 如果只使用const则无法使用字面常量"DerivedStr"为str赋值
- {
- cout << "Base Constructor" << " Bstr = " << Bstr << ", _i = " << _i << endl;
- }
- string Bstr;
- int _i;
- };
- class Derived : public Base
- {
- public:
- // 调用基类构造函数,而它拥有一组参数时,要使用成员初始化列表
- Derived() : Base("DerivedStr", 200) // 这个是正确的
- {
- //Base::Bstr = "DerivedStr"; // 基类构造函数再次之前调用,这里赋值没有用。
- //Base::_i = 200;
- cout << "Derived Constructor" << endl;
- }
- string Dstr;
- };
- int main()
- {
- Derived d;
- return 0;
- }