const与指针
我们知道被const修饰的变量表示常量,如const int a = 100; 表示a是一个值为100的常量,且不可改变。那么const修饰指针呢?
注意:
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)
如果 const 在 * 左侧,表示 const 修饰的是指针指向的变量
如果 const 在 * 右侧,表示 const 修饰的是指针
左变量,右指针
因此(1),(2)相同,都表示指针指向的变量是常量,钥匙可以变,但是通过该钥匙打开的仓库内的东西不能变(注意,通过其他钥匙是可以改变仓库内容的)。因此通过该指针指向的变量是不能改变的,即(*a)的内容不能变:
int b = 500;
const int* a = &b;
*a = 600; // 错误
b = 600; // 通过b改变而非*a改变,正确,此时*a也是600
a = &c; // 正确,可以让a指向另一个地址
情况(3) int* const a = &b; 表示指针本身是常量,但指针的内容可以改变。就是说钥匙不能变(只能指向该仓库),但是仓库内的东西可以变(a++错误,*a = 600正确)。对于情况3,定时的同时必须初始化。
int* const a; // 错误,定义时没有初始化
int* const a = &b; //正确
*a = 600; // 正确,可以修改内容
a++; // 错误
情况(4) const int* const a = &b; 表示指针指向的内容和指针都是常量,即钥匙和仓库内容都不能变。
const与成员函数
有一些成员函数,不改变类的数据成员,也就是说不改变别人,那么可以把这样的成员函数定义为const。如:
void Student::print() {
cout<<"this is student print method"<<endl;
}
为了使成员函数的意义更加清楚,可以在不改变他人的函数上,加上const修饰。
class Student {
...
void print() const;
...
};
// 在类外,也必须也定义成const
void Student::print() const {
cout<<"this is student print method"<<endl;
}
如果 被const修饰的函数,试图改变他人,则编译报错,你都是const修饰的函数了,还想改变别的数据成员,休想!!
const与#define
const与#define都能定义常量,但是const更好。
首先,const可以定义类型,比如我们可以写 const int a = 100; 但是#define就不能。
其次,编译器可以对const进行安全检查,而对#define只进行简单替换,没有类型的安全检查,可能存在隐藏的错误。
因此,推荐使用const。