c++知识要点

来源:互联网 发布:小知lol 编辑:程序博客网 时间:2024/05/21 19:43
  1. c++关键字

    • static
      • 静态成员
        在类的定义中,static关键字声明对应的成员不属于某个类实例,而属于类本身。
      • 非静态成员
        控制名称的两个独立的性质:存储周期和linkage
    • const
      • const限定符用来声明non-local、non-volatile的变量时,如果没有声明为extern,则变量有internal linkage。
  2. inline specifier
    完全在类、结构体、联合体重定义的函数,无论是成员函数或者非成员的友元函数,都隐式地是一个inline函数。inline函数或变量(since C++17)具有如下性质:

    • 程序中可能存在内联函数或者变量(since C++17)的多处定义,但是在不同的翻译单元中出现的定义需要都一样。
    • 内联函数或变量(since C++17)的定义,在访问的翻译单元内必须可见(在访问点处可见即可)。
  3. Storage class specifiers
    如下关键字控制名称的两个独立的性质:存储周期和linkage

    1. 关键字
      • 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。
    2. 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
        • 每次使用动态内存分配函数时,对象分配空间和销毁。
    3. Linkage
      用来代表对象、引用、函数、类型、模板、命名空间或者值的名称,可能会有链接。如果一个名称有链接,它和其他scope中相同的名称指向了同一个实体。如果相同名称的变量、函数或者其他的实体,在不同的scope中声明,但是没有足够的链接,那么会生成这个实体的多个实例。
      • no linkage:只能在其所在的scope中被引用的名称。例如局部变量。
      • internal linkage:在当前翻译单元中,可以被所有scope所引用的名称。例如声明为static的变量和函数。
      • external linkage:在其他翻译单元中可以被引用的名称。具有external linkage的名称也有language linkage,使得其可以连接不同语言编写的翻译单元。例如声明为extern的变量。
    4. Static local variables
      • 在block scope中,使用static定义的变量拥有静态存储周期,但是是在其第一次定义处初始化(除非它的初始化是zero- or constant-initialization,这些初始化可以在第一次进入block时进行)。以后所有的调用,声明都会被跳过。
      • 如果初始化时抛出异常,变量会被认为没有初始化,在下一次执行到变量声明时会再次尝试对变量进行初始化。
      • 如果初始化过程递归进入变量所在的block块,为UB。
      • 对于block scope的static变量,会在程序退出时候析构,前提是初始化正确执行。
      • 同一个inline函数的所有定义中的函数局部静态实例,在一个翻译单元中会指向同一个实例。
      • 如果多个线程试图同时对同一个静态局部变量进行初始化时,初始化只会发生一次。(since C++11)
  4. 类内变量初始化
    - static
    - non-static

  5. Scope
    http://en.cppreference.com/w/cpp/language/scope