命名空间的核心目的:解决命名冲突
命名空间的内容可以是 符号常量、变量、函数、结构、枚举、类和对象等等。
创建一个命名空间
namespace A {
int a= 10;
}
void test()
{
//cout<<"a = "<<a<<endl;//err
//A::a访问a的方式 是最直接 也是最安全的方式
cout<<"a = "<<A::a<<endl;
}
命名空间只能全局范围内定义
//一下是错误示范
void test(){
namespace A{
int a;
}
}
命名空间是开放的,即可以随时把新的成员加入已有的命名空间中
namespace D {
int a = 10;
}
//假如有一万行代码
namespace D {
int b = 20;
}
void test()
{
cout<<"a = "<<D::a<<endl;
cout<<"b = "<<D::b<<endl;
}
命名空间可以包含函数
namespace A{
void func(void){
cout<<"func"<<endl;
}
}
void test(){
A::func();
}
声明和定义分开
namespace A{
void func(void);
}
void A::func(){
cout<<"func"<<endl;
}
void test(){
A::func();
}
无名命名空间
namespace {
int a = 100;
}
void test()
{
cout<<"a = "<<::a<<endl;//推荐写法 100
cout<<"a = "<<a<<endl;//ok 100
}
//其他源文件 不能识别 无名命名空间中的a
//无名命名空间中的变量 等价于static修饰
命名空间取别名
namespace A {
int a = 1000;
}
void test()
{
cout<<"a = "<<A::a<<endl;
//给A取别名
namespace B=A;
cout<<"a = "<<A::a<<endl;
cout<<"a = "<<B::a<<endl;
}
using 声明命名空间中的成员识别
#include <iostream>
using namespace std;
namespace Data
{
int a = 10;
int b = 20;
int c = 30;
}
void test()
{
cout<<Data::a<<" "<<Data::b<<" "<<Data::c<<endl;
//声明Data 中a成员可以识别
using Data::a;
cout<<"a = "<<a<<endl;
//using声明成员 容易和其他普通变量造成命名冲突
//int a = 100;//err
}
如果命名空间中的函数 是重载的,那么声明一个函数名 所有重载函数都识别。
namespace Data {
void func(void)
{
cout<<"func void"<<endl;
}
void func(int a)
{
cout<<"func int"<<endl;
}
void func(int a, int b)
{
cout<<"func int int"<<endl;
}
}
void test()
{
//如果函数被重载 声明一个函数 所有重载函数都被声明
using Data::func;
func();
func(10);
func(10,20);
}
using声明整个命名空间
namespace Data {
int a = 10;
int b = 20;
int c = 30;
}
//声明整个命名空间
using namespace Data;
//int a = 2000;//err 会和全局变量冲突
void test()
{
cout<<a<<" "<<b<<" "<<c<<endl;// 10 20 30
//优先选择普通局部变量
int a = 1000;
cout<<"a = "<<a<<endl;//1000
}
网友评论