1 让自己习惯C++
~~~~~~~~~~~~~~~~
1.1 尽量以const,enum,inline替换#define
=========================================
1. 用宏写出的函数,最好用template inline函数代替
1.2 尽可能用const
==================
1. 如果关键字const出现在*左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量
2. const iterator就像声明指针为const一样(T* const),表示这个迭代器不得指向不同的东西,但它所指的东西的值可以改变.
如果希望迭代器所指的东西不可变动(模拟const T*),需要从const_iterator
3. 令函数返回一个const值,可以防止对返回值进行赋值
4. 两个成员函数如果只是常量性不同,可以被重载
- class A
- {
- public:
- char str[100];
- char& tb(int i){return str[i];}
- const char& tb(int i) const {return str[i];}
- }
5. 编译器强制实现bitwise constness,但编写程序时应该使用概念上的常量性(conceptual constness).
这时可以用mutable关键字释放掉non-static成员变量的bitwise constness约束
6. 当const和non-const成员函数实质上等价的实现时,可以令non-const版本函数调用const版本函数,而不能反过来.(因为承诺不改动对象的const函数调用可能改动对象的non-const函数,是错误的)
- class A
- {
- public:
- char str[100];
- const char& tb(int i) const {return str[i];}
- char& tb(int i)
- {
- return const_cast<char&>( //将const函数的返回值const移除
- static_cast<const TextBlock&>(*this) //为*this加上const,强迫调用的是const版本的函数
- .tb(i); //调用tb方法
- }
- }
1.3 确定对象被使用前已经先被初始化
===================================
1. 如果某编译单元内的某个non-local static对象的初始化动作用到了另一个编译单元的某个non-local static对象,它所用到的这个对象可能尚未初始化,因为C++对定义于不同编译单元内部的non-local static对象的初始化次序无明确定义.
可以将non-local static对象搬到一个函数内成为local static对象,并让该函数返回一个reference指向该对象(类似与Singleton模式),这样就能保证对象初始化了