《Exceptional C++ Style》笔记.txt
1.std::vector有两种访问其元素的途径:at和[]。at提供下标越界检查,若越界抛出std::out_of_range异常;
operetor[]和内置数组一样没有越界检查但效率较高。
2.如果可能的话,使用const_iteraror; 用!=比较迭代器而不是<; 使用前缀--或++; 尽量用\n而不是endl;
尽量复用标准算法,如使用copy和for_each()代替手写循环。
3.sprintf:优点:符合标准、易用、高效没有额外内存分配;
缺点:长度不安全、类型不安全、不能在模板中使用。
snprintf:比前者安全一些,但要在缓冲区末尾手动添加'\0',以防被截断。
ostringstream:需要一个临时对象,将数据<<到该对象。易用性不如前者,但安全且支持模版。
boost::lexical_cast<>和boost::format是较好的选择。
但如果对性能敏感,就使用snprintf。不要再使用sprintf。
4.可以将一个标准库设施(如mem_fun)或一个语言特性(如指向成员函数的指针)可移植的运用到任何成员
函数上,但没法运用到标准库的成员变量上,因为这可能是不可靠的。
5.虚函数提供运行时多态,模板可以提供编译期多态。
6.new操作符的另一种作用:定位new(placement new),将对象T2放置到T1指针对象所指的
内存位置。以这种方式new出的对象通过显示调用其析构函数来销毁,而不是使用delete。如下:
tempate<class T1, class T2>
void construct(T1* p, T2& value)
{
new (p)T1(value);
}
7.export导出模板并不能像普通函数那样实现真正的分离式编译,也不能带来任何效率的提示。(截至目前VS2010、GCC仍不支持)
8.类成员变量尽量为私有的,保持良好的封装性。
9.尽量让接口成为非虚的。如果是公共的虚函数,那么每个虚函数需要提供两种不同的服务:
其一是为类的外部调用者实现细节;另一个是为派生类提供接口
10.只有当派生类需要调用基类中实现的虚函数时才将后者设为保护的。
11.基类的析构函数要么是公用虚函数,要么是保护的非虚函数。
12.避免写内联修饰符“inline”,除非性能测试显示有此需要,同样,auto、register 相当于空白。
13. 构造函数尽量用explicit修饰符,除非要做参数类型转换。
14. 在可行的情况下,尽量将泛型组件分成小部件;尽可能遵循单一职守原则;尽可能编写非成员非友元形式的函数;
浙公网安备 33010602011771号