目錄
1. 我們在經(jīng)常忘記寫或者調(diào)用初始化函數(shù)使得棧類中的變量是隨機值,易出錯有時忘記調(diào)用銷毀函數(shù),導致內(nèi)存泄漏
2.構造函數(shù)
2.2 構造函數(shù)的特性
3. 析構函數(shù)
3.1 概念
3.2 特性
3.3 深入了解?
1. 我們在經(jīng)常忘記寫或者調(diào)用初始化函數(shù)使得棧類中的變量是隨機值,易出錯有時忘記調(diào)用銷毀函數(shù),導致內(nèi)存泄漏
這里就引出了構造和析構函數(shù)
2.構造函數(shù)
2.1 特性:
- 函數(shù)名與類名相同
- 無返回值
- 對象實例化時自動調(diào)用對應的構造函數(shù)
- 構造函數(shù)可以重載
這里我們注意一下:
構造函數(shù)是特殊的成員函數(shù)
不能將它與普通函數(shù)對比
構造函數(shù)的任務是初始化對象
而不是開辟空間創(chuàng)造對象
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1.Init(2022, 7, 5);
d1.Print();
Date d2;
d2.Init(2022, 7, 6);
d2.Print();
return 0;
}
構造函數(shù)是一個特殊的成員函數(shù),名字與類名相同,創(chuàng)建類類型對象時由編譯器自動調(diào)用,以保證
每個數(shù)據(jù)成員都有 一個合適的初始值,并且在對象整個生命周期內(nèi)只調(diào)用一次
?
2.2 構造函數(shù)的特性
構造函數(shù)是一個特殊的成員函數(shù),名字與類名相同,創(chuàng)建類類型對象時由編譯器自動調(diào)用,以保證
每個數(shù)據(jù)成員都有 一個合適的初始值,并且在對象整個生命周期內(nèi)只調(diào)用一次
class Date
{
public:
/*
// 如果用戶顯式定義了構造函數(shù),編譯器將不再生成
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
*/
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
// 將Date類中構造函數(shù)屏蔽后,代碼可以通過編譯,因為編譯器生成了一個無參的默認構造函數(shù)
// 將Date類中構造函數(shù)放開,代碼編譯失敗,因為一旦顯式定義任何構造函數(shù),編譯器將不再生成
// 無參構造函數(shù),放開后報錯:error C2512: “Date”: 沒有合適的默認構造函數(shù)可用
Date d1;
return 0;
}
將Date類中構造函數(shù)放開,代碼編譯失敗,因為一旦顯式定義任何構造函數(shù),編譯器將不再
生成
?無參構造函數(shù),放開后報錯:error C2512: “Date”: 沒有合適的默認構造函數(shù)可用
?
無參的構造函數(shù)和全缺省的構造函數(shù)都稱為默認構造函數(shù),并且默認構造函數(shù)只能有一個。
注意:無參構造函數(shù)、全缺省構造函數(shù)、我們沒寫編譯器默認生成的構造函數(shù),都可以認為
是默認構造函數(shù)
?
3. 析構函數(shù)
3.1 概念
與構造函數(shù)功能相反,析構函數(shù)不是完成對對象本身的銷毀,局部對象銷毀工作是由
編譯器完成的。而對象在銷毀時會自動調(diào)用析構函數(shù),完成對象中資源的清理工作
3.2 特性
析構函數(shù)是特殊的成員函數(shù),其特征如下:
1. 析構函數(shù)名是在類名前加上字符 ~
2. 無參數(shù)無返回值類型
3. 一個類只能有一個析構函數(shù)。若未顯式定義,系統(tǒng)會自動生成默認的析構函數(shù)。注意:析構函數(shù)不能重載
4. 對象生命周期結束時,C++編譯系統(tǒng)系統(tǒng)自動調(diào)用析構函數(shù)
?
3.3 深入了解?
下面的程序我們會看到,編譯器生成的默認析構函數(shù),對自定類型成員調(diào)用它的析構函數(shù)
class Time
{
public:
~Time()
{
cout << "~Time()" << endl;
}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
private:
// 基本類型(內(nèi)置類型)
int _year = 1970;
int _month = 1;
int _day = 1;
// 自定義類型
Time _t;
};
int main()
{
Date d;
return 0;
}
在main方法中根本沒有直接創(chuàng)建Time類的對象,為什么最后會調(diào)用Time類的析構函數(shù)?
因為:main方法中創(chuàng)建了Date對象d,而d中包含4個成員變量,其中_year, _month,
_day三個是內(nèi)置類型成員,銷毀時不需要資源清理,最后系統(tǒng)直接將其內(nèi)存回收即可;而_t是Time類對象,所以在d銷毀時,要將其內(nèi)部包含的Time類的_t對象銷毀,所以要調(diào)用Time類的析構函數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-623966.html
但是,main函數(shù)?中不能直接調(diào)用Time類的析構函數(shù),實際要釋放的是Date類對象,所以編譯器會調(diào)用Date類的析構函數(shù),而Date沒有顯式提供,則編譯器會給Date類生成一個默認的析構函數(shù),目的是在其內(nèi)部調(diào)用Time類的析構函數(shù),即當Date對象銷毀時,要保證其內(nèi)部每個自定義對象都可以正確銷毀
main函數(shù)中并沒有直接調(diào)用Time類析構函數(shù),而是顯式調(diào)用編譯器為Date類生成的默認析
構函數(shù)
?文章來源地址http://www.zghlxwxcb.cn/news/detail-623966.html
到了這里,關于C++初階——構造和析構函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!