C++中,类型修饰符(Modifiers)是用于改变变量、函数、类等的默认行为或属性的关键字。在C++中扮演着至关重要的角色,有助于增强代码的可读性和可维护性,同时提供了更灵活和强大的编程能力。C++中的类型修饰符可以用来修饰基本数据类型,从而改变其表示范围、存储方式等。为我们提供了更精细地控制变量类型的能力。本文主要介绍C++ 类型修饰符。

1、数据类型修饰符

C++ 数据类型修饰符包括signedunsignedlongshort。修饰符 signedunsignedlongshort 可应用于整型, signedunsigned 可应用于字符型, long 可应用于双精度型。修饰符  signed 和  unsigned 也可以作为  long 或  short 修饰符的前缀。

修饰符描述
signed默认情况下,整数类型(如 int)通常是有符号的,
表示可以存储正数、负数和零。
signed 修饰符显式地声明数据类型为有符号。
unsignedunsigned 修饰符用于声明数据类型为无符号,
仅存储非负整数。
适用于 intcharshort 等类型。
shortshort 修饰符用于减少整数的存储大小。
通常用于 short int 或直接 short
longlong 修饰符用于增加整数的存储大小。
适用于 long intlong long int 等类型。
constconst 修饰符用于声明不可修改的变量。
volatilevolatile 修饰符用于告诉编译器该变量
可能会在程序中以意外方式改变,
因此不应对其进行优化。
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 类型限定符声明了一个项,此项的值可以被超出此项所在程序的控制范围的某个项(如并发执行的线程)以合法方式更改。

constrestrictvolatile 这几个类型限定符只能在声明中出现一次。 类型限定符可与任何类型说明符一起出现;但是,它们不能在多项声明中的第一个逗号的后面出现。 以下声明是合法的,

数据类型限定符用于限定变量的使用方式,提供更强的类型检查。常见的限定符有 constvolatilemutableconstexprrestrict(C++20引入了 constinitconsteval)。

限定符说明
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用于保证函数在编译期求值,
适用于常量表达式函数

推荐文档