C++关键字系列(二)——const 关键字

357 天前
 johnsmith2077

注意:本文包含 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可以用来保护数据不被意外修改,提高代码的安全性和可读性🛡️。

1330 次点击
所在节点    C++
2 条回复
buf1024
357 天前
如果一种语言语法过于复杂,语义容易出现歧义,那么尽早抛弃它为上策,除了维护尚存的代码外。
PendingOni
356 天前
C#中也是有 const 和 readonly
不过 const 一般只支持内置类型

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1006352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX