c++关键字
- static
- 静态成员
在类的定义中,static关键字声明对应的成员不属于某个类实例,而属于类本身。 - 非静态成员
控制名称的两个独立的性质:存储周期和linkage
- 静态成员
- const
- const限定符用来声明non-local、non-volatile的变量时,如果没有声明为extern,则变量有internal linkage。
- static
inline specifier
完全在类、结构体、联合体重定义的函数,无论是成员函数或者非成员的友元函数,都隐式地是一个inline函数。inline函数或变量(since C++17)具有如下性质:- 程序中可能存在内联函数或者变量(since C++17)的多处定义,但是在不同的翻译单元中出现的定义需要都一样。
- 内联函数或变量(since C++17)的定义,在访问的翻译单元内必须可见(在访问点处可见即可)。
Storage class specifiers
如下关键字控制名称的两个独立的性质:存储周期和linkage- 关键字
- static:
- static or thread storage duration and internal linkage
- static只允许出现在对象声明(除了函数参数列表)、函数声明(除了在块作用域中)、无名union的声明中。
- 当在类成员变量的声明中使用static时,它声明了静态成员。
- 当在对象的声明中使用static时,它表明对象具有静态存储周期(static storage duration)(除了和thread_local一起使用时)。
- 当在命名空间的定义中使用时,表明具有internal linkage。
- extern
- static or thread storage duration and external linkage
- extern只允许出现在变量和函数(除了类成员或者函数的参数)的声明中。
- 它表明了外部链接性(external linkage),并不影响存储周期,但是由于其不能在具有automatic存储周期对象的定义中使用,因而所有的extern对象都有static or thread durations。
- 使用extern声明的变量,没有初始化,变量是没有定义的。
- auto(until C++11)
- automatic storage duration。
- register(until C++17)
- automatic storage duration。
- thread_local (since C++11)
- thread storage duration。
- static:
- Storage duration
- automatic storage duration
- 对象在代码块开始时分配空间,在代码块结束时销毁。
- 除了声明具有static、extern 或者thread_local存储周期的变量外,都有automatic storage duration
- static storage duration
- 对象在程序开始时分配空间,在程序结束时销毁。
- 只有一个对象的实例存在。
- 在命名空间(包括全局命名空间)中声明的对象、使用static或extern声明的对象都有此存储周期
- thread storage duration(since C++11)
- 对象在线程开始时分配空间,在线程结束时销毁。
- 每个线程中,都有一个属于线程的对象的实例。
- 只有声明为thread_local的对象有此存储周期。
- thread_local可以和static或extern一起出现。
- dynamic storage duration
- 每次使用动态内存分配函数时,对象分配空间和销毁。
- automatic storage duration
- Linkage
用来代表对象、引用、函数、类型、模板、命名空间或者值的名称,可能会有链接。如果一个名称有链接,它和其他scope中相同的名称指向了同一个实体。如果相同名称的变量、函数或者其他的实体,在不同的scope中声明,但是没有足够的链接,那么会生成这个实体的多个实例。
- no linkage:只能在其所在的scope中被引用的名称。例如局部变量。
- internal linkage:在当前翻译单元中,可以被所有scope所引用的名称。例如声明为static的变量和函数。
- external linkage:在其他翻译单元中可以被引用的名称。具有external linkage的名称也有language linkage,使得其可以连接不同语言编写的翻译单元。例如声明为extern的变量。
- Static local variables
- 在block scope中,使用static定义的变量拥有静态存储周期,但是是在其第一次定义处初始化(除非它的初始化是zero- or constant-initialization,这些初始化可以在第一次进入block时进行)。以后所有的调用,声明都会被跳过。
- 如果初始化时抛出异常,变量会被认为没有初始化,在下一次执行到变量声明时会再次尝试对变量进行初始化。
- 如果初始化过程递归进入变量所在的block块,为UB。
- 对于block scope的static变量,会在程序退出时候析构,前提是初始化正确执行。
- 同一个inline函数的所有定义中的函数局部静态实例,在一个翻译单元中会指向同一个实例。
- 如果多个线程试图同时对同一个静态局部变量进行初始化时,初始化只会发生一次。(since C++11)
- 关键字
类内变量初始化
- static
- non-static- Scope
http://en.cppreference.com/w/cpp/language/scope
c++知识要点
最新推荐文章于 2024-05-28 15:57:24 发布