C++-作用域.jpg

一、 命名空间

  1. 嵌套命名空间

    namespace B{
        namespace C{
            extern int x;       // 声明变量
            void g(int);        // 声明函数原型
            void g(long){
                cout << "B::C::g(long)\n";
            }
        };
    };
    using B::C::x;              // 声明引用变量 x,把它引入到当前作用域
                                // 就不能在当前作用域定义同名变量了
    using namespace B;          // 引用命名空间,但不会把函数和变量引入到当前作用域
                                // 在当前作用域中仍然可以定义同名的变量和函数
    using B::C::g;              // 声明引用 void g(int) 和 void g(long)
                                // 将函数名为 g 的所有函数都引入到当前作用域
    
    namespace B::C{
        int y = 1;
        int x = 2;              // 定义变量 x
        void g(int a){          // 定义函数 void g(int)
            cout << "B::C::g(int)\n";
        }
        void g(void){
            cout << "B::C::g(void)\n";
        }
    };
    
    static int xx = 1;
    
    class A{
    public:
        int xx;
        A(int xx){
            A::xx = xx;
        }
    };
    int main()
    {
        static int xx = 2;
        A a(3);
        cout << a.xx << endl;               // 3
        cout << ::xx << endl;               // 1
        cout << xx << endl;                 // 2
        ::xx = 0;
        cout << ::xx << endl;               // 0
        cout << &::xx << endl;              // 0x557c5799c010
        cout << &xx << endl;                // 0x557c5799c014
    
        cout << B::C::x + B::C::y << endl;  // 3
    
        g(4);                               // B::C::g(int)
        g(4l);                              // B::C::g(long)
        cout << x << endl;                  // 2
        // g();                             // error: no matching function for call to ‘g()’
                                            // using 之前没有该原型
    
        return 0;
    }
    
  2. 匿名命名空间

    类似静态声明,匿名命名空间中的变量和函数只能在当前模块中使用

    MyTestNamespace cpp 文件:

    namespace MyTestNamespace {
    
        // 匿名命名空间
        namespace {
            int noName = 11;
            void noNameFunc() {
                std::cout << "no name namespace\n";
            }
        }
    
        void globalFunc();
    
        void MyTestClass::testFun() {
            globalFunc();
            std::cout << noName << std::endl;
            noNameFunc();
        }
    }
    

二、对象作用域