61.命名空间 in C++
#include <iostream>
#include <string>
#include <algorithm>
void print(const char *text) {
std::cout << text << std::endl;
}
void print(const char *text) {
std::string temp = text;
std::reverse(temp);
std::cout << temp << std::endl;
}
int main() {
print("hello");
}
上面的代码有很多问题
- 使用的
print 函数到底是哪一个print - 或许可以把函数改名字,但是打印功能的函数多了起来,不可能都是不同名字的,而且强行不同名字也会显得很怪,可读性不佳
- 并且可能加的别的库里也有print函数,如果没有“分组”,则自己定义的print函数就会和其他的print函数冲突
故此,可以把这两个print“分组”,使用的时候从对应的组里使用对应的print就好了,而这里的“分组”便是命名空间
💡💡💡命名空间(名称空间)的主要目的是避免命名冲突,便于管理各类命名函数
使用名称空间的原因,是因为我们希望能够在不同的上下文中调用相同的符号
🍅namespace 名称空间的名字 {内容}
#include <iostream>
#include <string>
#include <algorithm>
namespace apple {
void print(const char *text) {
std::cout << text << std::endl;
}
}
namespace orange {
void print(const char *text) {
std::string temp = text;
std::reverse(temp);
std::cout << temp << std::endl;
}
}
int main() {
apple::print("hello");
orange::print("world");
}
💡💡💡而类本身就是名称空间,这就是为什么我们在类外使用一个类内的东西的时候需要加:: (和命名空间同理了)
💡💡💡而比如using namespace apple 的意思就是:从命名空间apple 导出所有东西,就像我从未指定它为命名空间一样
using namespace apple::print;
using namespace apple;
也可以简化名称空间的名字
using a = apple;
int main() {
a::print("hello");
}
🍅命名空间的实际应用场合
仅仅是举例:
如果加上了其他的库,担心其他的库里有符号或者函数名和自己写的重合了,这个时候就可以把自己写的东西都放在一个命名空间里,这样就可以不用担心会有任何命名重复,就可以自由自在的写代码了!(例子就是C++标准库里的所有东西都位于std名称空间的后面,这样就不会出现命名冲突了,这就是写C++标准库的作者的聪明之处了)
顺便一说,命名空间是C++独有,C是没有的,所以如果用C的代码,可能会有命名冲突,所以C的代码的命名需要小心
|