1.常量变量
const
可以用于定义不可修改的变量。这样的变量在初始化后不能再被修改。
const int MAX_VALUE = 100;
MAX_VALUE = 200; // 错误:MAX_VALUE 是只读变量
当你尝试修改 const
变量时,编译器会报错。
2.常量指针和指针常量(这里非常容易混淆 须仔细思考辨别)
const
可以用来修饰指针和指向的数据,具体用法有以下几种:
如何快速辨别指针常量和常量指针
const
在*
之前:表示指向的数据是常量。const
在*
之后:表示指针本身是常量。
-
指针常量(指针本身可变,但不能修改它指向的数据):
const int *ptr;
int value = 10;
ptr = &value; // 合法
*ptr = 20; // 错误:ptr 指向的值是 const 的
ptr
可以指向不同的地址,但不能修改指向的数据内容。
-
常量指针(指针本身是常量,不能改变它指向的地址,但可以修改它指向的数据):
int value1 = 10;
int value2 = 20;
int *const ptr = &value1;
*ptr = 30; // 合法:可以修改 ptr 指向的数据
ptr = &value2; // 错误:ptr 是 const,不能改变指向
-
指向常量数据的常量指针(指针和它指向的数据都不可修改):
const int *const ptr = &value;
*ptr = 40; // 错误:不能修改 ptr 指向的数据
ptr = &value2; // 错误:ptr 也是 const 的,不能改变指向
3.常量引用
引用本身不能修改其绑定的对象,但可以修改其绑定对象的值,通过 const
引用,我们将无法修改它所引用的对象:const
引用禁止通过它修改被引用的对象,从而提供了数据保护。
int value = 10;
const int &ref = value;
ref = 20; // 错误:不能通过 const 引用修改值
其次const
引用还有个特别的用法,允许绑定临时对象(普通引用则不行);
const int &ref = 42; // 合法:可以绑定到临时对象
4.在类中的用法
在类中,const
可以用来修饰成员函数,表示这个函数不能修改对象的成员变量。
class MyClass {
public:
int getValue() const {
return value;
}
void setValue(int newValue) {
value = newValue;
}
private:
int value;
};
getValue
函数是const
的,不能修改MyClass
的任何成员变量。setValue
函数可以修改value
。
但也不是一定不能修改,当成员变量前声明了mutable关键字时,这个成员变量就可以在被const修饰的函数中修改,这里就不添加代码演示了,将上面代码中 int value改成 mutable int value即可,但是不推荐使用
使用const关键字实例化类对象后,被实例化的类对象只能调用类中的常量成员函数,且被初始化后不可被修改,常量成员函数可以被重载,普通实例化对象优先调用普通成员函数 ,初始化后可随意修改
class Test {
public:
Test(int id_, int age_) {
this->id = id_;
this->age = age_;
}
void show() {
std::cout << this->id << std::endl;
std::cout << this->age << std::endl;
}
void show()const {
std::cout << this->id << std::endl;
std::cout << this->age << std::endl;
}
public:
int id;
int age;
};
void test()
{
const Test test01(123, 345);
test01.id=666;//错误,被初始化后不能再修改
test01.show();//调用且只能调用常量成员函数
Test test02(123,456);
test02.id = 111;//可以随意修改
test02.show();//优先调用普通成员函数
}
5.常量参数
对于按值传递的常量参数:const
对于按值传递的参数没有实际意义,因为传递的是参数的副本。
void foo(const int value) {
// value 是一个本地副本,不能修改
}
对于按引用或指针传递的常量参数:const
可以防止函数修改传入的对象或数据。
void foo(const std::string &str) {
// 不能修改 str
}
使用 const
引用作为参数有助于避免复制大对象,提高效率。
6.常量返回值
函数可以返回 const
值,防止调用者修改返回值。例如:
const std::string& getName() const {
return name;
}
总结
const
在 C++ 中用来表示不变性,可以增强代码的安全性和清晰度。- 理解
const
的作用及其在不同上下文中的使用,对于编写更高质量的 C++ 代码至关重要。 - 常量成员函数、常量参数和常量返回值是常见的
const
使用场景,有助于防止意外修改对象或数据