using用法是:1、名稱空間【using namespace 名稱空間】;2、型別別名【using aa=double】;3、改變從基礎類別繼承來的成員的存取級別;4、讓派生類對基礎類別中所有的過載函數都可見;5、讓派生類繼承所有建構函式。
【相關學習推薦:】
using用法是:
1、名稱空間
using namespace 名稱空間;//這樣每次使用名稱空間中的變數時就不用指定名稱空間了
注意:標頭檔案中不應有using名稱空間的宣告
2、型別別名(C++11)
using aa = double;//等價於typedef double aa typedef double db, *p;//db是double的同義詞,p是double*的同義詞(注意)
3、改變從基礎類別繼承來的成員的存取級別
class base { public: int fun(int x); int b; }; class son : private base { public: using base::fun; //fun(int x)由private變成public(注意:using不指定參數列) protected: using base::b; //b由public變成protected };
4、讓派生類對基礎類別中所有的過載函數都可見,而不是隱藏
class base { public: void func() { cout << "func1()" << endl; } void func(int x) { cout << "func2()" << endl; } }; class son : public base { public: using base::func; //若沒有此句,func()和func(int x)將會被隱藏 void func(int x, int y) { cout << "func()3" << endl; } };
5、第4點的升級,using可讓派生類繼承直接基礎類別所有的建構函式
1)派生類並非以常規方式繼承基礎類別的建構函式,而是要使用using宣告讓派生類繼承基礎類別的所有的(有兩個例外)建構函式
2)例外一:派生類自己的建構函式與基礎類別的某個建構函式有相同的形參,則該建構函式不會被繼承
例外二:預設、拷貝和移動建構函式不會被繼承
3)與第3點不同,using宣告不會改變繼承的建構函式的存取級別:不管using宣告出現在哪,基礎類別的共有/受保護/私有建構函式在派生類中還是一個共有/受保護/私有建構函式,
4)using宣告不能指定explicit和constexpr:如果基礎類別的建構函式是explicit或constexpr,則繼承的建構函式也擁有相同的屬性
5)繼承的建構函式不算自定義的建構函式,所以仍然可以滿足合成建構函式的生成規則
6)如果基礎類別的建構函式有預設實參,則實預設參不會被繼承
7)如果基礎類別的建構函式有兩個形參,一個形參沒有預設實參,另一個形參有預設實參,則通過繼承會獲得兩個建構函式:一個建構函式有兩個形參,另一個只有一個形參(對應沒有預設實參的那個),總之,預設實參都不會被繼承
class base { public: base() {} base(string s, int a) {} }; class son : public base { public: using base::base;//繼承直接基礎類別所有的建構函式,對於基礎類別的每個建構函式,編譯器都在派生類中生成一個形參完全相同的建構函式 //using不能指定explicit和constexpr private: //使用繼承來的建構函式時,如果派生類有自己的資料成員,則這些成員將被預設初始化 string str; int num; }; //等價於: class son : public base { public: son():base() {} son(string s, int a): base(s, a) {} };
以上就是using用法是什麼的詳細內容,更多請關注TW511.COM其它相關文章!