一点拙见
第一章:让自己习惯C++
条款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.总是在初值列中列出所有成员变量
第二章:构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数
1.default析构是non-virtual,除非基类声明有virtual析构
2.C++不允许让reference改指向不同对象,这在拷贝构造时要尤为注意,编译器也不会为此生成default构造,const也一样,base class将copy assignment操作符声明为private,编译器拒绝为其derived class生成一个copy assignment操作符
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
1.不想拷贝,又怕编译器默认拷贝被使用,可声明一个private的拷贝而不实现,但有member或friend函数调用风险
2.或声明一个基类,将拷贝声明为private,并继承,这样即使member或friend函数调用,其基类会阻值这一行为
条款07:为多态基类声明virtual析构函数
1.没有virtual析构,当derived class对象经由一个base class指针被删除,base部分被删除,而derived部分没被删除
2.不作为base class就不要声明virtual析构,只有当class内含至少一个virtual函数,才为它声明virtual析构
3.不要试图继承一个标准容器或其他带有non-virtual析构的class,比如string类型(non-virtual析构)
4.pure virtual析构需要一份定义
条款08:别让异常逃离析构函数
1.终究是设计模式的问题
条款09:绝不在构造和析构过程中调用virtual函数
1.在base class 构造期间,virtual 函数不是 virtual 函数。
打字好累,不想更了。。。