這篇隨筆,我們來(lái)討論一下在C++中(包含新舊語(yǔ)法)using的基本使用和一個(gè)比較特殊的使用方式。
1.引入命名空間
可能在C++的初學(xué)者眼中,using關(guān)鍵字就是對(duì)常見(jiàn)的是這兩句代碼:
using namespace std;和using std::cout;
當(dāng)然,這也是using的最基本的使用方法。
2.using關(guān)鍵字在類繼承的中的作用
(1)派生類部分覆蓋基類的成員函數(shù)
在下面的代碼中,基類中兩個(gè)成員函數(shù)形成函數(shù)重載,在派生類中只對(duì)基類的一個(gè)成員函數(shù)進(jìn)行了函數(shù)覆蓋(另一個(gè)并沒(méi)有覆蓋),此時(shí)在派生類中Func(int)這個(gè)函數(shù)就被隱藏了,此時(shí)如果通過(guò)派生類對(duì)象調(diào)用該方法就會(huì)出現(xiàn)編譯錯(cuò)誤(如下圖所示)。


此時(shí),想要以簡(jiǎn)單的方式解決這個(gè)問(wèn)題(不需要在派生類中重寫(xiě)該方法),只需要在派生類中寫(xiě)一句? using Base::Func;? 即可。

(2)在類的私有繼承中
在類的繼承中,存在一個(gè)private繼承關(guān)系,如下代碼所示,私有繼承時(shí),基類的成員方法不能在派生類中使用。


如果需要在私有繼承的派生類中使用基類的成員方法,可以使用using關(guān)鍵字,在派生類中添加一句代碼:???????? public:? using Base::Func;

3.使用using關(guān)鍵字來(lái)定義別名
(1)定義普通類型的別名(與typedef類似)
首先,利用using關(guān)鍵字來(lái)定義別名的代碼有更好的可讀性,看下面的例子:
定義一個(gè)函數(shù)指針,指向的函數(shù)返回值是void,輸入?yún)?shù)是int型

可以看出,使用using關(guān)鍵字類似于一種賦值,函數(shù)指針的類型也可以更好的識(shí)別出來(lái)。
(2)使用using指定模板的別名(typedef做不到)
如下的代碼,可以看出使用using可以聲明一個(gè)模板類的別名,但是typedef不行。

最后一個(gè)例子是侯捷老師的課程所涉及的using的高級(jí)用法。



4.總結(jié)
using是C++舊語(yǔ)法中的一個(gè)關(guān)鍵字,而在C++11的新標(biāo)準(zhǔn)中賦予了新的意義,靈活的使用using關(guān)鍵字可以解決之前難以解決的問(wèn)題。
參考
侯捷老師的c++11新特性視頻
https://blog.csdn.net/zzyczzyc/article/details/94290574
https://blog.csdn.net/zxc024000/article/details/79438539?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase