注意:本文包含 AI 生成内容 🤖
解释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<int>& vec) {
// 我们可以读取 vec 的信息,但不能修改 vec
for (int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << " ";
}
// 下面的代码将会导致编译错误
// vec.push_back(42);
}
在这个例子中,vec
是一个const std::vector<int>&
,也就是一个指向std::vector<int>
对象的const
引用。这意味着我们可以读取vec
的信息(例如vec[i]
),但不能修改vec
📖。
以上就是const
在 C++中的一些常见用法。在实际编程中,const
可以用来保护数据不被意外修改,提高代码的安全性和可读性🛡️。
1
buf1024 356 天前
如果一种语言语法过于复杂,语义容易出现歧义,那么尽早抛弃它为上策,除了维护尚存的代码外。
|
2
PendingOni 356 天前
C#中也是有 const 和 readonly
不过 const 一般只支持内置类型 |