類的6個預設成員函式
class
date()
;
對於上面這個類,他什麼成員都沒有,簡稱為空類。但是空類中真的什麼都沒有嗎?並不是如此,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。
1.建構函式
建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有乙個合適的初始值,並且在物件的生命週期內只呼叫一次。
特性1.函式名與類名相同
2.無返回值
3.物件例項化時候編譯器自動呼叫對用的建構函式
4.建構函式可以過載
class
date
//無參建構函式
date
(int year,
int month,
int day)
//帶參建構函式
private
:int _year;
int _month;
int _day;};
intmain()
5.如果類中沒有顯示定義建構函式,則c++編譯器會自動生成乙個無參的預設建構函式,一旦使用者顯式定義編譯器將不再生成。
class
date
;int
main()
6.無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。一般我們都使用全預設的建構函式。
class date
//預設建構函式只能有乙個,如果兩個同時存在,建立物件時編譯器會報錯。
date
(int year =0,
int month =1,
int day =1)
private:
int _year;
int _month;
int _day;
};
7.c++把型別分為內建型別(int/char…)和自定義型別(class/struct/union),編譯器預設生成的建構函式會對自定義型別成員呼叫它的預設成員函式。
class
time
private
:int _hour;};
class
date
;int
main()
2.析構函式
與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是有編譯器完成的,而物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作。
特性1.析構函式名是在類名前加上字元~。
2.無參無返回值。
3.乙個類只有乙個析構函式。若未定義,系統會自動生成預設的析構函式。
4.物件生命週期結束時,c++編譯系統自動呼叫析構函式。
class
seqlist
~seqlist()
private
:int
* _a;
int _size;
int _capacity;
};
5.編譯器預設生成的析構函式和建構函式一樣,會對自定義型別成員呼叫它的預設成員函式。
3.拷貝建構函式
拷貝建構函式是另類的建構函式,它只有單個形參,該形參是對本類型別物件的引用,在用已存在的類型別物件建立新物件時由編譯器自動呼叫。
特性1.拷貝建構函式是建構函式的乙個過載形式
2.拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。
class
date
date
(const date& d)
//拷貝建構函式
private
:int _year;
int _month;
int _day;};
intmain()
3.若未定義,系統生成預設的拷貝建構函式。預設的拷貝建構函式物件按記憶體儲存位元組序完成拷貝,這種拷貝叫做淺拷貝。既然編譯器生成的預設拷貝函式已經可以完成位元組序的值拷貝,我們還需要自己實現嗎?
//下面這個程式會崩潰
class
seqlist
~seqlist()
private
:int
* _a;
int _size;
int _capacity;};
intmain()
對於seqlist類,由於系統預設生成的拷貝建構函式是淺拷貝,所以s.a和s1.a指向的是同一片位址空間,在最後呼叫析構函式對物件進行銷毀時,會將這一片空間釋放兩次,導致程式崩潰。所以對於一些特殊的類,我們需要自己實現拷貝建構函式。
4.賦值運算子過載
c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有返回值型別。
返回值型別 operator操作符(引數列表)
全域性的operator==class
date
//private:
int _year;
int _month;
int _day;};
//全域性的運算子過載需要成員變數是共有的,無法保證封裝性。
//為了保證封裝性,我們一般將其過載為成員函式
bool
operator==(
const date& d1,
const date& d2)
intmain()
class
date
//作為類成員的過載函式時,操作符有乙個預設的形參this,限定為第乙個形參。
//bool operator==(date* this, const date& d)
bool
operator==(
const date& d)
private
:int _year;
int _month;
int _day;
};
賦值運算子過載date&
operator=(
const date& d)
return
*this
;//返回*this
}
乙個類如果沒有定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝。所以它和拷貝建構函式有一樣的問題,對於一些特殊的類,我們需要自己實現賦值運算子過載。
5.取位址及const取位址操作符過載
在此之前我們先了解一下const成員。
const修飾類的成員函式
將const修飾的類成員函式稱之為const成員函式,const修飾類成員函式實際修飾該成員函式的隱含的this指標,表明在該成員函式中不能對類的任何成員進行修改。
class
date
private
:int _year;
int _month;
int _day;};
void
func
(const date& d1)
intmain()
我們知道,在呼叫成員函式時,會有乙個隱含的this指標。
如果定義了乙個const修飾的物件,它在呼叫成員函式時,這個成員函式沒有用const修飾,編譯器會報錯。因為const不能傳給非const。
取位址操作符的過載
這兩個預設成員函式一般不需要重新定義,編譯器預設生成。只有特殊情況需要,比如想讓別獲取到指定的內容。
class
date
const date*
operator&(
)const
private
:int _year;
int _month;
int _day;};
intmain()
類與物件02
記憶體分析 成員變數與區域性變數比較 成員變數 1 位於類中方法外 2 作用於類中 3 宣告後可以不賦值,系統會給乙個預設值 注意 成員是屬於物件的,跟隨物件一起使用 區域性變數 1 位於方法中 2 作用於方法中 3 宣告後必須賦值 public class sum static關鍵字satic是成...
C 類與物件
程式設計模型 所有計算機均由兩種元素組成 和資料.精確的說,有些程式是圍繞著 什麼正在發生 而編寫,有些則是圍繞 誰正在受影響 而編寫的.抽象封裝 封裝是一種把 和 所操作的資料 在一起,使這兩者不受外界干擾和誤用的機制.繼承 繼承是指乙個物件從另乙個物件中獲得屬性的過程.是物件導向程式設計的三大原...
C 類與物件
c 類與物件 區分物件導向與面向過程 物件導向是指一種程式設計范型,同時也是一種程式開發的方法。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性 靈活性和擴充套件性。物件導向 利用物件間的訊息傳遞來驅動程式的執行。優點 真實表現客觀世界,物件間的關係清晰,物件間的訊息處理高效。面...