在C++中,const
是一个非常重要的关键字,用于定义常量或限制变量、函数、指针等的修改行为。它的主要作用是增强代码的安全性和可读性。以下是关于 const
的详细复习:
1. const
的基本用法
const
用于定义常量,表示一个值在初始化后不能被修改。
语法:
const 数据类型 变量名 = 初始值;
示例:
const int x = 10; // x 是一个常量,值不能修改
x = 20; // 错误:x 是常量,不能修改
2. const
修饰指针
const
可以用于修饰指针,具体有以下几种形式:
(1) 指向常量的指针(指针指向的值不能修改)
const int* ptr = &x; // ptr 是一个指向常量的指针
*ptr = 20; // 错误:不能通过 ptr 修改 x 的值
(2) 常量指针(指针本身的值不能修改)
int y = 30;
int* const ptr2 = &y; // ptr2 是一个常量指针
ptr2 = &x; // 错误:ptr2 的指向不能修改
*ptr2 = 40; // 正确:可以通过 ptr2 修改 y 的值
(3) 指向常量的常量指针(指针和指向的值都不能修改)
const int* const ptr3 = &x; // ptr3 是一个指向常量的常量指针
ptr3 = &y; // 错误:ptr3 的指向不能修改
*ptr3 = 50; // 错误:不能通过 ptr3 修改 x 的值
3. const
修饰引用
const
可以用于修饰引用,表示引用的值不能修改。
示例:
int a = 10;
const int& ref = a; // ref 是一个常量引用
ref = 20; // 错误:不能通过 ref 修改 a 的值
a = 20; // 正确:可以直接修改 a 的值
4. const
修饰函数参数
const
可以用于修饰函数参数,表示参数在函数内部不能被修改。
示例:
void printValue(const int value) {
// value = 30; // 错误:value 是常量,不能修改
std::cout << value << std::endl;
}
5. const
修饰成员函数
const
可以用于修饰类的成员函数,表示该函数不会修改类的成员变量。
示例:
class MyClass {
public:
int getValue() const { // const 成员函数
// value = 20; // 错误:不能修改成员变量
return value;
}
private:
int value = 10;
};
6. const
修饰返回值
const
可以用于修饰函数的返回值,表示返回值是常量,不能修改。
示例:
const int getConstantValue() {
return 100;
}
int main() {
const int result = getConstantValue();
// result = 200; // 错误:result 是常量,不能修改
return 0;
}
7. const
的优势
-
安全性:防止意外修改常量值。
-
可读性:明确标识出哪些值或函数不会修改状态。
-
优化:编译器可以对
const
变量进行优化。
8. const
的注意事项
-
const
变量必须在定义时初始化。 -
const
可以用于任何数据类型(基本类型、类、指针、引用等)。 -
const
成员函数不能调用非const
成员函数(除非使用mutable
修饰的成员变量)。
9. 示例代码
#include <iostream>
class MyClass {
public:
MyClass(int val) : value(val) {}
int getValue() const {
return value;
}
void setValue(int val) {
value = val;
}
private:
int value;
};
void printValue(const int& val) {
std::cout << "Value: " << val << std::endl;
}
总结
-
const
是 C++ 中用于定义常量的关键字,可以修饰变量、指针、引用、函数参数、成员函数等。 -
合理使用
const
可以提高代码的安全性和可读性。 -
const
和constexpr
的区别在于const
的值可以在运行时确定,而constexpr
的值必须在编译时确定。