条款26:尽可能的延后变量定义式出现的时间
尽可能后的定量定义式不仅能够避免构造非必要对象,还可以避免无意义的缺省构造行为,更深层次的说,以具明显意义之初值将变量初始化,还可以附带说明变量的目的。
条款27:尽量少做转型动作
c++中的四种新式转型:
const_cast<T>(expression) 去除const的属性转化
dynamic_cast<T>(expression)支持运行时识别指针或引用所指向的对象
reinterpret_cast<T>(experssion)操作数的位模式提供较低层次的重新解释
static_cast<T>(experssion)进行强迫隐性转换
条款28:避免返回handle指向对象内部成分
即避免返回引用、指针、迭代器指向对象内部。
条款29 :为异常安全努力是值得的
条款30 透彻了解inlining的里里外外
将大多数inlining限制在小型、被频繁调用的函数身上,这可使日后的挑调试过程和二进制升级更容易,也可使潜在代码的膨胀问题最小化,使程序的速度提升最大化。
条款31: 将文件间的编译存在关系降到最低
支持编译最小化的一般构想是 相依于声明式,不要想相依于定义式
条款32 确定你的public继承塑模出is-a关系
public 意味着is-a。 适用于base class身上的每一件事也都是适用于derived class 身上,因为每一个derived class对象也都是一个base class对象。
条款33 避免遮掩继承而来的名称
int x;
void f()
{
double x;
cin>>x; //内层的作用域会遮掩外围的作用域的名称
}
class base{
private:
int x;
public:
virtual void f1() = 0;
virtual void f2();
virtual void f1(int);
void f3();
void f3(double);
};
class Derived: public base{
public:
virtual void f1();
void f3();
void f4();
};
//调用过程中
Derived d;
int x;
d.f1();// 调用Derived 中的f1
d.f1(x);//错误 Derived 遮住了base中的f1
d.f2();// 没问题
d.f3();//没问题
d.f3(x)//错误 遮住了base中f3
解决方法: 使用using 声明达成目标
在Derived中加入声明
using base::f1;
using base::f3;
则上述中错误的可以正常访问
总结:为了让被遮蔽的名称重见天日,可以使用using 声明式
条款34 区分接口继承和实现继承
接口可以直接认为是声明,而继承就是实现。
条款35:考虑virtual以外的选择
// Template Method模式 通过public中的non-virtual函数调用private 的virtual函数
class Game{
public:
int healthvalue() const
{
...
int ret = dohealth();
...
return retval;
}
private:
virtual int dohealth() const
{
...
}
};
Strategy设计模式可以替换virtual函数。
条款36 绝不重新定义继承而来的non-virtual函数
条款37 绝不重新定义继承而来的缺省参数值
virtua函数是动态绑定,而缺省参数值确实静态绑定。
条款38 通过复合塑模出has-a(有一个)或 根据某物实现出
条款39 明智而慎重的使用private继承
条款40 明智而慎重的使用多重继承