C++ const
在 C++ 中,const
是一个非常重要的关键字,用于声明常量或限制变量的修改权限,它可以提高代码的可读性、安全性和优化潜力。
1. 声明常量
const
可以将变量声明为常量,一旦初始化后就不能被修改。
const int MAX_SIZE = 100; // 常量,必须初始化
MAX_SIZE = 200; // 错误:不能修改 const 变量
常量必须在声明时初始化,且之后无法修改,编译器会检查并阻止任何修改尝试。
2. 修饰指针
const
与指针结合时,根据位置不同有不同含义:
const int* p
:指针指向的内容是常量,不能通过指针修改内容,但指针本身可以指向其他地址。int* const p
:指针本身是常量,不能指向其他地址,但可以通过指针修改所指内容。const int* const p
:指针本身和指向的内容都是常量,均不可修改。
int a = 10, b = 20;const int* p1 = &a;
*p1 = 30; // 错误:不能修改指向的内容
p1 = &b; // 正确:指针可以指向其他地址int* const p2 = &a;
*p2 = 30; // 正确:可以修改指向的内容
p2 = &b; // 错误:指针不能指向其他地址const int* const p3 = &a;
*p3 = 30; // 错误
p3 = &b; // 错误
3. 修饰函数参数
const
修饰函数参数时,表示参数在函数内部不会被修改,提高安全性。
// 不能修改 str 的内容
void printString(const std::string& str) {str = "new"; // 错误:const 参数不可修改std::cout << str << std::endl;
}
对于自定义类型(如类对象),通常使用 const&
(常量引用)传递参数,避免拷贝开销的同时防止修改。
4. 修饰函数返回值
const
修饰函数返回值时,限制返回值的修改权限。
// 返回常量整数,不能作为左值
const int getValue() {return 100;
}int main() {getValue() = 200; // 错误:返回值是 const,不能赋值return 0;
}
对于返回指针的函数,const
可以限制不能通过返回的指针修改内容:
const int* getArray() {static int arr[] = {1, 2, 3};return arr;
}int main() {const int* p = getArray();*p = 10; // 错误:不能修改返回的 const 内容return 0;
}
5. 修饰类的成员函数
在类中,const
放在成员函数的参数列表后,表示该函数不会修改类的任何成员变量(mutable
修饰的变量除外)。
class MyClass {
private:int value;
public:MyClass(int v) : value(v) {}// const 成员函数,不能修改成员变量int getValue() const {value = 100; // 错误:不能修改成员变量return value;}// 非 const 成员函数,可以修改成员变量void setValue(int v) {value = v;}
};
const
成员函数可以被 const
对象调用,而非 const
成员函数不行:
const MyClass obj(5);
obj.getValue(); // 正确:const 对象可以调用 const 成员函数
obj.setValue(10); // 错误:const 对象不能调用非 const 成员函数
6. 修饰类的成员变量
const
修饰类的成员变量时,必须在构造函数的初始化列表中初始化,不能在函数体内赋值。
class MyClass {
private:const int MAX_VALUE; // const 成员变量
public:// 必须在初始化列表中初始化MyClass(int max) : MAX_VALUE(max) {}
};
总结
const
的核心作用是保护数据不被意外修改,合理使用可以:
- 避免程序中的逻辑错误(如误修改常量)。
- 让编译器进行更严格的检查,提高代码安全性。
- 帮助编译器进行优化,提升程序性能。
理解 const
的各种用法是掌握 C++ 的重要基础,尤其在指针和类的场景中需要特别注意其位置和含义。