C++ 命名空间(namespace)

命名空间(namespace):为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间是一个作用域。通过在某个命名空间中定义库的名字,库的作者(以及用户)可以避免全局名字固有的限制。

命名空间定义

1. 创建一个命名空间

namespace A {
    int a = 10;
}

int main() {
    cout<<A::a<<endl;
    return 0;
}
//10

命名空间只能在全局范围内定义

2. 命名空间可以嵌套

namespace A {
    int a = 10;
    namespace B {
        int a = 20;
    }
}

int main() {
    cout<<A::a<<endl;
    cout<<A::B::a<<endl;
    return 0;
}
// 10 20 

3. 命名空间可以不连续

namespace A {
    int a = 10;
}
namespace A {
    int b = 20;
}

int main() {
    cout<<A::a<<endl;
    cout<<A::b<<endl;
    return 0;
}
//10 20

4. 声明和实现可分离

namespace A {
    void func();
}
void A::func() {
    cout<<"A::func()";
}

int main() {
    A::func();
    return 0;
}

5. 未命名的命名空间

意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其对于整个文件有效。
即:定义在未命名的命名空间中的名字可以直接使用。

namespace {
    void func() {
        cout<<"namespace func";
    }
}

int main() {
    func();
    return 0;
}
  • 未命名的命名空间中的名字一定要与全局作用域中的名字有区别
int i;
naemspace {
	int i;
}
//二义性
  • 未命名的命名空间不能将声明与实现相分离
namespace {
    void func();
}
void func() {
    cout<<"namespace func";
}
//二义性
  • 未命名的命名空间可嵌套在其他的命名空间中
namespace A {
    namespace {
        void func(){
            cout<<"A namespace func";
        }
    }
}

int main() {
    A::func();
    return 0;
}

6. 命名空间的别名

namespace cplusplusSpace {
    void func() {
        cout << "A namespace func";
    }
}
int main() {
    namespace cppSpace = cplusplusSpace; //别名
    cppSpace::func();
    cplusplusSpace::func();
    return 0;
}

使用命名空间成员

1. using声明

namespace A {
    int i = 10;
    void funcA() {cout<<"this is funcA";}
}
int main() {
	//表示下面部分用到的i和funcA都在命名空间A中寻找
    using A::i;
    using A::funcA;
    cout<<i<<endl;
    funcA();
    //容易发生同名冲突(二义性)
    //int i = 20;
    return 0;
}

2. using声明与函数重载

如果命名空间包含一组相同名字的重载函数,using声明就声明了这个重载函数的所有集合(using声明只声明一个名字即可)

namespace A {
    void funcA() {}
    void funcA(int x) {}
    int funcA(int x, int y) {}
}
int main() {
    using A::funcA;
    funcA();
    funcA(10);
    funcA(10,20);
    return 0;
}

using声明整个命名空间

namespace A {
    int i = 10;
    int j = 20;
    void funcA() {}
    void funcB() {}
}
int main() {
    using namespace A;
    cout<<i<<" "<<j<<endl;
    funcA();
    return 0;
}

你可能感兴趣的:(C++,#,C++,Primer,c++,namespace)