您的位置:首页 > 编程语言 > C语言/C++

c++知识要点

2017-08-15 17:29 162 查看
c++关键字

static

静态成员

在类的定义中,static关键字声明对应的成员不属于某个类实例,而属于类本身。

非静态成员

控制名称的两个独立的性质:存储周期和linkage

const

const限定符用来声明non-local、non-volatile的变量时,如果没有声明为extern,则变量有internal linkage。

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。

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

每次使用动态内存分配函数时,对象分配空间和销毁。

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++