前言
本文为Effective C++ 读书笔记
一、注意事项
1、**class 的专属常量**class GamePlayer{
private:
static const int NumTurns = 5;
int scores[NumTurns];
...
};
上面NumTurns为声明式而非定义式。通常C++要求你对你使用的任何东西提供一个定义式,但是如果它是class专属常量又是static且为整数,只要不取其地址就不用提供定义式。但是如果要取某个class的专属常量的地址,就需要提供定义式如下:
const int GamePlayer::NumTurns;
声明时有初始值,定义就不用了,这句放进实现文件,而非头文件。
2、注意:enum hack的行为某方面比较像#define 而不像 const。例如取一个const的地址是合法的。但是取一个enum地址就不合法,取#define地址通常也不合法。
3、记住:对于单纯常量,最好以const对象或enums替换#define
对于行似函数的宏,最好改用inline函数替代。
4、常量指针与指向常量的指针
char greeting[] = "Hello";
const char* p = greeting; //non-const pointer ,const data
char* const p = greeting; //const pointer,non-const data
const char* const p = greeting; //const pointer,const data
快速识别方法:如果关键字const出现在 * 左边,表示被指物是常量;如果 * 出现在const右边,表示指针自身是常量。如果出现在两边,表示被指物和指针两都是常量。
注意:以下两种写法意义相同
void f1(const Widget* pw);
void f2(widget const *pw);
注意:定义迭代器中指向常量的指针使用const_iterator
5、区分左值和右值
左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或者对象。
右值:表达式结束后就不在存在的临时对象,不可以取地址,没有名字
比如 int a = b + c;,a 就是一个左值,可以对a取地址,而b+c 就是一个右值,对表达式b+c 取地址会报错。C++11中右值又由两个概念组成:将亡值和纯右值。