C++命名空间和别名
命名空间和别名
命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
namespace Jack{
double pail;
void fetch;
int pal;
struct Well{...};
}
namespace Jill{
double bucket(double n){ ... }
double fetch;
int pal;
struct Hill{ ... };
}
命名空间可以定义变量,函数,类型.
可以嵌套,可以命名同样名称的命名空间,但是最后会合并成同一个.
名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,在默认情况下,在名称空间中声明的名称的链接性为外部的(除非它引用了常量)。
除了用户定义的名称空间外,还存在另一个名称空间一全局名称空间(global namespace)。它对应于文件级声明区域,因此前面所说的全局变量现在被描述为位于全局名称空间中。
通过这样的方式可以区别不同命名空间的变量和函数,只需使用::表示就行了,等于围了一座墙,只有钥匙才能开,这就能解释为什么在函数中使用::可以改为同名的全局变量,因为前面的空白,等于全域.
现在该如何访问命名空间域里的内容呢?其实有3种方法:
- 加命名空间名称及作用域限定符“
::” - 使用using namespace 命名空间名称全部展开
- 使用using将命名空间中成员部分展开
主要讲讲第三点:
void a(){
using std::cout;
cout << 1;
}
int main(){
a();//cout可以
cout << 1;//cout不可以
}
namespace也可以匿名定义,其潜在作用域为声明点到声明区域末尾.
using 别名
在C++11 使用 using 引入了下面这种形式的写法(模板也可以使用别名了),并且同时支持对传统 typedef 相同的功效:
通常我们使用
typedef定义别名的语法是:typedef 原名称 新名称;,但是对函数指针等别名的定义语法却不相同,这通常给直接阅读造成了一定程度的困难。
typedef int (*process)(void *);//定义了一个函数指针类型process
using NewProcess = int(*)(void *);//定义了一个函数指针类型NewProcess
template<typename T>
using TrueDarkMagic = MagicType<std::vector<T>, std::string>;
int main() {
TrueDarkMagic<bool> you;
}
故而在技术层面,using相较typedef有优越性.

浙公网安备 33010602011771号