1.const与指针
const修饰指针一般有一下4种情况
int b = 500;
const int* a = &b; //(1)
int const *a = &b; //(2)
int* const a = &b; //(3)
const int * const a = &b; //(4)
情况1和2,const都在*的左边,const用来修饰指针所指的变量,即指针指向为常量,不能通过指针修改常量的值。
情况3,const在*的右边,const用来修饰指针,即指针本身就是常量,不能对指针进行更改操作,但是可以通过指针修改指向内容的值。另外,情况3必须初始化。
情况4,指针及其指向的内容都是常量,也必须初始化。
综上:const在*左边就是修饰指针指向的内容;const在*右边修饰的就是指针本身,即为常量指针,常量指针必须初始化。
2.const修饰成员函数
用const修饰的成员函数不能改变类数据对象,这样既能提高程序的可读性,又能提高程序的可靠性。要是想在const修饰的成员函数中修改类数据对象,就要定义数据成员的时候加上mutable关键字。
#include <iostream>
using namespace std;
class A {
public:
A(int i): test(i) {}
int incr() const {
return ++test;
}
private:
mutable int test;
};
int main() {
A a(10);
cout << a.incr() << endl;
return 0;
}
输出结果是11,而如果去掉mutable关键字会报错。
3.const与#define
(1)const常量有数据类型,宏没有;编译器可以对const常量进行类型安全检查,宏则是简单的字符替换,没有类型检查。
(2)一些集成化的调试工具可以对const常量进行调试,而宏常量不行。