C/C++ 不常用关键字/说明符汇总

本文提及的内容并不都是关键字。关键字不能作为符号名称使用,但部分说明符可以。例如,override 是 C++ 的说明符,用于显式地标记函数重载,但与关键字不同之处在于 override 可以作为符号名称使用:

int override = 100;

final

final 说明符将类的虚成员函数标记为不可重载,或将一个类标记为不可派生。

class Base {
public:
    virtual void foo() final;
};

class Derived {
public:
    virtual void foo() override; // Declaration of foo overrides a final function
};
class Base final {

};

class Derived : public Base { // Base is marked final

};

mutable

mutable 说明符允许在 const 成员函数中修改成员变量。

class Foo {
    mutable int value;
public:
    void setValue(int v) const {
        value = v; // ok
    }
};

struct Bar {
    mutable int count;
};

const Bar b{0};
b.count++; // ok

restrict

restrict 关键字是 C99 引入的一个类型限定符,表示指针所指向的数据只能通过该指针访问。这有助于编译器进行优化,因为它可以假设没有其他指针会修改该数据。需要指出的是,C++ 中没有 restrict 关键字,但在主流编译器平台均提供了相应的扩展,如 MSVC 中的 __restrict 和 GCC/Clang 中的 __restrict__

在这个意义上,可以说 C++ 在语法上并不是 C 的超集。

memcpy 函数是一个典型的使用 restrict 关键字的函数。该函数要求 srcdest 指针所指向的内存区域不能重叠。

void memcpy(void* restrict dest, void const* restrict src, std::size_t n);

memcpy 相对的是 memmove 函数,该函数允许 srcdest 指针所指向的内存区域重叠。memmove 在执行复制操作时,需要额外的逻辑处理重叠情况,因此开销略高于 memcpy

void memmove(void* dest, void const* src, std::size_t n);