using关键字
C++中using关键字的用法总结:
- using指示(引入命名空间)
- using声明
- 类型重定义,取代typedef
1、using指示(引入命名空间)
这是最常见最熟悉的用法,刚开始学C++的第一个“Hello word!”就用到,using namespace std;
using namespace std; // 应尽量少使用 int x; std::cin >> x; // 应尽量这样使用 std::cout << x << std::endl; using std::cin; // 或者像这样集中命名 using std::cout; using std::endl; int x; cin >> x; cout << x <<endl;
不恰当的使用using可能带来名称的冲突,如果与局部名称发生冲突,则局部名称会覆盖命名空间的同名字段,编译器不会发出警告;而如果与全局变量名称发生冲突,编译器会发出指示。

2、using声明
using 声明中引入的名字遵循常规作用域规则:外部作用域中定义的同名实体会被屏蔽。
#include <iostream> namespace Lib { void print(int x) { std::cout << "int类型:" << x << std::endl; } } void print(double y){ std::cout<<"double类型:"<<y<<std::endl; } int main() { using Lib::print; // main作用域中嵌套了Lib命名空间 print(1.36); // main外的 void print(double y) 函数被屏蔽 print(3); return 1; }
#include<iostream>namespace Lib { void print(int x) { std::cout<<"int类型:"<<x<<std::endl; } } void print(double y){ std::cout<<"double类型:"<<y<<std::endl; } using Lib::print; // main作用域中平行于Lib命名空间 int main() { print(1.36); // 选择调用重载函数中的 void print(double y) print(3); // 选择调用重载函数中的 void print(int y) return 1;
3、类型重定义,取代typedef
这是C++11的新用法,类似于typedef的别名表达。
using alias = typename
在 C++98/03 中 ,typedef 重定义有一些限制,比如,模板。
我们想实现这样一个模板:将一个 int 映射到任意类型,类似于我们想表达这种效果:
typedef std::map<int, int> map_int_t; typedef std::map<int, std::string> map_str_t; typedef std::map<int, bool> map_b_t;
在 C++98/03 中 需这样写:
template<typename Val> struct int_map{ typedef std::map<int, Val> type; }; int main(){ int_map<int>::type imap; return 0; }
而在C++11中,可以使用using这样写:
template<typename Val> using int_map_t = std::map<int, Val>; int main(){ int_map_t<int> imap; return 0; }
参考博客:

浙公网安备 33010602011771号