重新梳理一下知識
C++自動提供的成員函數,有:默認構造函數,復制構造函數,默認析構函數,賦值操作符,地址操作符即this指針
1默認構造函數
c++可以在將創建對象的初始化工作放在函數體內完成
特點:a構造函數是與所在類同名的函數
b構造函數沒有返回值
c構造函數可以重載
d構造函數的作用是為類對象的數據成員賦初值
e構造函數又定義類對象時由系統自動調用,不許像其他函數一樣直接由用戶調用
f構造函數一般是類的public成員
g系統默認的構造函數是X(){} 她只負責對象的創建,不做任何的初始化工作。一點有了構造函數,則系統提供的構造函數不再存在了。
2復制構造函數
用一個以存在的對象來構造一個新的對象,會調用構造函數,這是調用的是一種特殊的構造函數,也就是復制構造函數
同構造函數一樣,如果沒有定義復制構造函數,系統會提供一個默認的復制構造函數,該默認扶著構造函數會自動完成將一個已知對象的數據成員復制到另一個對象的數據成員中的是所有操作 復制構造函數有一個特點,函數只有一個參數,並且是該類對象的引用。
類名::類名(類名&引用名)
{//函數體}
一般的默認復制構造函數可以完成任務,但是單對象具有一些指成員是許願自己定義復制構造函數。
指針指向同一的數組型動態堆空間叫做淺復制;
兩個對象的指針成員指向不同的動態空間叫做深復制;
何時生成臨時對象:
情形1:按值傳遞對象注意是按值傳遞對象,按值傳遞意味著會創建一個原始對象的副本,
情形2:函數反回對象時。
情形3:用一個對象初始化另一個對象時即復制初始化,語句hyong x=y和hyong x=hyong(y)這裡y是hyong類型的對象。都將調用復制構造函數,但有可能創建臨時對象也有可能不創建臨時對象而用復制構造函數直接初始化對象,這取決於編譯器。
3默認析構函數
其名字和類名相同,在名字前加~
有如下特點:
a同類名,加~
b沒有返回值,無參數,不能重載,訪問控制一般問為public
c對象撤銷時由系統自己調用
d堆非動態對象,程序執行離開時他的作用域自動被撤銷,對動態對象,對齊delete才能撤銷
e沒定義,自動有一個~X(){}
f調用的次序很構造相反,也就是說後構造先析構
4賦值操作符
賦值操作符即“=”。賦值操作符為二元操作數,其操作目的是將右操作數的值復制給左操作數。由於左值涉及到寫操作,因此左值必須為非const量,而右值在賦值操作中只涉及讀操作,因此一般為const量。
class A {public: int b; A(){b=1;} A(int i){ b=i;}
const A & operator =(const A & j) //重載賦值運算符必須是類的成員,重載賦值運算符應反回一個類的對象的引用。
{ if( this==&j) return *this; //用this和j的地址來檢查是否是對自身的賦值的情況,如果調用賦值運算符函數的地址和被賦值的對象的地址相等,則說明是同一個對象,就反回當前對象。
b=j.b; return *this;} };
5地址操作符即this指針
用處:當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象本身的地址作為一個隱含參數傳遞給函數。也就是說,即使你沒有寫上this指針,編譯器在編譯的時候也是加上this的,它作為非靜態成員函數的隱含形參,對各成員的訪問均通過this進行。
使用:一種情況就是,在類的非靜態成員函數中返回類對象本身的時候,直接使用 return *this;另外一種情況是當參數與成員變量名相同時,如this->n = n (不能寫成n = n)。
當你進入一個房子後,
你可以看見桌子、椅子、地板等,
但是房子你是看不到全貌了。
對於一個類的實例來說,
你可以看到它的成員函數、成員變量,
但是實例本身呢?
this是一個指針,它時時刻刻指向你這個實例本身