导读
声明揭示其签名式。
定义式是编译器为此对象分配内存地方。
初始化给予对象初值过程。
default构造函数要不是没有参数,要不每个参数都是缺省值。
explicit的构造函数比non-explicit更受欢迎,防止隐式类型转换。
class Widget
{
public:
Widget();
Widget(const Widget& rhs); //right hand side
Widget& operator=(const Widget& rhs);
//...
};
Widget w1;
Widget w2(w1);
w1=w2;
如果一个新对象被定义,则会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义,就不会有构造函数被调用,当然就是赋值操作被调用。
命名:指针 p, 应用 r, 成员函数 mf。
第一部分:习惯c++
条款1:c++ ,a federation of languages
exception,templates,STL
主要的次语言:
1.C。
2.object-oriented c++:构造函数,析构函数,封装,继承,多态,virtual函数(动态绑定)...
3.template c++:泛型编程
4.STL:是个template程序库,对容器,迭代器,算法,以及函数对象的规约有紧密配合与协调。
每个次语言都有自己的规约。
条款2:prefer consts,enums,and inlines to #defines.
宁可用编译器替换预处理器。
symbol table 记号表。
使用宏 #define ASPECT_RATIO 1.653 定义,可能不会进入记号表,不易调试。使用常量来解决,const double AspectRatio = 1.653;
对于单纯常量,最好以const对象或enums 替换#defines
对于形似函数的宏macros,最好改用inline替换#defines。
条款3:use const whenever possible
如果函数的返回值是个内置类型,则改动函数返回值不合法。
成员函数是const:
bitwise const :成员函数只有在不更改对象之任何成员变量时才可以说是const,即不更改对象内的任何一个bit。
条款26:延迟变量定义出现
应该延迟变量定义,直到使用该变量前,甚至应该延迟至可以给该变量赋初值。
string encrptPassword(const string& password)
{
...
string encrypted(password); //通过copy构造函数定义并初始化。
encrypt(encrypted);
return encrypted;
}
条款27:少做转型
1.old-style casts:
(T)expression
T(expression)
2.C++ style casets
const_cast<T>(expression)
dynamic_cast<T>(expression) :安全向下转型
reinterpret_cast<T>(expression):不可移植,结果取决于编译器
static_cast<T>(expression):强迫隐式转换
对象布局方式和它们的地址计算方式随编译器的不同而不同。
p122:
class Window
{
public:
virtual void blink(){}
};
class SpecialWindow:public Window
{
public:
virtual void blink()
{
//...
}
};
typedef std::vector<std::tr1::shared_ptr<Window> > VPW;
VPW winPtrs;
for (VPW::iterator iter=winPtrs.begin(); iter!=winPtrs.end();++iter)
{
(*iter)->blink();
}
成员函数返回references,指针,迭代器可以用来取得某个对象,降低对象封装性,应该避免。
条款29:异常安全