确定对象使用前已被初始化
永远在使用对象之前确保其已经初始化。
在release版本的时候一定要在构造函数里面进行初始化,否则可能产生很多未知行为导致程序崩溃。
使用 member initialization list 初始化成员变量,更加高效。
class TestClass
{
public:
explicit TestClass(int a = 1,int b = 2)
:_numA(a)
,_numB(b)//推荐这种初始化方式
{
_numA = a;
_numB = b;//而不是这种初始化方式
}
private:
int _numA;
int _numB;
};
初始化顺序
- 基类比其子类更早初始化。
class Base
{
};
class BaseChijld :public Base
{
};//先初始化 Base 再初始化 BaseChijld
- 类的成员变量总是以其声明的次序被初始化。
class Test
{
private:
int _a;
int _b;//先初始化 _a,再初始化_b
};
为多态基类声明virtual析构函数
在C++中,当derived class 对象经由一个base class指针被删除的时候,而该base class带着一个non-virtual析构函数,其结果未有定义,实际执行时通常发生的是对象的derived成分没被销毁。
如果一个class带有任何的virtual函数,它就应该拥有一个virtual析构函数。
Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不应该声明virtual析构函数
令 operator= 返回一个 reference to *this
为了实现连锁赋值,赋值操作符必须返回一个reference指向操作符的左侧实参。这是为classes实现赋值操作符时应该遵循的协议。也包括其他的操作符
class Test
{
public:
Test &operator=(const Test &t)
{
// do something
return *this;
}
Test &operator+=(const Test &t)
{
// do something
return *this;
}
};