什么需要命名空间?
我们知道,在我们写大型项目的时候,可能需要合作,这个时候就可能出现,文件一中有一个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) { 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); text2::swap(c, d); std::cout << a << " " << b << std::endl; std::cout << c << " " << d << std::endl; return 0; }
|
这里text1::中的::表示**作用域限定符::**访问命名空间,::前面代表得是我们的命名空间,::后面代表的是我们要调用的东西,可以是函数,或者是一个数据,例如可以
通过这样来获取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; }
|
这里使用了了一个
使用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;将其命名空间库全部导入。