为什么要有名字空间(namespace)?
可以想一个这样的问题,如果两个人写一个项目各写一部份,他们同时取了一个相同名字的函数(int add(int a,int b)),在主程序中调用了add函数,哪么编译器将会报错,不知道要link哪个写的add函数。这就是为什么要名字空间的原因,可以很好的解决重名问题,不会污染全局标识符。
1 2 3 4 5 6 7 8 9 |
#include <a.h> //a写的,里面有add函数 #include <b.h> //b写的,里面也有add函数 int main() { //没有名字空间 add(1,2); //编译器不知道link哪个写的 return 0; } |
名字空间的定义:
用关键字 namespace,具体定义代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
namespace Base { //里面写代码,可以定义类 //函数 和对象 int glob = 10; int add(int a,int b); class A{ public: A(); }; //名字空间内定义 A::A() { } } //名字空间外内定义,前面就要加前缀名字空间名 Base:: Base::A::A() { } |
如何使用名字空间内的成员:
如要调用名字空间内的成员,有三种方式:
1.在调用代码之前加一句? using? namespace Base;? ( 以上面定义的Base名字空间为例),这种可以用在比如以下代码都是要用到Base名字空间成员,这样可以减少加名字空间前缀的数量。
1 2 3 4 5 6 |
int main() { using namespace Base; add(1,2); A a(); } |
2.在调用的成员前加名字空间前缀,? ?Base::add(1,2);? ?这种一般用在只有一两处地方要用到某个名字空间时。
1 2 3 4 5 |
int main() { Base::add(1,2); Base::A a(); } |
3.在要调用名字空间内成员时,先声明。using? Base::A;
1 2 3 4 5 6 |
int main() { using Base::A; A a(); } |
名字空间(namespace)别名:
比如名字空间内有很多层名字空间,要访问最里面的就会不方便,前缀太长;
a::b::c::d::e::add(1,2);
解决这类问题可以将名字空间取个别名:
1 2 3 4 |
a::b::c::d::e::add(1,2); //名字空间取别名前 namespace kk = a::b::c::d::e; kk::add(1,2); //名字空间取别名后 |
注:之前我们在看代码时,会有using namespace std;? ?std::cout等。现在相信大家都明白std就是一个名字空间,只不过它是C++标准的名字空间,所有C++标准库代码都在std名字空间内。
Truly a good deal of superb tips! canadian online pharmacies legitimate
You explained this exceptionally well! https://viagradocker.com/
Cheers. Quite a lot of write ups.
viagra online without a prescrition
You actually explained it exceptionally well. levitra