本文重要介紹普通繼承中如何寫派生類的六個預設成員函式,主要是針對在派生類中,如何呼叫基類的六個預設成員函式
需要說明的一點就是,如果子類中沒有呼叫父類的函式時,系統會自動生成乙個。
子類中有父類的成員,子類首先需要呼叫父類的建構函式,然後呼叫自己的建構函式。如果沒有呼叫父類的建構函式,系統會自動生成乙個。
在建構函式中,我們使用父類的匿名物件完成初始化。看下面的**
class a
private:
int _a;
};class b : public a
private:
int _b;
};
上面的例子我們可以看出來,當我們寫子類b的建構函式的時候,首先需要先呼叫 父類的匿名建構函式,完成對子類中包含的父類成員的初始化的工作。
拷貝建構函式應該寫成是下面的形式
b(const
b& b)
:a(b)
,_b(b
._b)
這裡語法規定子類中初始化父類的時候,必須在初始化列表中初始化父類,包括我們上面的建構函式也是這個樣子,必須在初始化列表中初始化父類拷貝建構函式應該如何使用呢,還是上面的思想,我們需要那子類的物件去為父類賦值,所以這個時候,我們可以在子類的賦值運算子過載的函式內部,呼叫父類的賦值運算子過載的函式,對父類的物件進行賦值。
b& operator=(const b& b)
return *this;
}
但是上面的問題,會出現乙個問題就是,棧溢位,為什麼會出現這樣的問題呢,主要是在呼叫父類的賦值運算子過載的 時候,實際上是並沒有呼叫父類的賦值運算子過載,這裡呼叫的是子類的,這樣子就形成了遞迴了,然後會一直呼叫下去。解決辦法是這樣的,我們需要在呼叫父類的函式前面加上乙個作用域限制符。
a::operator(b);
這裡為什麼會呼叫子類的賦值運算子的過載呢,實際上是子類的函式名和父類的函式名構成了重定義,這個時候如果不加上作用域限制符就會出現問題了
這裡在寫子類的析構函式的時候,是不允許子類呼叫父類的析構函式的,有兩個原因
基於上面的一些原因,要求就是只需要由系統自動的呼叫父類的析構函式即可。
類的六個預設成員函式
類的六個預設成員函式 1.建構函式 2.拷貝建構函式 3.析構函式 4.賦值操作符過載 5.取位址操作符過載 6.const修飾的取位址操作符過載 建構函式 是乙個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內隻且只呼叫一次,以保證每個資料成員都有乙個合適的初...
類的六個預設成員函式
如果乙個類中什麼成員都沒有,則就是空類。但是空類中什麼都沒有嗎?其實並不是這樣的,任何類在我們不寫的情況下,都會自動生成下面六個預設成員函式。class date 無參的建構函式 date int year,int month,int day 有參的建構函式 這兩個建構函式構成了函式的過載,因為它們...
C 之類的六個預設成員函式
在c 類中同樣的預設成員函式一共有六個,即使使用者不定義,編譯器也可以給出。分別為 1 建構函式 2 析構函式 3 拷貝建構函式 4 賦值運算 5 取位址運算 6 const取位址運算 我們一下述程式為例驗證下上面說法 include using namespace std class comple...