const
和 volatile
是 C/C++ 的两个关键字,各有不同的用途和要点。
const
const
关键字用于声明常量,一旦声明为常量,其值就不能被修改。const
可以用于各种数据类型,也包括指针、函数参数、函数返回值和类成员函数。
-
声明常量:声明为
const
的常量,在初始化后不能被修改。const int i = 123; // i 的值不能再被修改
-
指针:
const
可以用于指针的声明,有两种主要用法:- 指向常量的指针(指针不能修改所指向的值):
int i = 0;
const int* p = &i; // p 指向的对象不能被修改 - 指针常量(指针的值不能修改):
int i = 0;
int* const p = &i; // p 的值不可被修改
- 指向常量的指针(指针不能修改所指向的值):
-
函数参数:使用
const
修饰函数参数,表明该参数在函数体内不会被修改。void foo(const int* x) { // x 指向的对象不可被修改 // ... }
-
函数返回值:使用
const
修饰函数返回值,主要用于引用或指针类型,表明返回的引用或指针指向的内容不会被修改。const int& bar() { static int x = 0; return x; // 返回的引用指向的内容不能被修改 }
-
类成员函数:在类成员函数声明后面加
const
,表明该函数不会修改类的任何成员变量(除了被声明为mutable
的成员)。class MyClass { public: int getValue() const { return value; // 不能修改类的任何非 mutable 成员变量 } private: int value; };
volatile
volatile
关键字用于告诉编译器,该变量的值可能会在编译器无法预料的情况下被改变,因此编译器在优化代码时,不应假设 volatile
变量的值在两次访问之间保持不变。这通常用于多线程编程、硬件访问或中断服务程序中。
- 多线程编程:在多线程环境中,一个线程可能正在修改一个变量,而另一个线程可能正在读取这个变量。将变量声明为
volatile
可以防止编译器对该变量的访问进行优化,从而确保每次访问都能获得最新的值。 - 硬件访问:在嵌入式系统或系统级编程中,某些内存地址可能映射到硬件设备的状态或控制寄存器。这些寄存器的值可能会在任何时候由硬件改变。将指向这些寄存器的指针或引用声明为
volatile
,可以确保程序在每次访问时都能读取到最新的值。 - 中断服务程序:在中断服务程序中,某些变量的值可能会在中断发生时被改变。将这些变量声明为
volatile
可以确保中断服务程序能够正确处理这些变量的值。
请注意,volatile
并不保证变量的原子性操作,因此在多线程环境中,仍然需要使用锁或其他同步机制来确保数据的一致性。在多线程环境中,volatile
更多是用来防止编译器优化的。
总的来说,const
和 volatile
在 C/C++ 中有着各自独特的用途。const
主要用于声明不可变的变量或函数,而 volatile
主要用于告诉编译器不要对特定变量的访问进行优化。
更进一步地,可参见如下详细介绍:
- const、volatile 不应重复
- 类型转换不应去掉 const、volatile 等属性
- const、volatile 限定指针类型的别名是可疑的
- const、volatile 不可限定引用
- const、volatile 限定类型时的位置应统一
- const、volatile 等关键字不应出现在基本类型名称的中间
- 非适当场景禁用 volatile
标签:const,变量,int,C++,修改,volatile,指针 From: https://www.cnblogs.com/lucky-bubble/p/18264403