摘要
using 關鍵字在 C++ 中的幾種用法
1. using 声明
using 聲明 (using declaration)
是將命名空間中單個名字註入到當前作用域的機製,
使得在當前作用域下訪問另一個作用域下的成員時無需使用限定符 ::
1 | // ... |
using 聲明將其它 namespace 的成員引入本命名空間的 當前作用域 (包括其嵌套作用域) 。
一個 using 聲明一次只引入一個命名空間成員,它使得無論程序中使用哪些名字,都非常準確。
利用 using 聲明,可以改變派生類對父類成員的訪問控製:
1 | class Base{ |
盡管 Derived 對 base 是私有繼承,但通過 using 聲明,我們還是可以在 Derived 中訪問其成員,
且後續的繼承同樣不受 private 限定的影響。
2. using 指示 (引入命名空間)
using 指示 (using directive) 是使一個命名空間中的 所有 名字都在該作用域中可見的機製。
這是最常用的方式了。需要註意的是命名沖突問題。
1 |
|
Notice
: 盡管 using指示很方便,但在實際工作中應該盡量避免:
它一下子將另一個 namespace 中的成員全部引入了,一不小心就會出現命名空間汙染
問題。
3. 類型重定義,取代 typedef
1 | using alias = typename |
這是 C++11 中的新用法,比 typedef 更能表達別名的定義。
1 | using fun = void (*)(int, int); |
在 C++98/03 中 ,typedef 重定義有一些限製,比如,模板。
我們想實現這樣一個模板:將一個 int 映射到任意類型,類似於我們想表達這種效果:
1 | typedef std::map<int, int> map_int_t; |
我們在 C++98/03 中必須這樣寫:
1 | template<typename Val> |
在C++11 中,我們可以使用 using 重定義模板 :
1 | template<typename Val> |