C++:范围
简介
当你声明一个程序元素(例如类、函数或变量)时,它的名称只能 “查看”,并在程序的某些部分中使用。 名称在其中可见的上下文称为 " 作用域"。 例如,如果在函数内声明变量 x , x 则仅在函数体中可见。 它具有 本地范围。 你的程序中可能存在同名的其他变量;只要它们在不同的范围内,它们就不会违反一个定义规则,也不会引发错误。
对于自动非静态变量,范围还决定了在程序内存中创建和销毁它们的时间。
有六种范围:
全局范围 全局名称是在任何类、函数或命名空间外部声明的名称。 但是,在 c + + 中,即使这些名称都存在于隐式全局命名空间中。 全局名称的作用域从声明点扩展到在其中声明它们的文件的结尾。 对于全局名称,可见性也由用于确定名称在程序的其他文件中是否可见的 链接 规则来控制。
命名空间范围 在任何类或枚举定义或函数块外的 命名空间中声明的名称,在其声明点到命名空间的末尾可见。 命名空间可以在不同文件的多个块中定义。
本地范围 在函数或 lambda 中声明的名称(包括参数名称)具有本地范围。 它们通常称为 “局部变量”。 它们只能从其声明点到函数或 lambda 主体的末尾可见。 本地作用域是一种块范围,本文稍后将对此进行讨论。
类范围 类成员的名称具有类作用域,它在整个类定义中进行扩展,而不考虑声明点。 类成员可访问性由 public 、 private 和关键字进一步控制 protected 。 只能使用 (的成员选择运算符来访问公共或受保护成员 。 或 ->) 或指向成员的指针运算符 ( * 或 -> *) 。
语句范围 在、、或语句中声明的名称 for if while switch 直到语句块的末尾才可见。
函数范围标签具有函数范围,这意味着它在整个函数体中可见,即使在其声明点之前也是如此。 函数作用域使得可以在 goto cleanup 声明标签之前编写语句 cleanup 。
隐藏名称
可通过在封闭块中声明名称来隐藏该名称。 在下图中,在内部块中重新声明 i,从而隐藏与外部块范围中的 i 关联的变量。
块范围和名称隐藏
来自图中显示的程序的输出为:
i = 0
i = 7
j = 9
i =