C++关键字const
# 一、常变量
- 声明方式:const 变量类型 变量名,或 变量类型 const 变量名;
- 该变量需要在声明时被初始化,后续不允许再被直接改变;
- const 修饰的是变量,即变量不可被改变;
- 示例:
const int a; // 编译错误,需要初始化
const int b = 1; // 正确
int const c = 2; // 正确
b = 3; // 错误,不允许改变常量的值
1
2
3
4
2
3
4
# 二、常引用
- 声明方式:const 变量类型 &变量名,或 变量类型 const &变量名;
- 该引用需要在声明时被初始化,后续不允许再被直接改变;
- const 修饰的是引用,即引用不可被改变;
- 示例:
int a = 1; // 正确
const int &b; // 编译错误,需要初始化
const int &c = a; // 正确
int const &d = a; // 正确
b = c; // 错误,不允许改变常引用的值
1
2
3
4
5
2
3
4
5
# 三、常指针
- 声明方式:const 变量类型 *变量名,或 变量类型 const *变量名;
- 该指针的值是其指向变量的地址,可以被改变,所以不需要在声明时被初始化,但该指针指向的值不允许被改变;
- const 修饰的是该指针指向的变量,而不是该指针的值;
- 示例:
int a = 1; // 正确
const int *b = &a; // 正确
int const *c = &a; // 正确
const int *d; // 正确,不需要在创建时初始化
d = &a; // 正确,允许改变指针变量的值
*d = 3; // 错误,不允许改变指针指向的值
1
2
3
4
5
6
2
3
4
5
6
# 四、指针常量
- 声明方式:变量类型 *const 变量名;
- 该指针的值不可以被改变,需要在声明时被初始化,但该指针指向的值允许被改变;
- const 修饰的是该指针的值,而不是该指针指向的值;
- 示例:
int a = 1; // 正确
int *const b = &a; // 正确
int *const c; // 错误,需要再声明的时候初始化
*b = 2; // 正确,允许改变指针指向的值
// 左边const修饰指针指向的值,右边const修饰指针的值
const int *const d = &a; // 正确
d = &b; // 错误,指针的值不允许被改变
*d = 3; // 错误,指针指向的值不允许被改变
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 五、常对象
- 被 const 修饰的对象称为常对象,等同于上述的常变量,只不过变量类型是自定义的类型,而非内置类型;
- 常对象只能访问 const 成员函数,而非 const 对象可以访问任意的成员函数,包括const成员函数;
- 常对象在其初始化后不能被修改,其成员变量也自动成为常量;
- 常对象的成员是不能被直接修改的,不过可以通过指针操作去修改(不建议);
点击查看
class myClass
{
private:
int data;
public:
myClass(){};
~myClass(){};
int get() const
{
return data;
}
int get_data()
{
return data;
};
};
int main(int argc, char **argv)
{
const myClass m;
int a = m.get(); // 正确,常对象调用常成员函数
int b = m.get_data(); // 错误,常对象调用非常成员函数
myClass n;
int c = n.get(); // 正确,普通对象可以调用常成员函数
int d = n.get_data(); // 正确,普通对象可以调用非常成员函数
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 六、常成员函数
- 常成员函数不可以修改对象的数据,不管对象是否具有const性质,编译时以是否修改成员数据为依据进行检查;
- const 修饰的是该成员函数,该函数对成员变量不能有写的操作;
class myClass
{
private:
int data;
public:
myClass(){};
~myClass(){};
void set(int d) const
{
data = d; // 错误,常成员函数不能修改成员变量
};
int get() const
{
return data; // 正确,常成员函数进行只读操作
}
int get_data()
{
return data;
};
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
常成员函数(const member function):类中的成员函数被声明为 const
成员函数后,表示该函数不会修改对象的状态。
在常对象或常引用对象上只能调用常成员函数,而不能调用非常成员函数。
# 七、总结
- 常变量和常引用用于声明不可修改的对象或引用;
- 常指针,指针指向的值不可被修改;
- 指针常量,指针本身的值不可被修改;
- 常对象,整个对象都是常量,其成员变量也是常量,只能调用常成员函数;
- 常成员函数,表示该函数不会修改对象的成员变量;
编辑 (opens new window)
上次更新: 2024/09/24, 14:39:25