未经授权,禁止转载!创作不易,尊重原创!~~
const
const,顾名思义,就是常量,表示修饰的目标不能被改变。这些目标主要包括变量,指针,函数,类。下面针对这四个目标对象进行不同的说明。
场景1: 修饰变量
const修饰变量,不论是放在数据类型前还是放在数据类型后,都表示一个意思,该变量是一个常量。
const T variable_name;
T const variable_name;
场景2: 修饰指针
const修饰指针有两种情况,分别对应于const在指针的两侧:
case | code | 意义 |
---|---|---|
const在指针的左侧 | const T* ptr = … | 表示指针指向一个常量,指针可以其他的常量 |
const在指针的右侧 | T* const =… | 表示指针是一个常量,只能指向某一个固定的变量 |
NOTE:
一个普通的指针不能指向一个常量的地址。因为普通的指针可以修改指针指向的值。如下例中的ptr2不能指向常量const_a的地址。
void constPtr() {
int var_a = 1;
const int const_a = 2;
int var_b = 3;
const int const_b = 4;
// case 1:
int* ptr0 = &var_a;
const int* ptr1 = &var_a;
//int* ptr2 = &const_a; // not ok
const int* ptr3 = &const_a;
ptr3 = &const_b;
// case 2:
int* const ptr4 = &var_a;
// ptr4 = &var_b; // not ok
const int* const ptr5 = &var_a;
}
场景3: 修饰函数
case | 意义 |
---|---|
void function_name(const int a){} | 没有实际意义,因为a是一个传值参数。函数执行完就不存在了 |
void function_name(const int* ptr_a){} | 表示不允许函数function_name修改ptr_a指向的值 |
void function_name(const int& a) {} | 表示不允许函数function_name修改a |
场景4: 修饰类成员
const可以修饰类成员变量,也可以修饰类成员函数。
修饰类成员变量
- 该类成员变量只能在构造函数的初始化列表中进行初始化。
- 虽然可以在成员变量的地方直接进行赋值(c++11后支持这个骚操作),不建议。理由是类本身起一个描述某一数据类型的作用,不占用内存,只在实例化的时候占用内存。如果在变量定义的地方进行初始化,就很奇怪,你品,你细品。
修饰类成员函数
case | 意义 |
---|---|
const void func_name() {…} | 不允许外界修改该函数的返回值 |
void func_name() const {…} | 不允许函数func_name修改类中的成员变量 |