读前福利:几百本互联网技术书籍送给大家https://mp.weixin.qq.com/s/KAYLiHFc5HTPiFD74JYeKQ
这一个小节主要是说说咱们在代码中的命名问题
当碰到比较大的项目的时候,不可避免的会包含大量的变量名,进而产生重复命名。那么,C++中提供了一种机制来对变量名进行可见性访问的控制
一、命名空间的语法
通常咱们使用的标准命名空间,现在,咱们自己定义一个命名空间
002-1.cpp
// 定义命名空间A
namespace A {
int a = 10;
}
// 定义命名空间B
namespace B{
int a = 20;
}
int main()
{
cout << "A::a = " << A::a << endl;
cout << "B::a = " << B::a << endl;
return EXIT_SUCCESS;
}
结果展示:
A::a = 10
B::a = 20
通过定义不同的命名空间以及其中的变量,可得到不同命名空间下的变量值
注意:namespace只能在全局定义,不可以使用在函数中定义
二、命名空间的使用
2.1 命名空间嵌套命名空间
可通过嵌套的方式进行变量的访问
002-2.cpp
// 定义命名空间A
namespace A {
int a = 10;
// 嵌套定义命名空间B
namespace B{
int a = 20;
}
}
int main()
{
cout << "A::a = " << A::a << endl;
cout << "A::B::a = " << A::B::a << endl;
return EXIT_SUCCESS;
}
结果展示:
A::a = 10
A::B::a = 20
2.2 加入新成员到命名空间
命名空间的开放性,可随时把新的成员加入已有的命名空间中
002-3.cpp:
// 定义命名空间A
namespace A {
int a = 10;
}
// 将新成员添加进命名空间A
namespace A {
void func (){
cout << "hello!命名空间增加新成员!";
}
}
int main()
{
cout << "A::a = " << A::a << endl;
A::func();
return EXIT_SUCCESS;
}
执行结果:
A::a = 10
hello!命名空间增加新成员!
2.3 命名空间中声明和实现的分离
顾名思义,在命名空间中进行函数的定义,在外面进行具体函数的实现,看代码:
002-4.cpp
// 定义命名空间newSpace
namespace newSpace {
void func1 ();
void func2 (int param);
}
// 在 namespace newSpace 外面进行函数的实现
void newSpace::func1() {
cout << "这是第一个在命名空间外实现的函数" << endl;
}
void newSpace::func2(int param) {
cout << "这是第二个在命名空间外实现的函数" << "param = " << param << endl;
}
int main()
{
newSpace::func1();
newSpace::func2(1024);
return EXIT_SUCCESS;
}
执行结果:
这是第一个在命名空间外实现的函数
这是第二个在命名空间外实现的函数param = 1024
2.4 无命名空间
这种情况下,命名空间中的所有标识符只能在本文件内被访问,只能作为内部连接
002-5.cpp
namespace {
int a = 10;
void func() {
cout << "hello namespace!!!" << endl;
}
}
int main()
{
cout << "a = " << a << endl;
func();
return EXIT_SUCCESS;
}
结果显示:
a = 10
hello namespace!!!
但是如果是其他cpp文件使用,是不行的,即使在同一目录下也不行
2.5 命名空间别名
使用另外一个变量名进行替代,后续会说到引用,有异曲同工之妙
002-6.cpp
// 定义命名空间theLongNameSpace
namespace theLongNameSpace {
int a = 10;
void func()
{
cout << "hello namespace" << endl;
}
}
int main()
{
namespace shortNameSpace = theLongNameSpace;
cout << "theLongNameSpace::a = " << theLongNameSpace::a << endl;
theLongNameSpace::func();
cout << "shortNameSpace::a = " << shortNameSpace::a << endl;
shortNameSpace::func();
return EXIT_SUCCESS;
}
执行结果:
theLongNameSpace::a = 10
hello namespace
shortNameSpace::a = 10
hello namespace
三、using的使用
通过 using spacename的方式进行对我们自己定义的命名空间进行制定
看下面的例子,通过 using namespace A 从而直接使用命名空间 A 中的成员
可以通过制定命名空间中内容的方式:
using A::paramA;
也可以通过直接指定整个的命名空间,但是不建议这样做,很可能会发生变量名或者函数名重复的情况
using namespace A;
看完整代码和执行结果吧 :
// 定义命名空间A
namespace A {
int paramA = 20;
int paramB = 30;
void funcA(){
cout << "hello funcA" << endl;
}
void funcB(){
cout << "hello funcA" << endl;
}
}
int main()
{
// 1. 通过命名空间运算符
cout << A::paramA << endl;
A::funcA();
cout << endl;
// 2. using声明
using A::paramA;
using A::funcA;
cout << paramA << endl;
funcA();
cout << endl;
// 3. using声明整个命名空间
using namespace A;
cout << "paramA = " << paramA << endl;
cout << "paramB = " << paramB << endl;
funcA();
funcB();
return EXIT_SUCCESS;
}
执行结果:
20
hello funcA
20
hello funcA
paramA = 20
paramB = 30
hello funcA
hello funcA
代码中的三种使用命名空间的示例,建议使用第一种或者第二种,减少了命名冲突的可能性。第三种直接全局使用,一定会增加命名冲突的可能性。
四、完整代码获取
链接: https://pan.baidu.com/s/1DlXRwttcj31xsLwdwNFV8A 密码: hgl6