c++命名空间(std::)

二木 王者

什么需要命名空间?

我们知道,在我们写大型项目的时候,可能需要合作,这个时候就可能出现,文件一中有一个swap函数,文件二中也有一个swap函数,当我们写主程序的时候,调用swap,那会调用哪个swap函数呢?为了解决像这样的问题,我们出现了命名空间

在我们写代码的时候就写一个text1命名空间,里面放swap,再写一个text2命名空间里面再放另一个swap,在调用的时候,就不会出现冲突的问题了。

命名空间的书写

例子:

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
#include<iostream>
namespace text1 //声明一个命名空间
{
int num =10; //数据
void swap(int &a, int &b) //swap函数的具体实现
{
int temp;
temp = a;
a = b;
b = temp;
}
}
namespace text2
{
void swap(float &a, float &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
}
int main()
{
int a = 10, b = 70;
float c = 20, d = 90;
text1::swap(a, b); //调用text1命名空间下的swap函数
text2::swap(c, d);
std::cout << a << " " << b << std::endl;
std::cout << c << " " << d << std::endl;
return 0;
}

这里text1::中的::表示**作用域限定符::**访问命名空间,::前面代表得是我们的命名空间,::后面代表的是我们要调用的东西,可以是函数,或者是一个数据,例如可以

1
text1::num

通过这样来获取text1命名空间中的num中的值

命名空间的嵌套

命名空间是可以嵌套的

我们修改一下上面的代码,将text2嵌入text1中去

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
#include<bits/stdc++.h>
namespace text1
{
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
namespace text2
{
void swap(float &a, float &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
}
}
int main()
{
int a = 10, b = 70;
float c = 20, d = 90;
text1::swap(a, b);
text1::text2::swap(c, d);//调用嵌套后的函数
std::cout << a << " " << b << std::endl;
std::cout << c << " " << d << std::endl;
return 0;
}

std::的使用

我们看其他人的代码的时候总会看到这样写的代码(就上面举例的代码)

1
std::cout << a << " " << b << std::endl;

通过上面的例子,我们可以类似的解决这个问题,这里的意思就是调用std命名空间下的cout函数与调用endl函数。

在写代码时,我们也会见到这样的写法

1
2
3
4
5
6
7
#include<iostream>
using namespace std;
int main()
{
cout<<"this is texe one"<<endl;
return 0;
}

这里使用了了一个

1
using namespace std;

使用using namespace引入命名空间std中的所有成员,并对其直接使用,因此写的时候我们就可以省略std::,从而简化代码。

不建议直接导入全部命名空间

针对于自己写一个小的程序,直接使用类似的using namespace std;确实能简化部分代码,但是其实并不建议直接这样写的,因为我们写命名空间的目的就是为了解决命名冲突的问题,如果我们将命名空间全部导入我们的代码中,一方面会造成我们的文件变大,另一方面与我使用命名空间背道而驰。

举一个例子(错误示范):

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
#include<iostream>
using namespace std;
using namespace text1;
using namespace text2;
namespace text1
{
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
}
namespace text2
{
void swap(float &a, float &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
}
int main()
{
int a = 10, b = 70;
float c = 20, d = 90;
swap(a, b); //调用哪一个?
swap(c, d);
cout << a << " " << b <<endl;
cout << c << " " << d <<endl;
return 0;
}

可以发现,我们脑抽了才这样写,全部导入了,就相当于没有写命名空间。因此这就是是为什么大多数都不建议我们使用using namespace std;将其命名空间库全部导入。

 评论