0%

教媳妇儿学C++ No.2 | C++中的namespace

读前福利:几百本互联网技术书籍送给大家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
// 定义命名空间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;
}

结果展示:

1
2
A::a = 10
B::a = 20

通过定义不同的命名空间以及其中的变量,可得到不同命名空间下的变量值

注意:namespace只能在全局定义,不可以使用在函数中定义

二、命名空间的使用

2.1 命名空间嵌套命名空间

可通过嵌套的方式进行变量的访问

002-2.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 定义命名空间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;
}

结果展示:

1
2
A::a = 10
A::B::a = 20

2.2 加入新成员到命名空间

命名空间的开放性,可随时把新的成员加入已有的命名空间中

002-3.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 定义命名空间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;
}

执行结果:

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
// 定义命名空间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;
}

执行结果:

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
// 定义命名空间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;
}

执行结果:

1
2
3
4
theLongNameSpace::a = 10
hello namespace
shortNameSpace::a = 10
hello namespace

三、using的使用

通过 using spacename的方式进行对我们自己定义的命名空间进行制定

看下面的例子,通过 using namespace A 从而直接使用命名空间 A 中的成员

可以通过制定命名空间中内容的方式:

1
using A::paramA;

也可以通过直接指定整个的命名空间,但是不建议这样做,很可能会发生变量名或者函数名重复的情况

1
using namespace 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
// 定义命名空间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;
}

执行结果:

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

最后

在这里给大家准备了几百本的互联网技术类书籍,需要的来下载吧!点击获取
有任何问题,欢迎随时交流!!!

------ 全文结束------