6.x - 小结与测试 - 作用域、持续时间和链接
章节小结
本章的介绍了很多内容。你做的很好!
- 复合语句或者语句块是一组0个或多个语句组成的集合,它们被编译器看做一个整体,就好像一个单一的语句一样。语句块从
{
符号开始,到}
符号结束,其中包含了所有的语句。在任何允许使用单一语句的地方,也都可以使用语句块。语句块的结束处不需要使用分号。语句块通常会和if语句一起使用。
- 命名空间指的是你为了自己的声明而创建的命名空间。由C++(全局命名空间)或标准库(
std
命名空间)提供的命名空间不属于用户自定义命名空间; - 我们可以通过作用域解析运算符(
::
)来访问命名空间中的声明。作用域解析运算符告诉编译器到运算符左操作数中去查找右操作数。如果不提供左操作数,则会使用全局作用域。
- 局部变量(6.3 - 局部变量)指的是定义在函数内部的变量(包括函数的形参)。局部变量具有语句块作用域,也就是说,它的作用域从变量定义开始,到语句块结束为止。局部变量具有自动存储持续时间,也就是说它在定义时被创建,在离开语句块时被销毁。
- 全局变量指的是定义在函数外部的变量。 全局变量具有文件作用域,这也就意味着它的可见范围从变量定义开始到文件结束为止。全局变量具有静态存储持续时间,也是说该变量会在程序开始时创建,程序结束时销毁。尽可能避免对静态变量的动态 初始化。
- 声明在嵌套语句块中的变量会对外层语句块中的同名变量形成变量遮蔽,变量遮蔽应当被避免。
6.6 - 内部链接 & 6.7 - 外部链接和变量前向声明
- 一个标识符的**链接属性,决定了该标识符的其他声明值得是否都是同一个对象。局部变量没有链接属性。具有内部链接属性的标识符可以在文件中被访问,但是不能在其他文件中被访问。具有外部链接属性的标识符则可以在定义它的文件或其他文件中可见或被访问(通过前向声明)。
6.8 - 为什么非 const 全局变量是魔鬼 && 6.9 - 使用 inline 变量共享全局常量
- 尽量避免使用非 const 类型的全局变量。const 全局变量通常是可以接受的。如果你的编译器支持C++17,请使用 inline 变量定义全局常量。
- 局部变量可以通过
static
关键字赋予其静态存储持续时间。
- 内联函数最初的设计目的是提供一种方法告诉编译器将函数调用进行内联展开,但我们并不应该出于该目的而使用
inline
关键字,因为编译器通常会为你做决定。在现代 C++ 中,inline
关键字用于将函数排除到单一定义规则(one-definition-rule)的限定之外,从而使其定义可以被导入到多个源文件中能够。内联函数通常被定义在头文件中,这样它们的定义就可以在#included
时被一同拷贝到源文件中。