解释const的各种用法是 C++面试中的一个经典问题⚙️。const在 C++中是一个非常有用的关键字🔑,它的基本用法是限制一个变量不被修改🔒。const可以在多个地方使用,包括变量、指针、函数和类的成员函数。下面是一些实际的示例👇。
const变量必须在声明时初始化,并且其值不能被修改。
const int a = 10; // a 不能被修改
可以将任意变量标记为const,包括全局变量和类中的数据成员🌍。
对于const数据成员,它们必须在构造函数的初始化列表中初始化🏗️。
const可以用于指针和指针所指向的数据。它可以有三种组合:
int x = 10;
const int *p1 = &x; // 指针所指向的数据是 const ,不能通过 p1 修改 x
int *const p2 = &x; // 指针本身是 const ,不能修改 p2 指向的地址,但可以修改 x
const int *const p3 = &x; // 指针和指针所指向的数据都是 const ,不能修改 p3 和 x
尽管此语法初看起来有些复杂,但实际上存在一个简单的规则:const关键字作用于其直接左侧的内容(如果左侧为空,则作用于最近的右侧内容)🔍。例如,const int *p1中的const作用于int,表示指针所指向的数据是const,不能被修改。int *const p2中的const作用于*,表示指针本身是const,不能被修改。
在类中,const可以用于修饰成员函数,表示该函数不会修改类的任何成员变量。
class MyClass {
private:
int x;
public:
MyClass(int val) : x(val) {}
int getValue() const { return x; } // const 成员函数,不会修改 x
void setValue(int val) { x = val; } // 非 const 成员函数,可以修改 x
};
注意,const成员函数,不能够修改任何成员变量(除非成员变量被mutable修饰符修饰),也不能调用任何非const成员函数🚫。
对于const对象,只能调用const成员函数,不能调用非const成员函数。例如,下面的代码会报错:
int main() {
const MyClass obj(10);
obj.setValue(20); // 错误:不能调用非 const 成员函数
}
同时,const成员函数可以与其非const版本进行重载。在这种情况下,如果对象是const的,会调用const版本的函数;如果对象不是const的,会调用非const版本的函数。这为我们提供了一种在不同情况下执行不同操作的能力💡。
比如, std::vector类中就有const和非const版本的operator[]函数,它们分别用于读取和修改vector中的元素:
class vector {
public:
int& operator[](int index); // 非 const 版本
const int& operator[](int index) const; // const 版本
};
函数的参数也可以是const,通常使用const T&的形式,即const引用,既保护输入的对象不被函数修改,同时还可以避免复制对象的开销。这对于处理大型对象时特别有用🐘。
例如:
void printVector(const std::vector& vec) {
// 我们可以读取 vec 的信息,但不能修改 vec
for (int i = 0; i
在这个例子中,vec是一个const std::vector&,也就是一个指向std::vector对象的const引用。这意味着我们可以读取vec的信息(例如vec),但不能修改vec📖。
以上就是const在 C++中的一些常见用法。在实际编程中,const可以用来保护数据不被意外修改,提高代码的安全性和可读性🛡️。