3.尽量避免在public接口出现数据成员
这样可以防止在成员函数的类外对数据成员进行读写。
4.在以下几种情况下尽量使用const
cosnt主要用于防止数据成员被修改
- 用于读取数据成员的成员函数可以加const声明为常成员函数
- 如果函数的参数不希望被修改,可以加const
5.函数参数尽量用"传引用",而不用"传值"
这样做主要有两个好处:
- 引用是变量和对象的别名,与实参共用一段内存空间,这样就可以避免传值时的形参所带来的内存复制
- 当参数是类对象时,传引用可以避免对象的复制,这样就能避免不必要的构造函数和析构函数的调用,有利于提高效率。
6.千万不要返回局部对象的引用,也不要返回函数内部用 new 初始化的
指针的引用
- 局部对象的生命空间是有效的,在离开函数后,函数内部所有的局部对象将被销毁。因此,如果返回局部对象的引用,那个局部对象其实已经在函数调用者使用它之前被销毁了。
- 在函数内部用new初始化后的指针在函数的最后必须释放掉,不然会造成内存泄漏,但释放掉的指针就不能返回引用了,如果不释放返回其引用就会引起内存泄漏。
7.尽可能推迟变量的定义
这样做主要有以下两个好处:
- 在使用才定义变量有利于提高代码的可读性
- 可以提高代码的运行效率
如下代码所示:
class A
{
........//省略
private:
int _var =0;
}
A& getCopy(const A & a)
{
// A b; (1)
if(a._var ==0)
return null;
A b; (2)
b._var = a._var;
return b;
}
如果在(1)出定义对象b,不管if中的条件满不满足,都会先调用类A的构造函数对其进行初始化。但如果在(2)处定义对象b,当if中的条件不满足时,就不用调用类A的构造函数对其进行初始化,也就不用调用析构函数,这样就可以少调用一次构造函数和析构函数。
7.变量必须初始化
参考:Effective C++