const限定符——CPP

const限定符

编译器会找到所有const对象,将常量值做替换。

作用域

  • 默认情况下,const只在本文件内有效,因为这样编译器在做替换时才能访问到初始值,因此每个文件都必须要有定义。而为了避免重命名,const对象只在本文件内有效;
  • 如果想要在多文件内共享变量,则用extern限定;

引用

1
2
3
4
5
6
7
8
const int a = 1024;
const int &b = a;//正确
b = 42;//错误,不能通过引用修改常量
int &c = a;//错误,不能将让非常量引用指向常量
double doub = 3.14;
const int &d = doub;//初始化时,允许将一个非常量做为初始值,此时绑定的是一个临时的常量,因此不允许非常量引用时强制转换;
//const int temp = b;
//const int &d = temp;

常量引用非常量,只是不能通过该常量去修改非常量的值;但如果有其他途径修改非常量的值也是可以的。

指针

  • 要想存放常量的地址,只能使用指向常量的指针;
  • 但指向常量的指针不一定指向常量,跟引用一样,可以通过其它方式修改指向的值;
1
2
3
4
int errNum = 0;
int *const curErr = &errNum;//常量指针,将一直指向errNum
const double pi = 3.14;
const double *const pip = π//指向常量对象的常量指针

函数中使用const

函数参数

1
2
3
4
void func(const int var);//无意义,传过来的参数不可以改变,但var本身就是实参;
void func(const int* var);//参数指针所指的内容;
void func(int *const var);//无意义,传过来的指针不可变,同1
void func(const Class& Var); //引用参数在函数内不可以改变,通常情况下,这种用法避免建立副本,在提高效率的同时禁止对引用对象修改;

函数返回值

1
2
3
const int fun1();//无意义
const int *fun2() //调用时 const int *pValue = fun2();
int* const fun3() //调用时 int * const pValue = fun2();

跟参数的用法基本相同,除了重载运算符,其它情况下不建议将返回值设为const,因为这样对象就不能对成员进行赋值操作;