【C++】命名空间

#命名空间定义

namespace   +    自定义名字   +    {}       

namespace是关键字

namespace 名字
{
    //声明  定义


}//结尾无分号

能出现在全局作用域的声明、定义,就能出现在命名空间中。(包括命名空间和头文件)

namespace A
{
	int a = 2;
	namespace B
	{
		int b = a;//内层嵌套可以直接使用外层嵌套
        int a = A::a//内层嵌套会隐藏外层嵌套同名成员,此时需要用::来访问A
	}
    int c = B::b;//外侧嵌套不能直接使用内层嵌套
}

namespace C
{
#include<stdlib.h>   //一般不这么做
	int* a = (int*)malloc(100);
}

命名空间相当于作用域,在相同的命名空间使用相同的成员名会报错。

namespace A
{
	int b = 2;
	int b;//重定义
	int c;
}

#命名空间的使用

用   ::  来访问命名空间中的成员。

使用方法:命名空间名字 +   ::   +  被访问成员名字

namespace A
{
	int a = 1;
	int b = 2;
	int c = 3;
}

namespace B
{
	int a = 4;
	int b = 5;
	int c = 6;
}
int main()
{
	cout << A::b << endl;//结果是2
	cout << B::b << endl;//结果是5
	return 0;
}

全局变量、函数在全局命名空间(也就是全局作用域)。因为全局空间没有名字,所以不用名字直接::访问。


int a = 0;
void func()
{
	return;
}

int main()
{
	cout << ::a << endl;
	::func();

	return 0;
}

#命名空间可以不连续

相同名字的命名空间会被识别为同一个命名空间。

namespace A
{
	int a = 1;
	int b = 2;
	int c = 3;
}

namespace B
{
	int a = 4;
	int b = 5;
	int c = 6;
}

namespace A
{
	int d = 5;
	int a = 0;//上面的A已经有一个al,这里会报错重定义
}

int main()
{
	cout << A::d << endl;//结果是5


}

#命名空间可以分文件编写

#命名空间外定义成员

namespace C
{
	int a;
	void func();
}
int C::a = 0;
void C::func()
{
	return;
}

要在命名空间外定义成,必须保证成员定义的空间包含自己的声明所在的空间。

namespace C
{
	int a;
	void func();
}


void func11()
{
	void C::func()//这样定义是错的
	{
		return;
	};

	int C::a = 0;//错的

}

#内联命名空间

使用方法: inline  +  命名空间

内联命名空间的成员可以直接被外层空间使用(内联命名空间是嵌套空间)

inline namespace C
{
	int a = 0;
	int b = 1;
	int c = 2;
}
int main()
{
	cout << a << endl;

	return 0;
}

内联命名空间只需要在最开始的时候使用一次inline关键字就可以,后面无需再写inline关键字。

inline namespace C
{
	int a = 0;
	int b = 1;
	int c = 2;
}
namespace D
{
	int o=8;
}
namespace C
{
	int e = 9;
}

int main()
{
	cout << e << endl;

	return 0;
}

#未命名的命名空间

字面的意思,没有名字的命名空间,可以在一些作用域里直接使用。

namespace
{
	int a = 0;
	int b = 1;
	int d = 2;
}

int main()
{
	cout << d << endl;

	return 0;
}

#命名空间的别名

命名格式:namespace  +   自定义的名字   +     命名空间的名字

namespace A
{
	int a = 0;
	int b = 1;
	int d = c;
	namespace B
	{
		int a = 1;
		int b = 2;
	}
}

namespace C = A;
namespace D = C::B;

int main()
{
	cout << C::a << endl;//结果是0
	cout << D::a << endl;//结果是1
	return 0;
}

#using声明

使用方式:using   +    命名空间名字   +   命名空间成员

从suing声明的地方开始,直到作用域结束,suing声明的成员不再需要::访问命名空间。

namespace A
{
	int a = 0;
	int b = 1;
	int d = 2;
	namespace B
	{
		int a = 1;
		int b = 2;
	}
}

int main()
{
	using A::a;
	using A::B::b;
	cout << a << endl;//结果是0
	cout << b << endl;//结果是2
	return 0;
}

#using指示

使用方法:using   +    namespace   +   命名空间名字

从suing声明的地方开始,直到作用域结束,suing指示的命名空间不再需要::访问。

namespace A
{
	int a = 0;
	int b = 1;
	int d = 2;
	namespace B
	{
		int a = 1;
		int b = 2;
	}
}

int main()
{
	using namespace A;
	cout << a << endl;//结果是0
	cout << b << endl;//结果是1
	return 0;
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值