我們可以構建乙個空類,
class empty
;
儘管沒有定義任何函式,但我們可以通過以下方式使用這個類:
empty e1;
empty e2(e1);
e2 = e1;
因為當編譯器發現你用上述方式使用這個類而卻在類宣告中沒有定義一般建構函式(非複製建構函式)、複製建構函式、賦值操作符過載函式和析構函式時,會自動為其生成這些函式,上面的empty
類經編譯後就對應著下面的類:
class empty
; empty(const empty& rhs);
~empty();
empty& operator=(const empty& rhs);
};
編譯器生成的預設建構函式和析構函式的主要任務是分別呼叫基類和非靜態成員變數的構造和析構函式。生成的複製建構函式和賦值操作符過載函式只是單純的將源物件的每乙個非靜態變數拷貝給目標物件。
/******************************************
* ******_class.cpp *
* *
* c++自動生成的函式 *
賦值操作符過載函式只有當編譯器生成的**是合法且有意義時才會由編譯器自動生成。
/****************************************
* wired_employee.cpp *
* *
* 不合法的賦值運算子過載函式不會自動生 *
* 成 *
****************************************/
#include
#include
class wiredemployee
void print()
};int main()
從錯誤中可看出,賦值運算子過載函式沒有生成。
若不想使用編譯器自動生成的函式,需要自己明確地定義這些函式。
如果不想讓使用者使用這些函式,可以將其可訪問範圍設定為private
。然而這樣並不完全能夠實現這種要求,因為對於友元和成員函式來說,它們仍然是可以訪問的。
/***************************************
* forbidden_use.cpp *
* *
* c++禁止使用成員函式 *
***************************************/
#include
class test
void use()
void print()
private:
test(test& t)
test& operator=(const test& t)
friend
void usetest();
};/*友元可用*/
更加穩妥的一種方法是將這些函式只宣告為private
,而不去實現它們。這樣使用者使用這些函式的錯誤將在編譯時被發現,而成員函式或友元使用這些函式的錯誤將在鏈結時被發現。
/***************************************
* forbidden_use_1.cpp *
* *
* c++禁止使用成員函式 *
***************************************/
#include
class test
void use()
void print()
private:
test(test& t);
test& operator=(const test& t);
friend
void usetest();
};/*友元不可用*/
還有一種方法是定義乙個基類,這個基類的這些函式設定為private
,那麼所有繼承自該基類的子類就不能被使用者,也不能被自己的成員函式和友元使用了。因為無論什麼時候使用這些函式,它都會呼叫父類的相應函式,而父類的這些函式又是private
,就會報錯。
/***************************************
* forbidden_use_2.cpp *
* *
* c++禁止使用成員函式 *
***************************************/
#include
class uncopyable
; ~uncopyable(){};
private:
uncopyable(const uncopyable& );
uncopyable& operator=(const uncopyable&);
};class test : private uncopyable
void use()
void print()
friend
void usetest();
};/*友元不可用*/
void usetest()
int main()
下圖中只顯示了在成員函式use
中的錯誤,實際上,當把use
內的**注釋掉後,友元函式中的錯誤
就會顯示出來
scott meyers著,侯捷譯. effective c++中文版. 電子工業出版社. 2012.
C 類編譯器自動生成函式的實現
在c 中,乙個類有八個預設函式 預設建構函式 預設拷貝建構函式 預設析構函式 預設過載賦值運算子函式 預設過載取址運算子函式 預設過載取址運算子const函式 預設移動建構函式 c 11 預設過載移動賦值操作符函式 c 11 class myclass c 預設建構函式是對類中的引數提供預設值的建構...
拒絕編譯器自動生成的函式
編譯器自動的函式 有些場景中需要拒絕這些編譯器自動生成的函式,可以通過下列方法,定義uncopyable類並繼承它。拒絕使用編譯器生成的函式 class uncopyable uncopyable private 拒絕copy uncopyable const uncopyable 在這裡宣告,不用...
C 空類編譯器自動生成的6個成員函式
在c 中,編譯器會為空類提供哪些預設成員函式?分別有什麼樣的功能呢?對於空類,編譯器不會生成任何的成員函式,只會生成1個位元組的佔位符。有時可能會以為編譯器會為空類生成預設建構函式等,事實上是不會的,編譯器只會在需要的時候生成6個成員函式 乙個預設的建構函式 乙個拷貝建構函式 乙個析構函式 乙個賦值...