Effective C++ 条款1~4

条款1:认知C++
C++扩展templates exceptions overloading virtual inheritance containers iterators
视C++为一个语言联邦包含了许多语言的特性

条款2: 替换define
define缺点:所定义的变量在预处理器中加以替换,可能会导致object code出现多次。

一.const常量
将const常量放入head文件以便被其他源文件访问来替换define
1.const修饰指针基础
const T* t;
T const* t;
T* const t;
const T* const t;
2.class专属常量
classconst成员变量能不能被static修饰?static修饰的目的?
static const int num=5; //static保证此变量最多只有一份实体
注:旧式编译器不支持staic修饰成员类内初始化   解决:P21

二.enum hack作为变量的记号标记
三.inline
对于单纯的常量使用const对象或者enums替换define
形似函数的宏使用inline函数替换#defines  注意形参的passed by reference-to-const

条款3: 尽可能使用const
use const whenever possible

1.const global或者namespace常量
2.class 内部static no-static的常量。思考static const常量的作用?
3.const指针
4.const返回值 == 不允许返回值对象被再次改变 P19
5.const成员函数
const对象只能调用const成员函数
const char& operator[](std::size_t position)const{
    return text[position]
}
//函数声明最后加上const意味着是cons成员函数
//返回值是 passed by reference-to-const
//mutable 关键字修饰class变量可以被const成员函数操作,从而不被局限于const变量
6.no-const成员函数
class TextBlock{
public:
    const char& operator[](std::size_t position)const{
        //dosomething
        return text[position];
    }

    char& operator[](std::size_t position){
        return const_cast<char&>(
                static_cast<const TextBlock&>(*this)
                    [position]);
    }
//目的: no-const成员函数调用其const兄弟成员函数,避免代码重复
//思考两次转型的原因?如何避免递归调用自身operator[]?
//1.*this转换从原始类型到const TextBlock&  2.返回值从const char& 移除const
static_cast(obj)转为const常量。 
const_cast(obj)移除const属性

条款4. 确定对象使用前已经被初始化
原则:
内置类型 例如int ,*P 需要在使用前初始化 。其他情况交给构造函数完成。
区别 赋值和初始化,使用构造函数的 member initialization list完成初始化
其他模块的对象使用了no local static对象,如何确保初始的顺序? P33

你可能感兴趣的:(C++设计模式)