作用域
参考:
种类
作用域指实体可以操作的范围。通常称在任何类、函数或命名空间之外声明的名称拥有全局作用域(global scope
),在里面声明的名称拥有局部作用域(local scope
)
其中局部作用域还可细分如下:
- 名称空间作用域(
namespace scope
):指的是在名称空间内,任何类、枚举定义或者函数块之外的空间 - 类作用域(
class scope
):指的是类定义内的空间 - 表达式作用域(
statement scope
):指的是for、if、while、switch
等表达式内的空间 - 函数作用域(
function scope
):指的是函数内的空间 - 块作用域(
block scope
):指的是被一个块包围起来的空间 - 模板参数作用域(
Template parameter scope
):模板参数名称的潜在范围从声明点立即开始,并继续到引入它的最小模板声明的结尾。尤其是模板参数可以用于后续模板参数的声明和基类的规范中,但不能用于前面模板参数的声明中
可见性
实际操作中作用域之间相互涵盖,实体在不同位置的作用域会发生变化
变量、常量、函数、类、结构体等实体仅在当前作用域内可见,如果小作用域定义了一个同样的名称,那么会覆盖大空间相同名称的可见性
比如,定义类Account
,同时定义全局变量Account
,在main
函数内定义局部变量Account
。示例代码如下:
// Declare class Account at global scope.
class Account {
public:
Account(double InitialBalance) { balance = InitialBalance; }
double GetBalance() { return balance; }
private:
double balance;
};
double Account = 15.37; // Hides class name Account
int main() {
class Account Checking(Account); // Qualifies Account as
// class name
cout << "Opening account with balance of: "
<< Checking.GetBalance() << "\n";
int Account = 33;
cout << Account << endl;
cout << ::Account << endl;
{
char Account = 'c';
cout << Account << endl;
cout << ::Account << endl;
}
}
- 程序中全局变量
Account
覆盖了类Account
的可见性,如果要使用类,必须添加说明符class
- 程序中局部变量
Account
覆盖了全局变量Account
的可见行,如果要使用全局变量,必须添加作用域解析运算符::
运行结果如下:
Opening account with balance of: 15.37
33
15.37
c
15.37
注意:C++不推荐类名和变量名相同的编写方式