一点拙见
条款01:视c++为一个语言联邦
四大次语言:C、OOC、Template、STL
条款02:尽量以const,enum,inline 替换 #defeine
1.宏报错时,只报数值,不报变量名
2.作用域广,无封装性
3.类中的常量可声明static,记得在类外(实现文件)重定义,别忘了const
4.有的编译器不允许数组长度为static,可用enum hack实现
enum{a = 5};
int arr[a];
像#define一样无法获得地址(有时可能不需要)
5.形似函数的宏,虽然无函数调用的额外开销,但用Template和inline代替兼顾效率和安全
#define F(a,b) f((a) > (b) ? (a) :(b))
//写成下面
Template<typename T>
inline void F(const T& a, const T&b)
{
f((a) > (b) ? (a) :(b)) ;
}
条款03:尽可能使用const
1.STL中的const_iterator 指向可变,数值不可变
2.用const做函数返回值可避免if(返回值 = 变量)的错误
3.const成员函数:(1)接口清晰,哪个函数可改对象哪个不可很清晰
(2)可操作const对象
4.形参是否加const可重载
5.const成员函数若返回指向该对象的非const被指针接受,那么const属性会被破坏
6.常量性转除:const和non-const函数作用差不多时(一个函数完全可以实现),为减少重复代码,可把non-const对象转成const对象,并调用const成员函数,最后移除const限制,反之不安全
int a = 0;
static_cast(a).F(); //转成const 调用const成员函数
const_cast(a); //转回non-const
条款04:确定对象被使用前已先被初始化
1.永远在使用对象之前将其初始化
2.用成员初值列改写构造函数
3.总是在初值列中列出所有成员变量