首页 > 编程语言 >C/C++ const 和 volatile 关键字要点总结

C/C++ const 和 volatile 关键字要点总结

时间:2024-06-24 09:57:45浏览次数:25  
标签:const 变量 int C++ 修改 volatile 指针

const 和 volatile 是 C/C++ 的两个关键字,各有不同的用途和要点。

const

const 关键字用于声明常量,一旦声明为常量,其值就不能被修改。const 可以用于各种数据类型,也包括指针、函数参数、函数返回值和类成员函数。

  1. 声明常量:声明为 const 的常量,在初始化后不能被修改。

    const int i = 123;  // i 的值不能再被修改
  1. 指针const 可以用于指针的声明,有两种主要用法:

    • 指向常量的指针(指针不能修改所指向的值):
      int i = 0;
      const int* p = &i; // p 指向的对象不能被修改
    • 指针常量(指针的值不能修改):
      int i = 0;
      int* const p = &i; // p 的值不可被修改
  1. 函数参数:使用 const 修饰函数参数,表明该参数在函数体内不会被修改。

    void foo(const int* x) {  // x 指向的对象不可被修改
        // ...  
    }
  1. 函数返回值:使用 const 修饰函数返回值,主要用于引用或指针类型,表明返回的引用或指针指向的内容不会被修改。

    const int& bar() {  
        static int x = 0;  
        return x; // 返回的引用指向的内容不能被修改  
    }
  1. 类成员函数:在类成员函数声明后面加 const,表明该函数不会修改类的任何成员变量(除了被声明为 mutable 的成员)。

    class MyClass {  
    public:  
        int getValue() const {  
            return value; // 不能修改类的任何非 mutable 成员变量  
        }  
    private:  
        int value;  
    };

volatile

volatile 关键字用于告诉编译器,该变量的值可能会在编译器无法预料的情况下被改变,因此编译器在优化代码时,不应假设 volatile 变量的值在两次访问之间保持不变。这通常用于多线程编程、硬件访问或中断服务程序中。

  1. 多线程编程:在多线程环境中,一个线程可能正在修改一个变量,而另一个线程可能正在读取这个变量。将变量声明为 volatile 可以防止编译器对该变量的访问进行优化,从而确保每次访问都能获得最新的值。
  2. 硬件访问:在嵌入式系统或系统级编程中,某些内存地址可能映射到硬件设备的状态或控制寄存器。这些寄存器的值可能会在任何时候由硬件改变。将指向这些寄存器的指针或引用声明为 volatile,可以确保程序在每次访问时都能读取到最新的值。
  3. 中断服务程序:在中断服务程序中,某些变量的值可能会在中断发生时被改变。将这些变量声明为 volatile 可以确保中断服务程序能够正确处理这些变量的值。

请注意,volatile 并不保证变量的原子性操作,因此在多线程环境中,仍然需要使用锁或其他同步机制来确保数据的一致性。在多线程环境中,volatile 更多是用来防止编译器优化的。

总的来说,const 和 volatile 在 C/C++ 中有着各自独特的用途。const 主要用于声明不可变的变量或函数,而 volatile 主要用于告诉编译器不要对特定变量的访问进行优化。

更进一步地,可参见如下详细介绍:

  1. const、volatile 不应重复
  2. 类型转换不应去掉 const、volatile 等属性
  3. const、volatile 限定指针类型的别名是可疑的
  4. const、volatile 不可限定引用
  5. const、volatile 限定类型时的位置应统一
  6. const、volatile 等关键字不应出现在基本类型名称的中间
  7. 非适当场景禁用 volatile

 

标签:const,变量,int,C++,修改,volatile,指针
From: https://www.cnblogs.com/lucky-bubble/p/18264403

相关文章