嘘~ 正在从服务器偷取页面 . . .

C++语法 存储类说明符


C++语法 存储类说明符

存储类说明符用于定义 C++ 程序中变量/函数的范围(可见性)和生命周期。

关键字 含义
auto (C++11 前)这是默认的存储类说明符,通常可以省略不写。auto 指定的变量具有自动存储期,即它们的生命周期仅限于定义它们的块
extern 用于声明具有外部链接的变量或函数,它们可以在多个文件之间共享。详见 link
static 用于定义静态变量,表示该变量的作用域仅限于当前文件或当前函数内,不会被其他文件或函数访问。
mutable (C++11 起)表示类中的成员变量可以在 const 成员函数中被修改。
thread_local (C++11 起)用于定义具有线程局部存储期的变量,每个线程都有自己的独立副本。线程局部变量的生命周期与线程的生命周期相同。
register (C++17 前)用于定义寄存器变量,表示该变量被频繁使用,可以存储在CPU的寄存器中,以提高程序的运行效率。

实例:

#include <iostream>

// 全局变量,具有外部链接,默认存储类为extern
int globalVar;

void function() {
    // 局部变量,具有自动存储期,默认存储类为auto
    auto int localVar = 10;

    // 静态变量,具有静态存储期,生命周期贯穿整个程序
    static int staticVar = 20;

    const int constVar = 30; // const变量默认具有static存储期

    // 尝试修改const变量,编译错误
    // constVar = 40;

    // mutable成员变量,可以在const成员函数中修改
    class MyClass {
    public:
        mutable int mutableVar;

        void constMemberFunc() const {
            mutableVar = 50; // 允许修改mutable成员变量
        }
    };

    // 线程局部变量,每个线程有自己的独立副本
    thread_local int threadVar = 60;
}

int main() {
    extern int externalVar; // 声明具有外部链接的变量

    function();

    return 0;
}

补充1

auto 在 C++ 11 中亦可用于自动推断变量的类型。

而在 C++ 17 中 auto 不再作为存储类说明符,并引入了结构化绑定声明(Structured Binding Declaration)

如下

auto x = 100; // 自动推断(为 int 型)

queue< pair<int,int> > q; q.push({1, 2});
auto [u, v] = q.front(); // u = 1, v = 2

补充2

参考文献[3] 中将 register 和 static 同时划入了存储类说明符和类型限定符,容易产生误解。

类型限定符提供了变量的额外信息,用于在定义变量或函数时改变它们的默认行为的关键字。

限定符 含义
const const 定义常量,表示该变量的值不能被修改。
volatile 修饰符 volatile 告诉该变量的值可能会被程序以外的因素改变,如硬件或其他线程。
restrict 由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。
mutable mutable 表示类中的成员变量可以在 const 成员函数中被修改。

const 实例

const int NUM = 10; // 定义常量 NUM,其值不可修改
const int* ptr = &NUM; // 定义指向常量的指针,指针所指的值不可修改
int const* ptr2 = &NUM; // 和上面一行等价

volatile 实例

volatile int num = 20; // 定义变量 num,其值可能会在未知的时间被改变

mutable 实例

class Example {
public:
    int get_value() const {
        return value_; // const 关键字表示该成员函数不会修改对象中的数据成员
    }
    void set_value(int value) const {
        value_ = value; // mutable 关键字允许在 const 成员函数中修改成员变量
    }
private:
    mutable int value_;
};

参考文献

[1] https://www.runoob.com/cplusplus/cpp-storage-classes.html

[2] https://c-cpp.com/cpp/language/storage_duration.html

[3] https://www.runoob.com/cplusplus/cpp-modifier-types.html


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录