1、数据类型修饰符
C++ 数据类型修饰符包括signed
,unsigned
,long
,short
。修饰符 signed
、unsigned
、long
和 short
可应用于整型, signed
和 unsigned
可应用于字符型, long
可应用于双精度型。修饰符 signed
和 unsigned
也可以作为 long
或 short
修饰符的前缀。
修饰符 | 描述 |
---|---|
signed | 默认情况下,整数类型(如 int )通常是有符号的,表示可以存储正数、负数和零。 signed 修饰符显式地声明数据类型为有符号。 |
unsigned | unsigned 修饰符用于声明数据类型为无符号,仅存储非负整数。 适用于 int 、char 、short 等类型。 |
short | short 修饰符用于减少整数的存储大小。通常用于 short int 或直接 short 。 |
long | long 修饰符用于增加整数的存储大小。适用于 long int 、long long int 等类型。 |
const | const 修饰符用于声明不可修改的变量。 |
volatile | volatile 修饰符用于告诉编译器该变量可能会在程序中以意外方式改变, 因此不应对其进行优化。 |
mutable | 仅适用于类成员变量, 用于指示即使在 const 对象中也可以修改的变量。 |
例如,
#include <iostream>
using namespace std;
int main() {
signed int signedVar = -10;
unsigned int unsignedVar = 10;
cout << "Signed int: " << signedVar << endl;
cout << "Unsigned int: " << unsignedVar << endl;
short int shortVar = 32767;
cout << "Short int: " << shortVar << endl;
long int longVar = 2147483647;
long long int longLongVar = 9223372036854775807;
cout << "Long int: " << longVar << endl;
cout << "Long long int: " << longLongVar << endl;
const int constVar = 100;
// constVar = 200; // 编译错误,constVar 为常量,不能修改
cout << "Const int: " << constVar << endl;
volatile int volatileVar = 10;
cout << "Volatile int: " << volatileVar << endl;
return 0;
}
2、C++ 数据类型限定符
类型限定符为标识符提供两个属性之一。 const
类型限定符将对象声明为不可修改。 volatile
类型限定符声明了一个项,此项的值可以被超出此项所在程序的控制范围的某个项(如并发执行的线程)以合法方式更改。
const
、restrict
和 volatile
这几个类型限定符只能在声明中出现一次。 类型限定符可与任何类型说明符一起出现;但是,它们不能在多项声明中的第一个逗号的后面出现。 以下声明是合法的,
数据类型限定符用于限定变量的使用方式,提供更强的类型检查。常见的限定符有 const
、volatile
、mutable
、constexpr
和 restrict
(C++20引入了 constinit
和 consteval
)。
限定符 | 说明 |
---|---|
const | 表示常量,值不可修改 |
volatile | 表示变量可能被其他程序或硬件更改, 编译器不会优化对该变量的访问 |
mutable | 允许在 const 成员函数中修改该变量,仅对类成员变量有效 |
constexpr | 表示编译时常量,编译时即可确定值 |
restrict | 表示指针在其生命周期内是唯一指向对象的方式, 主要用于优化(C++11 引入) |
constinit | 表示常量初始化的变量, 只能在文件作用域或静态本地变量中使用(C++20) |
consteval | 表示必须在编译期求值的常量表达式函数(C++20) |
例如,
#include <iostream>
using namespace std;
class Test {
public:
mutable int mutableVar;
const int constVar;
constexpr static int constexprVar = 10;
Test(int val) : constVar(val), mutableVar(0) {}
void modify() const {
mutableVar++; // 可在 const 函数中修改
// constVar++; // 错误,无法修改 const 变量
}
};
constexpr int square(int x) {
return x * x; // 编译时计算
}
int main() {
const int x = 5;
volatile int y = 10;
Test test(5);
test.modify();
constexpr int result = square(5);
cout << "const x: " << x << endl;
cout << "volatile y: " << y << endl;
cout << "Test mutableVar after modify: " << test.mutableVar << endl;
cout << "constexpr result: " << result << endl;
return 0;
}
使用场景:
限定符 | 用途描述 |
---|---|
const | 用于定义不可更改的常量, 例如配置参数、数学常量等 |
volatile | 用于变量值可能被硬件 或多线程环境中的其他代码改变时, 例如硬件寄存器 |
mutable | 在类的 const 成员函数中修改某些数据,例如日志计数器 |
constexpr | 用于编译期计算的常量表达式, 帮助提高效率 |
restrict | 用于指针优化, 通常在性能关键的代码中使用, 例如多维数组操作 |
constinit | 用于保证变量在编译期内确定初始化, 仅限文件作用域或静态本地变量 |
consteval | 用于保证函数在编译期求值, 适用于常量表达式函数 |