using用法是什麼

2020-10-26 12:03:03

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其它相關文章!