[c++11]constexpr
const
const关键字用于声明常量或指示编译器变量不可修改。
声明常量:
使用const关键字可以声明常量,即变量的数值在初始化后不能被修改。
const int MAX_VALUE = 100;
保护数据:
将成员函数声明为const可以确保这些函数不会修改对象的状态。const成员函数可以在const对象上调用,但不能修改对象的成员变量。
class MyClass {
public:int getValue() const; // const成员函数
};
避免意外修改:
将函数参数声明为const可以避免意外修改参数的值。
void printValue(const int num); // 参数num为常量,不能在函数内部修改其值
防止指针修改:
指针前加const可将指针本身设为常量,防止指针修改指向的对象;
指针后加const可将指针指向的对象设为常量,防止修改对象。
const int* ptr; // 指向常量的指针,不能通过该指针修改所指向的值
int* const ptr = &value; // 常量指针,指针本身不可修改
const int* const ptr = &value; // 指向常量的常量指针,指针本身和指向的值都不能修改
constexpr
在C++中,constexpr是一个关键字,用于声明变量或函数为常量表达式。常量表达式指的就是由多个(≥1)常量(值不会改变)组成并且在编译过程中就得到计算结果的表达式。
使用constexpr可以将变量或函数声明为常量表达式,从而在编译时进行求值,并在运行时减少计算开销。在C++11及之后的标准中,constexpr被广泛用于定义常量、模板参数、数组大小等。
声明常量变量:
constexpr int constant = 42; // 声明一个常量
函数声明为常量表达式:
constexpr int square(int x) {return x * x;
}
使用constexpr修饰类成员函数:
class MyClass {
public:constexpr int getValue() const {return value;}private:int value = 10;
};
在数组大小中使用constexpr:
constexpr int size = 5;
int arr[size]; // 创建一个大小为5的数组
const和constexpr的区分:
表达“只读”语义的场景都使用 const
表达“常量”语义的场景都使用 constexpr
volatile关键字
C++ 中有一个volatile关键字,用于告诉编译器该变量可能会在意料之外被修改,因此编译器不应该对其进行优化
在多线程或嵌入式系统中,volatile 关键字通常用于声明那些可能被其他程序、硬件或操作系统更改的变量。
这样一来,编译器就不会对这些变量的访问进行优化,以确保每次都从内存中读取值,而不是依赖于寄存器中的缓存值。
volatile 主要有以下几个作用:
- 告诉编译器不要对变量进行优化,避免出现意料之外的行为。
- 在并发编程中确保对变量的访问是可见的,避免出现由于优化导致的问题。
- 用于与硬件交互的变量,如控制寄存器、中断服务程序等。
需要注意的是,volatile 主要用于标记变量可能随时被修改的情况,而不是用于解决线程同步问题。
在多线程编程中,应当使用更为专门的同步机制来确保线程安全性。