读前福利:几百本互联网技术书籍送给大家https://mp.weixin.qq.com/s/dFqVQ2qJxvQ0YrIlPISJuw

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