C++ 利器-const
const 与宏定义
C语言里面经常会用到define 关键字,包括linux 内核代码。大量的使用define,而c++里面确提到,尽量能够用const 替换define,为什么?
首先看一下以下的两个扛把子
#define VALUE 5
const int value = 5;
都知道,define 关键字的处理是在编译四大步骤(预处理->编译->汇编->链接)中的第一步
define 关键字是在预处理中进行处理,但是define 定义的变量不一定会加入到"符号表当中",而编译器是在编译的时候是对常量是在符号表当中进行查找,有可能会造成定义的"某个变量"在编译阶段存在问题,特别是如果该变量不是在自己的头文件定义而是引用别人的某个文件就出问题就更麻瓜了。。。。。。。。
- const 关键字使用比较灵活
- 可以修饰在class之外的全局变量,或者某个namespace中
- 可以修饰在某个函数或者函数参数中
- 可以修饰class 内部的staic 和non-static成员变量
- 可以修饰指针const(const 修饰指针一般比较迷惑人:const 出现在*的左边标识被指的是常量,出现*右边标识指针自身为常量,*两边都有const就指针和被指的对象都是常量)
const char *text1 = array; // const data non-const pointer
char* const text2 = array; // const pointer non-const data
const char *const text3 = array; // const pointer const data
const 和函数结合
const 和函数结合是用得比较广泛的
- const 成员函数
- 在类里面定义const 成员函数,是确保该成员函数能够作用在对象上面:
- 1.能够知道那个函数能够改动对象内容,那个函数不能修改对象内容
- 2.可以提高效率(c++推荐的引用传递)
- 3.如果两个成员函数只是常量性不同,可以被重载
const char& operator[](int pos) const;
char& operator[](int pos);
const char& TestEffective::operator[](const int pos) const
{
return buf[pos];
}
char& TestEffective::operator[](int pos)
{
return buf[pos];
}