c++編譯器生成的預設函式
話題引入:
物件的賦值與複製是如何進行的?他們的區別是什麼?如果乙個空的自定義型別能否執行這些操作?
物件賦值:通過「= 」運算子過載
user a(10),b;
b = a;
物件複製:呼叫拷貝建構函式
user b;
user a(b); 或者
user a = b; //相當於user a(b); 也是呼叫拷貝建構函式
二者的區別:賦值是對乙個已經存在的物件進行賦值(已經實現定義了被賦值的物件),而複製是從無到有建立乙個新的物件,並使它與已有的物件相同。
淺複製與深複製:若物件中有指標成員,在複製時,只會將該指標成員的位址複製給新建立的物件,因此,兩個物件中的指標成員都指向了同一塊記憶體區域,在釋放時會出現重複釋放的問題。需要手動定義拷貝建構函式,在建構函式中將為指標變數分配新的記憶體,是不同物件的指標成員指向不同的記憶體區域。
用到拷貝建構函式的三種情況:
1、需要建立乙個新物件,並用另乙個同類物件對其進行初始化
2、函式的引數為類的物件時,在呼叫函式時需要建立乙個實參的拷貝,按實參複製乙個形參,系統是通過呼叫拷貝建構函式實現的
3、函式的返回值是類的物件:函式呼叫結束時,需要將函式中的物件複製乙個臨時物件,並傳給該函式的呼叫處。
user getuser()
int main()
getuser()函式呼叫結束時,getuser中建立的物件temp的生命週期結束(即將銷毀),所以不是將temp帶回main,而是在執行return語句時,呼叫user類的拷貝建構函式,按temp拷貝乙個新的、物件,然後將它賦值給user.
編譯器提供的預設函式:
以上提到了物件的拷貝構造和賦值運算,如果是自定義型別想進行這些操作,還需要額外的函式定義嗎?答案是:如果沒有特殊要求則不需要,編譯器已經給我們提供了預設實現。只是需要注意的是這些預設實現是按位複製的淺複製方式。
定義乙個空的c++類,例如
class empty
乙個空的class在c++編譯器處理過後就不再為空,編譯器會自動地為我們宣告一些member function,一般編譯過去就相當於
class empty
;
下面給出乙個完整實現這些函式的型別定義示例:
class student
;//建構函式
student::student()
//析構函式
student::~student()
//拷貝建構函式
student::student( const student& stu)
//賦值運算子
student& student::operator=( const student& stu)
bool student::operator==( const student& stu) const
編譯器預設生成的函式
拷貝控制函式包括 拷貝建構函式 拷貝賦值函式 移動建構函式 移動賦值函式 析構函式。1.建構函式 如果我們沒有定義任何建構函式,編譯器會為我們生成乙個預設的建構函式。如果定義了,則沒有預設建構函式,即不能以class item來定義物件了。因此,不管有沒有定義建構函式,最好自己定義下預設建構函式。2...
編譯器生成預設建構函式情況
1 類和物件 當乙個a類有預設建構函式,b類中包含a類物件,並且b類沒有建構函式,那麼編譯器會給b類生成預設建構函式 2 繼承 基類有預設的建構函式,派生類沒有顯示給出建構函式。這種情況下,因為建立派生類物件會呼叫基類的建構函式,所以編譯器認為有必要生成派生類建構函式,所以會生成乙個派生類的建構函式...
編譯器自動生成預設建構函式的情況
在程式設計師沒有為類定義預設建構函式的情況下,c 編譯器在某些情況下會自動生成預設建構函式。1.類中包含的其他有預設建構函式的類的物件 例如 class a private int data public a a a this data 10 class b private a m a int m ...