C++ const详解
被const修饰符所修饰的数据类型其值是不可改变的,从而提高程序的可靠性和安全性。
修饰变量
C++是编译型语言,所以当程序进行编译时,编译器会检查程序是否满足各种约束,const就相当于一个约束,它表明其变量值不能被改变,如果在const变量初始化之后再进行操作,编译器会报错
const int a = 5;//accept ,进行初始化
a = 6;//error,不能给常量赋值
根据其这个特性,例如,在项目编写的时候,两个函数需要两个人进行编写,需要传递参数,但是出于安全考虑,并不知道对方是否会改变这些变量,如果不希望这种事情发生,可以使用const引用,既不会重新创建临时变量,而且不用担心其他人改变了你的变量值。
例子
void foo(const int &b) {
b = 5;//error,无法改变const 变量值
}
int main() {
int a = 5;
foo(a);
system("pause");
return 0;
}
const修饰指针
修饰指针的时候也是不可变,但是const相对位置会影响所修饰的部分。
例子
int c = 3;
const int* a;//const修饰*a,说明a地址中的值是无法改变的
int* const b = &c;//const修饰b,说明b指针指向的地址是无法改变的
*a = 5;//accept
a = &t;//error
b = &t;//error
*b = 5;//accept
很多面试题会考应聘者const int* a和int* const a的区别,前者const修饰的是*a,所以*a,后者const修饰的是a,是一个指针,所以指针指向的地址无法改变。
那const int* a和int const *a呢,其实是一样的,都是修饰*a。
死记硬背通常无效,当理解以后忘掉也没有关系,因为再次学习的时候便很快了
类中const使用
当成员变量被const修饰时,不能马上接初始化,只能在构造函数的初始化列表中进行
class A
{
public:
A(int size) : SIZE(size) {};
private:
const int SIZE;
};
其他需要注意的地方和普通变量一样
当const修饰成员函数的时候,它不能修改所有成员变量的值,因此它也不能调用非const的成员函数
class A {
void func() const;
};
void A::func() const{
}
需要注意的地方,函数的声明和定义都需要const修饰,这一点和static不一样。
有关于staitc,会在以后的博客中给出