作用域

参考:

Scope (C++)

Scope

Name visibility

种类

作用域指实体可以操作的范围。通常称在任何类、函数或命名空间之外声明的名称拥有全局作用域(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++不推荐类名和变量名相同的编写方式