V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
johnsmith2077
V2EX  ›  C++

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

  •  1
     
  •   johnsmith2077 · 329 天前 · 1306 次点击
    这是一个创建于 329 天前的主题,其中的信息可能已经有所发展或是发生改变。

    注意:本文包含 AI 生成内容 🤖

    解释const的各种用法是 C++面试中的一个经典问题⚙️。const在 C++中是一个非常有用的关键字🔑,它的基本用法是限制一个变量不被修改🔒。const可以在多个地方使用,包括变量、指针、函数和类的成员函数。下面是一些实际的示例👇。

    • const 变量🔢

    const变量必须在声明时初始化,并且其值不能被修改。

    const int a = 10; // a 不能被修改
    

    可以将任意变量标记为const,包括全局变量和类中的数据成员🌍。

    对于const数据成员,它们必须在构造函数的初始化列表中初始化🏗️。

    • const 指针👉

    const可以用于指针和指针所指向的数据。它可以有三种组合:

    • 指针本身是 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 成员函数📚

    在类中,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,通常使用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可以用来保护数据不被意外修改,提高代码的安全性和可读性🛡️。

    2 条回复    2024-01-06 18:37:08 +08:00
    buf1024
        1
    buf1024  
       329 天前
    如果一种语言语法过于复杂,语义容易出现歧义,那么尽早抛弃它为上策,除了维护尚存的代码外。
    PendingOni
        2
    PendingOni  
       329 天前
    C#中也是有 const 和 readonly
    不过 const 一般只支持内置类型
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2344 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:54 · PVG 09:54 · LAX 17:54 · JFK 20:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.