Skip to content

6.x - 小结与测试 - 作用域、持续时间和链接

章节小结

本章的介绍了很多内容。你做的很好!

6.1 - 复合语句(语句块)

  • 复合语句或者语句块是一组0个或多个语句组成的集合,它们被编译器看做一个整体,就好像一个单一的语句一样。语句块从 { 符号开始,到 } 符号结束,其中包含了所有的语句。在任何允许使用单一语句的地方,也都可以使用语句块。语句块的结束处不需要使用分号。语句块通常会和if语句一起使用。

6.2 - 用户定义命名空间和作用域解析运算符

  • 命名空间指的是你为了自己的声明而创建的命名空间。由C++(全局命名空间)或标准库(std命名空间)提供的命名空间不属于用户自定义命名空间;
  • 我们可以通过作用域解析运算符(::)来访问命名空间中的声明。作用域解析运算符告诉编译器到运算符左操作数中去查找右操作数。如果不提供左操作数,则会使用全局作用域。

6.3 - 局部变量

  • 局部变量6.3 - 局部变量)指的是定义在函数内部的变量(包括函数的形参)。局部变量具有语句块作用域,也就是说,它的作用域从变量定义开始,到语句块结束为止。局部变量具有自动存储持续时间,也就是说它在定义时被创建,在离开语句块时被销毁。

6.4 - 全局变量

  • 全局变量指的是定义在函数外部的变量。 全局变量具有文件作用域,这也就意味着它的可见范围从变量定义开始到文件结束为止。全局变量具有静态存储持续时间,也是说该变量会在程序开始时创建,程序结束时销毁。尽可能避免对静态变量的动态 初始化。

6.5 - 变量遮蔽

  • 声明在嵌套语句块中的变量会对外层语句块中的同名变量形成变量遮蔽,变量遮蔽应当被避免。

6.6 - 内部链接 & 6.7 - 外部链接和变量前向声明

  • 一个标识符的**链接属性,决定了该标识符的其他声明值得是否都是同一个对象。局部变量没有链接属性。具有内部链接属性的标识符可以在文件中被访问,但是不能在其他文件中被访问。具有外部链接属性的标识符则可以在定义它的文件或其他文件中可见或被访问(通过前向声明)。

6.8 - 为什么非 const 全局变量是魔鬼 && 6.9 - 使用 inline 变量共享全局常量

  • 尽量避免使用非 const 类型的全局变量。const 全局变量通常是可以接受的。如果你的编译器支持C++17,请使用 inline 变量定义全局常量。

6.10 - 静态局部变量

6.12 - using 声明和 using 指令

  • using 语句包括 using声明using指令,使用它可以避免使用限定标识符,但是我们应该避免这样做。

6.13 - 内联函数

  • 内联函数最初的设计目的是提供一种方法告诉编译器将函数调用进行内联展开,但我们并不应该出于该目的而使用 inline 关键字,因为编译器通常会为你做决定。在现代 C++ 中,inline 关键字用于将函数排除到单一定义规则(one-definition-rule)的限定之外,从而使其定义可以被导入到多个源文件中能够。内联函数通常被定义在头文件中,这样它们的定义就可以在 #included时被一同拷贝到源文件中。

6.14 - Constexpr 和 consteval 函数

  • constexpr 函数的返回值可能会在编译时求值。使用 constexpr 关键字可以将函数定义为 constexpr 类型。constexpr 函数有资格进行编译时求值,而如果它的返回值被使用在需要常量的上下文中时,则一定会进行编译时求值。其他情况下,编译器则可以自由选择是在编译时还是运行时对函数进行求值。
  • C++20 引入了新的关键字 consteval,它可以要求函数必须进行编译时求值,否则就会产生编译报错。这种函数称为即时函数

6.15 - 未命名和内联命名空间

6.11 - 作用域和链接小结