修饰符const总结
1. 定义常量的两种方式:const和#define
尽量使用const方式定义常量,#define使用宏定义方式,不会在编译期进行,很难排错
1 | #define PI 3.14159; //编译前预处理过程进行处理,很难排错 |
2. const为了防止变量被修改,因此必须初始化
1 | const int i= get size();//正确:运行时初始化 |
3. const原理是在编译时把变量替换成数字,因此const对象只在文件内有效
如果我们想让这类 const对象像其他(非常量)对象一样工作,也就是说,只在一个文件定义 const,而在其他多个文件中声明并使用它。解决的办法是,对于 const变量不管是声明还是定义都添加 extern关键字,这样只需定义一次就可以了:(C++primer P54).
1 | //file1.cc定义并初始化了一个常量,该常量能被其他文件访问 |
fi1e1.h头文件中的声明也由 extern做了限定,其作用是指明 bufsize并非本文件所独有,它的定义将在别处出现。
4. const和指针
const和指针一起用时,容易搞不清到底是指向常量的指针(常量指针),还是指针本身是常量(指针常量)。
1 | /* |
一个方法是从右往左读,例一中离p1最近的是*,说明这是一个指针。左侧的const int表明这个指针指向一个常量的整型对象。因此,p1是一个指向整型常量的指针(常量指针)。
例二中离p2最近的是const,说明p2这个变量本身是常量,并且p2的变量类型由声明符确定。左侧的int*表明了p2的类型是整型指针。因此,p2是一个指向整型的指针,并且这个指针是常量(指针常量)。
此外,还可以首先看const左侧判断修饰的对象,如果左侧没有再看右侧。
5. 引用和const
类似于指针,也有引用常量和常量引用。但由于引用本身不能修改,因此引用常量等价于普通的引用。
1 | int a = 10; |
6. const修饰函数
const修饰函数,根据const从左到右的位置,可以分别修饰函数返回值 、函数形参和this对象
const修饰函数返回值
1
const char* GetString(void);
如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。(值传递将返回值复制到另外一个存储单元)const修饰参数
1
2//防止f函数改变参数的值,实际上const是修饰this指向的对象的
char* GetString(const string str);const修饰this对象,此时函数叫做常成员函数
1
2
3//const修饰函数,防止函数f改变this指向的对象
char* GetString(void) const;