C++中常见的限定符|说明符

59 篇文章 0 订阅
52 篇文章 1 订阅

目录

摘要

1. 存储类型说明符(Storage Class Specifiers)

- auto

- register

- static

- extern

- mutable

2. 访问说明符(Access Specifiers)

- public

- protected

- private

3. 类型限定符(Type Qualifiers)

- const

- volatile

- restrict

4. 函数说明符(Function Specifiers)

- inline

- virtual

- explicit

5. 其他说明符

- friend

- typedef

- using

总结


摘要

在 C++ 中,specifiers(限定符或说明符)是用于修饰变量、函数、类等各种程序元素的关键字。常用的 specifiers 包括存储类型说明符、访问说明符、类型限定符等。我们将简单介绍有哪些常见的 specifiers,后续我会针对某些限定符再进行详细介绍,比如const,friend

1. 存储类型说明符(Storage Class Specifiers)

存储类型说明符用于指定变量的存储方式和生存期。

- auto

`auto` 说明符用于让编译器自动推导变量的类型。

auto x = 5;  // 编译器推导出 x 是 int 类型
auto y = 3.14; // 编译器推导出 y 是 double 类型

- register

建议编译器将变量存储在寄存器中,而不是 RAM 中(现代编译器可能会忽略这个)。

register int count = 0;

- static

a. 局部静态变量:函数内部的静态变量在函数调用之间保留其值。
b. 静态成员变量:类中的静态成员变量在所有对象之间共享。

void func() {
    static int counter = 0;
    counter++;
    std::cout << "Counter: " << counter << std::endl;
}

class MyClass {
public:
    static int s_value;
};

int MyClass::s_value = 0; // 定义静态成员变量

- extern

声明一个变量或函数在另一个文件中定义,提示编译器该变量或函数的定义在其他地方,比如另外的C++文件或C文件中。

extern int count;
void func();

int main() {
    func();
    std::cout << count << std::endl;
    return 0;
}

- mutable

允许在 const 成员函数中修改成员变量。

class MyClass {
public:
    void setValue(int v) const {
        value = v;
    }
private:
    mutable int value;
};

2. 访问说明符(Access Specifiers)

访问说明符控制类成员的访问权限。

- public

公有成员可以被任何代码访问。

class MyClass {
public:
    int publicVar;
};

- protected

受保护成员可以被类及其子类访问。

class Base {
protected:
    int protectedVar;
};

class Derived : public Base {
public:
    void setProtectedVar(int val) {
        protectedVar = val;
    }
};

- private

私有成员只能被类本身访问,不能被类的外部或其子类访问。

class MyClass {
private:
    int privateVar;
};

3. 类型限定符(Type Qualifiers)

类型限定符用于进一步限定变量的特性。

- const

表示变量的值不能被修改。

const int x = 10;

在函数中,`const` 可以用于成员函数,表示该函数不能修改对象的状态。

class MyClass {
public:
    void display() const {
        std::cout << value << std::endl;
    }
private:
    int value;
};

更多关于'const'关键字的内容 --> C++中的‘const‘关键字-CSDN博客

- volatile

提示编译器该变量可能被外部因素修改,编译器不要对该变量进行优化。

volatile int flag = 1;

- restrict

仅在 C99 中引入的指针限定符,提示编译器该指针是唯一访问其所指对象的指针,用于优化。

void updateValues(int *restrict ptr) {
    // 处理 ptr
}

4. 函数说明符(Function Specifiers)

函数说明符用于修饰函数的行为。

- inline

提示编译器将函数代码插入到每个调用点以减少函数调用开销。

inline void func() {
    std::cout << "Inline function" << std::endl;
}

- virtual

用于基类中声明虚函数,以便在派生类中进行重写。

class Base {
public:
    virtual void display() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        std::cout << "Derived class" << std::endl;
    }
};

- explicit

用于构造函数或转换函数,防止隐式转换。

class MyClass {
public:
    explicit MyClass(int x) {
        // 构造函数
    }
};

MyClass obj1 = 42; // 错误,不能隐式转换
MyClass obj2(42);  // 正确,显式转换

5. 其他说明符

- friend

允许另一个类或函数访问类的私有和保护成员。

class MyClass {
    friend void display(const MyClass& obj);
private:
    int value;
};

void display(const MyClass& obj) {
    std::cout << "Value: " << obj.value << std::endl;
}

更多关于'friend'关键字的内容 --> C++中的‘friend‘关键字-CSDN博客

- typedef

定义类型的别名。

typedef int Integer;
Integer x = 10;

- using

现代 C++ 中,用于定义类型的别名,通常代替 `typedef`。

using Integer = int;
Integer x = 10;

总结

1. 捕获变量的生命周期:在使用 `lambda` 捕获变量时,确保捕获的变量在 `lambda` 存在期间有效。
2. 虚函数和析构函数:如果类有虚函数,通常也应该声明虚析构函数,以确保正确的资源释放。
3. `const` 成员函数:确保成员函数不修改对象状态,以便在多线程环境中更安全地使用。
4. `mutable` 的使用:在 `const` 成员函数中修改成员变量时,慎用 `mutable`,确保其使用合理,否则很容易翻车。

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: C++11是C++标准的第11个版本,于2011年发布,引入了许多新特性和语言改进。下面是C++11的一些新特性: 1. 自动类型推导(auto) C++11新增了auto关键字,可以用来自动推导变量的类型,从而简化代码。例如: ```cpp auto i = 10; // i的类型为int auto d = 3.14; // d的类型为double ``` 2. 统一的初始化语法 C++11引入了统一的初始化语法,可以用一种方式来初始化任何类型的对象,包括内置类型、类类型和数组。例如: ```cpp int i{10}; // 使用大括号初始化int double d{3.14}; // 使用大括号初始化double std::string s{"hello"};// 使用大括号初始化std::string ``` 3. 委托构造函数 C++11新增了委托构造函数,可以在一个构造函数调用另一个构造函数,从而避免了代码重复。例如: ```cpp class Foo { public: Foo(int i) : Foo(i, 0) {} // 委托构造函数 Foo(int i, double d) : i_(i), d_(d) {} private: int i_; double d_; }; ``` 4. lambda表达式 C++11新增了lambda表达式,可以方便地定义匿名函数,从而更加灵活地处理函数对象。例如: ```cpp std::vector<int> v = {1, 2, 3, 4, 5}; std::for_each(v.begin(), v.end(), [](int i){ std::cout << i << " "; }); // 使用lambda表达式打印vector的元素 ``` 5. 默认函数 C++11新增了默认函数,可以为函数的参数和类的构造函数设置默认值,从而简化代码。例如: ```cpp void foo(int i = 0, double d = 0.0); // 默认函数 class Bar { public: Bar(int i = 0, double d = 0.0); // 默认构造函数 }; ``` 6. 移动语义 C++11引入了移动语义,可以将资源(如堆内存)从一个对象转移到另一个对象,从而避免了不必要的拷贝和销毁操作,提高了程序的效率。例如: ```cpp std::vector<int> v1 = {1, 2, 3, 4, 5}; std::vector<int> v2 = std::move(v1); // 使用移动语义将v1的元素转移到v2 ``` 7. 线程支持 C++11新增了线程支持库,可以方便地创建和管理多线程程序,从而提高程序的并发性能。例如: ```cpp #include <iostream> #include <thread> void hello() { std::cout << "Hello, world!" << std::endl; } int main() { std::thread t(hello); t.join(); return 0; } ``` 以上是C++11的一些新特性,这些新特性大大提高了C++的编程效率和程序性能。 ### 回答2: C语言11版是C语言的最新版本,在2011年发布。它引入了一些新的特性和改进,使得编写C语言程序更加方便和高效。 首先,C 11引入了一种叫做“_Thread_local”的关键字,可以用来声明线程本地存储。这使得在多线程编程,每个线程都可以有自己独立的变量,而不会被其他线程影响。 其次,C 11还引入了复合字面量。这意味着可以在一个表达式创建一个匿名的结构体、联合体或枚举类型,并直接使用它们,而不需要显式地在代码定义这些类型。 另外,C 11还提供了对泛型编程的支持,通过引入"_Generic"关键字,可以根据参数的类型在编译时选择不同的代码分支。这使得在C语言实现泛型算法变得更加容易。 此外,C 11还对语言的内存模型进行了一些改进。它引入了新的原子类型和操作,可以更方便地进行并发编程和线程同步。同时,C 11还为多线程编程提供了一套新的库,包括原子操作、线程本地存储和线程间同步等功能。 最后,C 11还对语言的标准库进行了一些改进。它引入了一些新的函数和头文件,例如对多线程编程的支持,以及一些新的数学函数等。 总之,C 11版本通过引入新的特性和改进,使得C语言在多线程编程和泛型编程方面更加强大和方便。这些改进使得C语言成为了一种更加现代和高效的编程语言。 ### 回答3: C语言的11个新特性有: 1. 波浪句法:在函数调用可以使用波浪符号(~)来表示可变参数列表,简化了函数的定义和调用。 2. 布尔类型:引入了_Bool类型,可以表示真(true)和假(false)两个值,提供了更直观的布尔运算方式。 3. 引入了_Static_assert断言:可以在编译时进行静态断言检查,帮助发现一些显而易见的错误。 4. 对齐规范:引入了_Alignas和_Alignof关键字,用于指定变量的内存对齐方式,提高了数据访问的效率。 5. 内置预处理器:引入了_Static_assert断言和_Generic泛型选择器两个预处理器,提供了更强大的编译时能力。 6. 多字符常量:可以使用多个字符组成一个整数类型的常量,增加了对一些特殊字符的支持。 7. 增加了宽字符特性:引入了wchar_t类型和相关的宽字符函数,用于处理Unicode字符和多字节字符集。 8. 增加了数字常量的二进制表示法:可以使用0b或0B前缀来表示二进制数,方便程序员直接使用二进制数进行位运算。 9. 引入了包含括号的限定符:在声明语句可以使用__attribute__((__packed__))和__attribute__((__aligned__))关键字来指定结构体或变量的对齐方式。 10. 增加了_Static_assert的能力:在静态断言可以输出错误信息,帮助程序员更好地定位代码问题。 11. 增加了_Generic的能力:泛型选择器可以根据不同的类型选择对应的代码进行编译,提高了代码的灵活性和可重用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉夢志昂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值