条款4:确定对象使用前已经被初始化
- 为内置型对象要手工初始化,因为c++不保证初始化它
- 构造函数最好使用成员初始值,而不要在构造函数本体内赋值操作。且要保持class 内成员的顺序
- “跨编译单元初始化次序”问题,请以local static 来替换 non-local static
int a;
cout << a << endl;
这样得到的数据是内存的数,我们初始化,所以我们要对它初始化。
int a = 5;
cout << a << endl;
我们在初始化类成员函数喜欢这样写:
class a
{
public:
a(int bnum, string bstr);
~a();
private:
int num;
string str;
};
a::a(int bnum, string bstr)
{
num = bnum;
str = bstr;
}
应该养成习惯,改写成(保持类中的顺序):
class a
{
public:
a(int bnum, string bstr);
~a();
private:
int num;
string str;
};
a::a(int bnum, string bstr):num(bnum),str(bstr)
{
}
c++规定,对象的成员变量的初始化动作发生在进入构造函数之前,构造函数里面是赋值运算。
local static 是指函数内的static 对象,其他的static 对象为 non-local static。
编辑单元 是指产出的单一目标文件的源码,其实就是对应的.h与.cpp 文件。
简单来说就是这个函数还没有调用,会导致local static 未能初始化,导致在别的函数中,获取相关联的数据,就会出问题。
条款5:了解c++默默编写并调用那些函数
- 编译器可以暗自为Class创建default构造函数、copy构造函数、copy assignment 操作符,以及析构函数。
当我们写:
class b
{};
编译器默默的给你写了:
class b
{
public:
b(){...}
b(const b& rhs){...}
~b(){...}
b& operator=(const b& rhs){...}
};
一定要记住哟。
条款6:若不想使用编译器自动生成的函数,就该明确拒绝
- 为驳回编译器自动提供机能,可以将对应函数改写成private。
比如将上面的改写成:
class b
{
public:
b(){...}
~b(){...}
private:
b(const b& rhs){...}
b& operator=(const b& rhs){...}
};
这样就可以了。
条款7:为多态基类声明virtual析构函数
- polymorphic(带多态性质的) base classes 应该声明virtual 析构函数。如果class带有任何virtual 函数,都要,加上virtual析构函数。
- classes 不具有多态,或者作为base classes ,不能加上virtual 析构函数
简单来说,当你base类 指向你的派生类,然后你用delete 这个指针会出现问题。因为本来在释放的时候,先释放派生类,在释放基类,你使用delete,会造成不完全释放。就会报错。
条款8:别让异常逃离析构函数
- 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞没它或结束程序。
- 如果出现一个异常函数,应该提供一个普通函数来执行改操作。
这个就很简单了,若你只是抛出异常,程序还会进行,后面会出现更多的问题。应该在析构函数里吞没。
今天先写这里,希望大家多多了解,让代码写的更加漂亮。