當我們寫乙個空類而不新增任何**時,卻可以用它來建立物件,拷貝、賦值等操作。例如:
#include
using
namespace
std;
class empty{};
int main(int argc,char *args)
執行上述程式發現並麼有報錯
這是因為編譯器給我們自動的生成了一些函式,包括,預設建構函式,拷貝建構函式,過載賦值操作符等。新增了這些函式的類如下
class
empty;
如果我們不想這個類有賦值與拷貝功能應當怎麼做,按照思維如果我們不想這個函式的功能,我們不應該去定義它,但是在這裡如果我們不去定義,編譯器會自動幫我們建立出來,那麼該如何做呢,很簡單,只需要把這兩個函式顯示的設為私有的就行了,例如:
class
empty;
int main(int argc,char *args)
當我們將這兩個函式顯示的設為私有的時候,我們在類外面呼叫拷貝構造和賦值操作」=」時,編譯器就會提示乙個編譯錯誤
雖然這樣做保證了我們在類外呼叫賦值操作會被顯示的拒絕,可是如果是在類的裡面,或者是類的friend函式呢?很簡單,此時我們只需宣告
empty(const empty &rhs);
empty & operator = (onst empty &rhs);
這兩個函式,而不用去實現它,這樣在frind函式或是類的成員函式裡進行拷貝、賦值時就回報錯。
#include
using namespace
std;
class
empty //在我們提供了拷貝建構函式之後,編譯器不會生成預設建構函式
friend void copy(empty &a);
private:
empty(const
empty &rhs);
empty & operator = (const
empty &rhs);
};void copy(empty &a)
我們只編譯不執行,結果如下
由上圖所示編譯成功並生成了.o檔案,現在我們鏈結
報錯了,提示函式未定義(我們確實沒有定義),但是通常我們希望這個錯誤能在編譯期間就顯現出來。很簡單
class child : private
empty{};
只需如此,當child的成員函式或者友元函式試圖拷貝child物件時,child類會生成乙個copy construct來構造,但是子類的拷貝建構函式會先呼叫empty的建構函式,而empty的建構函式是未定義的、私有的不允許被呼叫,因此早便宜期間就會直接報錯。 C 建構函式之預設建構函式
參考部落格 以下內容是在上述博主的部落格中提煉出來的 一 預設建構函式的含義是啥 主要就是 預設建構函式在呼叫的時候不需要顯示傳入實參的建構函式 二 預設的建構函式的分類 1 無參建構函式 就是沒有引數的建構函式 class sample 2 帶有形參,並且帶有預設值的建構函式 class samp...
C 學習筆記之建構函式(一)預設建構函式
定義 在未提供顯式的初始值時,用來建立物件的建構函式。舉例 class testclass private int m a int m b public testclass 預設建構函式1 testclass int a,int b 建構函式 testclass int a 10,int b 5 預...
c 學習 預設建構函式
預設建構函式 default constructor 就是在沒有顯式提供初始化式時呼叫的建構函式。它由不帶引數的建構函式,或者為所有的 形參提供預設 實參的建構函式定義。如果定義某個類的變數時沒有提供初始化時就會使用預設建構函式。中文名預設建構函式 外文名default constructor 涉及...