《C++ Primer》 P258 7.5.1构造函数初始化列表 一节
- 类成员为const类型(const 类型在 C++11中,还可以使用 类内初始化方式,也就是直接在声明的时候进行初始化)
- 类成员为引用类型
const对象或引用只能初始化但是不能赋值。构造函数的函数体内只能做赋值而不是初始化,因此初始化const对象或引用的唯一机会是构造函数函数体之前的初始化列表中。
从无到有叫初始化,初始化(调用拷贝构造函数)创建了新对象;赋值(调用赋值操作符)没有创建新对象,而是对已有的对象赋值。
3. 类成员为没有默认构造函数的类类型
创建对象时,要初始类成员的每一个成员(如果没有在初始化列表里面,编译器会自动使用它的默认的构造函数进行初始化,但是它没有默认构造函数,所以会编译报错,所以没有默认构造函数的成员变量需要使用初始化列表进行初始化)
Ostream类的构造函数为 explicit ostream (streambuf* sb); 一个参数且没有默认值,故没有默认构造函数,定义一个ostream对象时,必须在初始化列表中对其进行初始化。
Stream objects require a buffer to send data to the external device. The standard output stream object, std::cout, is initialized with a buffer the encapsulates transport to wherever your output appears. 故cout这个ostream对象是不需要用户去进行初始化的。
参考 https://blog.csdn.net/autumn20080101/article/details/51798677
class my_ostream
{ std::ostream os;
}
my_ostream:: my_ostream ()
: os(0) //必须在初始化列表中对其进行初始化
{
….
}
4. 如果类存在继承关系,且基类没有默认构造函数的情况下,派生类必须在其初始化列表中调用基类的构造函数
class A
{
public:
const int a;
int & b;
};
class TestBox
{
public:
TestBox( int b) // no default constructor
{
a = b;
cout<<"conductor +++++ "<<endl;
}
public:
int a;
};
class C :public TestBox // 继承关系
{
public:
C(int c):TestBox(c) //必须在初始化列表中调用基类的构造函数
{
d = c;
}
int d;
};
参考:https://blog.csdn.net/a1317338022/article/details/53447847