条款54 TR1 和 条款55 Boost
TR1 即 Technical Report 1 是 C++ standard committee 推出C++“0x”(与此类似的还有C++“89”,即89年的C++标准版本,这里指200X年讲推出的新版本) 之前的 一份技术文档那个,我们可以从中发现一部分即将被实现和规范的内容
C++标准程序库 包含了 STL , iostreams,locales ,并包含了C99标准程序库。
TR1 添加了智能指针tr1::shared_ptr , 一般化函数指针 tr1::function hash-based容器,正则表达式以及另外10个组件的支持
TR1本身只是一份规范 ,Boost库是他的实作版本, 但是Boost并不仅限于此, 因为Boost本身是一个community ,所以他还在逐渐添加新的内容。
条款 2 尽量以const ,enum ,inline 置换 #define
关于常量的定义
#define PI 3.14
const int PI = 3.14
编译器在预编译的时候已经将PI替换为3.14, 所以当发生了任何错误的时候你在Debug或者Error list里能看到只是3.14 而不是PI , 如果恰巧这个#define 并不是你所写的,那这将使你非常苦恼。
str * const stringaaa = "aaa"
当常量做常量指针时,记住将指针声明为const。 当然也可以const str * const stringaaa = "aaa" 同时将所指向的值设为const
当常量做成员变量时
因为是常量,所以须声明为static 以致保留一份。
Class A
{
static const int PI ;
}
const int A::PI = 3.14;
编译器有时候会要求你写一个声明再写一个定义,因此可分开写。取决于编译器。
当#define 用于定义函数的时候。 #define COMPARE(a,b) f((a) > (b) ? a : b)
写这种宏时候你必须为所实参加上括号,否则会有意想不到的错误。//f 是一个被定义的函数
这样的写法同样和上述常量有同样的编译期问题,以及非常的难认。
所以可以用一个inline 函数代替
template<typename T>
inline T Compare (const T& a ,const T& b)
{
return f(a > b ? a : b);
}
这里inline可以告诉编译器尝试把函数放入寄存器中以提升效率。 const T& 以reference传递参数 省却了by value拷贝构造函数的开销。
结论, 避免使用#define可以在DEBUG阶段产生效果。但是对运行时的性能并不会产生影响。毕竟这只是一个预编译阶段就被干掉的东西。
条款3: 尽可能使用const
1.const 出现在星号的左边则说明被指物是常量,如果const出现在星号的右边则表示指针是常量
2.Iterator 迭代器 本身是一个指针, const Iteratort表示迭代器的指针地址不可改变,但是对象是可以变化的。
如果想保持对象也不能改变,应该使用const_iterator.
3.const 作为函数的返回类型的时候,当返回值为左值的时候往往能避免一些错误,比如 if( a*b = c ) 这里应该是 == 而不是 = ,*是一个被重载的操作符,如果返回值是const那么他就会报错。
4.两个只是constness不同的函数是可以被重载的
5.在一个const 的函数中 void fun() const 如果有一个变量声明为mutable, : mutable int count ;则表明在这个const函数中这个变量是一个特例,是可以被更改的。
条款4: 确定对象使用以前已经被初始化