首先如果乙個類中什麼成員都沒有,簡稱為空類。空類中並不是什麼都沒有,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。分別為:
1.建構函式
2.析構函式
3.拷貝建構函式
4.賦值操作符過載
5.取位址操作符過載
6.const取位址操作符過載
建構函式用來給物件初始化成員的值,系統會自動呼叫,如果自己沒寫建構函式,則調動系統自動生成的建構函式。
class
date
// 2.帶參建構函式
date (
int year,
int month ,
int day )
private
:int _year ;
int _month ;
int _day ;};
void
main()
特點:
1.建構函式是乙個特殊的成員函式,名字與類名相同,無返回值。
2.建構函式的雖然名稱叫構造,但是需要注意的是建構函式的主要任務並不是開空間建立物件,而是初始化物件。
3.建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次。
4.建構函式可以過載。
注意:無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。
class
date
date (
int year =
1900
,int month =1,
int day =1)
private
:int _year ;
int _month ;
int _day ;};
void
test()
以上測試函式不能通過編譯,date d1; 語句存在二義性。
建構函式補充知識
與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的。而物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作(並不是釋放空間)。
特點:1. 析構函式名是在類名前加上字元 ~。
2. 無引數無返回值。
3. 乙個類有且只有乙個析構函式。若未顯式定義,系統會自動生成預設的析構函式。
4. 物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。
typedef
int datatype;
class
seqlist
~seqlist()
}private
:int
* _pdata ;
size_t _size;
size_t _capacity;
};
問題:既然編譯器能夠給我們生成建構函式和析構函式,那麼我們何必多此一舉自己實現這兩個函式呢?
在涉及指標傳參時如果不自己編寫建構函式和析構函式,會發生一些錯誤,這裡有乙個別人寫的例子可以幫助理解:
為什麼要自己寫建構函式和析構函式
用已存在的類型別物件建立新物件時由編譯器自動呼叫。
特點:1. 拷貝建構函式是建構函式的乙個過載形式。
2. 拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。
3. 若未顯示定義,系統生成預設的拷貝建構函式。 預設的拷貝建構函式物件按記憶體儲存按位元組序完成拷貝,這種拷貝我們叫做淺拷貝,或者值拷貝。
class
string
string
(const string & s)
string&
operator=(
const string& s)
cout <<
"=運算子過載"
函式名字為:關鍵字operator後面接需要過載的運算子符號
函式原型:返回值型別 operator操作符(引數列表)
注意:1.不能通過連線其他符號來建立新的操作符:比如operator@
2.過載操作符必須有乙個類型別或者列舉型別的運算元
3.用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不 能改變其含義作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的
4.操作符有乙個預設的形參this,限定為第乙個形參
5. .* 、:: 、sizeof 、?: 、. 注意以上5個運算子不能過載。
class
date
date (
const date& d)
date&
operator=(
const date& d)
//這裡對兩個date 物件之間賦值操作做了過載
return
*this;}
private
:int _year ;
int _month ;
int _day ;
};
編寫賦值運算子過載時注意:
1. 引數型別
2. 返回值 *this
3. 檢測是否自己給自己賦值
4. 乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝。
class
string
~string()
private
:char
* _str;};
intmain()
編譯器生成的預設賦值過載函式可以完成位元組序的值拷貝(淺拷貝),但是上面程式如不自己實現 =過載 ,在執行時會報錯。
因為編譯器的賦值過載函式只是將s2的"world"的位址拷貝下來給了s1;s2析構時會將這塊空間釋放,此時s1 s2共同使用了一塊空間,s1「world」所在的空間已經被釋放,當析構s1時就會重複free這塊空間,導致出錯;所以在涉及到指標的操作時,以上四種函式需要自己實現,不然可能會出現各種錯誤。
這兩個運算子一般不用重新定義,使用編譯器生成的預設取位址的過載即可,只有特殊情況,才需要過載,比如想讓別人獲取到指定的內容。這裡先見一下大概長啥樣就行了。
class
date
const date*
operator&(
)const
//const取位址操作符過載
private
:int _year ;
// 年
int _month ;
// 月
int _day ;
// 日
};
類的六個預設成員函式
類的六個預設成員函式 1.建構函式 2.拷貝建構函式 3.析構函式 4.賦值操作符過載 5.取位址操作符過載 6.const修飾的取位址操作符過載 建構函式 是乙個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內隻且只呼叫一次,以保證每個資料成員都有乙個合適的初...
類的六個預設成員函式
如果乙個類中什麼成員都沒有,則就是空類。但是空類中什麼都沒有嗎?其實並不是這樣的,任何類在我們不寫的情況下,都會自動生成下面六個預設成員函式。class date 無參的建構函式 date int year,int month,int day 有參的建構函式 這兩個建構函式構成了函式的過載,因為它們...
C 之類的六個預設成員函式
在c 類中同樣的預設成員函式一共有六個,即使使用者不定義,編譯器也可以給出。分別為 1 建構函式 2 析構函式 3 拷貝建構函式 4 賦值運算 5 取位址運算 6 const取位址運算 我們一下述程式為例驗證下上面說法 include using namespace std class comple...