LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

  • cplus

    • 内存相关

    • 面向对象

    • STL相关

    • 内置数据结构
    • 数据结构示例
    • go和c++对比
    • 关键字

      • static
      • const、volatile、mutable
        • const_cast、dynamic_cast
        • struct、class、union
        • new、delete
        • operator
        • c++20 range
    • leetcode

    • 存储技术

    • 分布式系统

    • 计算机网络

    • Linux操作系统

    • Redis

    • 其他

    • 笔记
    • cplus
    • 关键字
    lisheng
    2024-09-10
    目录

    const、volatile、mutable

    C++中的const、volatile和mutable关键字分别用于不同的编程场景,控制变量的属性和行为。理解这些关键字的用法对于编写高效、健壮的C++代码至关重要。以下是对每个关键字的详细解释。

    # 1. const 关键字

    const关键字用于表示常量,它可以用于修饰变量、函数参数、返回值和类成员,目的是确保数据在定义后不被修改。

    # 1.1 常量变量

    用于修饰变量,表示该变量在初始化后不能被修改。

    const int x = 10;
    x = 20;  // 错误:无法修改const变量
    
    1
    2

    # 1.2 指针和const

    const可以与指针结合使用,产生不同的含义:

    • 指向常量的指针:
    const int* ptr = &x;  // 指向常量的指针,不能通过指针修改指向的值
    *ptr = 20;  // 错误:不能通过指针修改常量值
    
    1
    2
    • 常量指针:
    int* const ptr = &x;  // 常量指针,指针本身不能改变,但可以通过指针修改指向的值
    ptr = &y;  // 错误:不能修改常量指针
    
    1
    2
    • 指向常量的常量指针:
    const int* const ptr = &x;  // 指向常量的常量指针,既不能改变指向的值,也不能改变指针本身
    
    1

    # 1.3 const成员函数

    const关键字可以修饰类的成员函数,表示该函数不会修改对象的状态。这样一个const成员函数可以在const对象上调用。

    class MyClass {
    public:
        int getValue() const { return value; }  // const成员函数
    private:
        int value = 10;
    };
    
    const MyClass obj;
    obj.getValue();  // 合法:可以调用const成员函数
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    # 1.4 const函数参数与返回值

    const可以用于修饰函数参数,确保参数在函数内部不会被修改。它还可以修饰返回值,防止返回的值被修改。

    void printValue(const int x) {
        // x不能被修改
    }
    
    const int* getValue() {
        static int value = 10;
        return &value;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8

    # 2. volatile 关键字

    volatile关键字告诉编译器变量的值可能在任何时候被外部因素修改(如硬件中断、并发线程),因此每次使用该变量时都应重新读取其值,而不是使用寄存器中的缓存值。

    volatile int flag = 0;
    
    void checkFlag() {
        while (flag == 0) {
            // 做一些事情
        }
    }
    
    1
    2
    3
    4
    5
    6
    7

    在上述代码中,即使编译器认为flag没有被修改,也不会优化掉对flag的检查。

    # 使用场景

    • 多线程编程:共享变量可能被多个线程修改。
    • 硬件访问:变量可能由硬件设备更新(如内存映射I/O)。

    # 3. mutable 关键字

    mutable关键字允许在const对象的上下文中修改类的某些成员变量。通常,用const修饰的成员函数不能修改对象的任何成员变量,但mutable关键字可以例外地允许某些成员变量被修改。

    # 用法示例

    class MyClass {
    public:
        void setValue(int val) const {
            value = val;  // 虽然setValue是const函数,但value是mutable的,可以修改
        }
    private:
        mutable int value = 0;
    };
    
    int main() {
        const MyClass obj;
        obj.setValue(10);  // 合法
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    # 使用场景

    • 缓存数据:如果某些数据是动态计算的,但又不改变对象的逻辑状态,可以使用mutable来缓存它们。
    • 记录日志或调试信息:在const函数中记录调试信息,可以使用mutable来允许修改日志数据结构。

    # 总结

    • const:用于定义不可修改的变量、函数参数、返回值和成员函数,确保数据不被意外修改。
    • volatile:用于告知编译器变量的值可能随时变化,禁止编译器对其进行优化。
    • mutable:允许在const上下文中修改特定的类成员变量,常用于需要缓存或调试信息的场景。
    编辑 (opens new window)
    上次更新: 2024/09/13, 11:59:12
    static
    const_cast、dynamic_cast

    ← static const_cast、dynamic_cast→

    最近更新
    01
    ceph分布式存储-对象存储(RGW)搭建
    10-27
    02
    ceph分布式存储-集群客户端连接
    10-27
    03
    ceph分布式存储-管理crushmap
    10-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式