对象的初始化和清理
對(duì)象的初始化和清理
構(gòu)造函數(shù)和析構(gòu)函數(shù)
對(duì)象的初始化和清理也是兩個(gè)非常重要的安全問(wèn)題
? 一個(gè)對(duì)象或者變量沒(méi)有初始狀態(tài),對(duì)其使用后果是未知
? 同樣的使用完一個(gè)對(duì)象或變量,沒(méi)有及時(shí)清理,也會(huì)造成一定的安全問(wèn)題
c++利用了構(gòu)造函數(shù)和析構(gòu)函數(shù)解決上述問(wèn)題,這兩個(gè)函數(shù)將會(huì)被編譯器自動(dòng)調(diào)用,完成對(duì)象初始化和清理工作。
對(duì)象的初始化和清理工作是編譯器強(qiáng)制要我們做的事情,因此如果我們不提供構(gòu)造和析構(gòu),編譯器會(huì)提供編譯器提供的構(gòu)造函數(shù)和析構(gòu)函數(shù)是空實(shí)現(xiàn)。
-
構(gòu)造函數(shù):主要作用在于創(chuàng)建對(duì)象時(shí)為對(duì)象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無(wú)須手動(dòng)調(diào)用
-
析構(gòu)函數(shù):主要作用在于對(duì)象銷(xiāo)毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一些清理工作。
構(gòu)造函數(shù)語(yǔ)法:類(lèi)名(){}
構(gòu)造函數(shù),沒(méi)有返回值也不寫(xiě)void
函數(shù)名稱(chēng)與類(lèi)名相同
構(gòu)造函數(shù)可以有參數(shù),因此可以發(fā)生重載
程序在調(diào)用對(duì)象時(shí)候會(huì)自動(dòng)調(diào)用構(gòu)造,無(wú)須手動(dòng)調(diào)用,而且只會(huì)調(diào)用一次
析構(gòu)函數(shù)語(yǔ)法: ~類(lèi)名(){}
析構(gòu)函數(shù),沒(méi)有返回值也不寫(xiě)void
函數(shù)名稱(chēng)與類(lèi)名相同,在名稱(chēng)前加上符號(hào) ~
析構(gòu)函數(shù)不可以有參數(shù),因此不可以發(fā)生重載
程序在對(duì)象銷(xiāo)毀前會(huì)自動(dòng)調(diào)用析構(gòu),無(wú)須手動(dòng)調(diào)用,而且只會(huì)調(diào)用一次
構(gòu)造函數(shù)的分類(lèi)及調(diào)用
兩種分類(lèi)方式:
? 按參數(shù)分為: 有參構(gòu)造和無(wú)參構(gòu)造
? 按類(lèi)型分為: 普通構(gòu)造和拷貝構(gòu)造
三種調(diào)用方式:
? 括號(hào)法
? 顯示法
? 隱式轉(zhuǎn)換法
#include <iostream> using namespace std;//1、構(gòu)造函數(shù)分類(lèi) // 按照參數(shù)分類(lèi)分為 有參和無(wú)參構(gòu)造 無(wú)參又稱(chēng)為默認(rèn)構(gòu)造函數(shù) // 按照類(lèi)型分類(lèi)分為 普通構(gòu)造和拷貝構(gòu)造class Person { public://無(wú)參(默認(rèn))構(gòu)造函數(shù)Person() {cout << "無(wú)參構(gòu)造函數(shù)!" << endl;}//有參構(gòu)造函數(shù)Person(int a) {age = a;cout << "有參構(gòu)造函數(shù)!" << endl;}//拷貝構(gòu)造函數(shù)Person(const Person& p) {age = p.age;cout << "拷貝構(gòu)造函數(shù)!" << endl;}//析構(gòu)函數(shù)~Person() {cout << "析構(gòu)函數(shù)!" << endl;} public:int age; };//2、構(gòu)造函數(shù)的調(diào)用 //調(diào)用無(wú)參構(gòu)造函數(shù) void test01() {Person p; //調(diào)用無(wú)參構(gòu)造函數(shù) }//調(diào)用有參的構(gòu)造函數(shù) void test02() {//2.1 括號(hào)法,常用Person p1(10);//注意1:調(diào)用無(wú)參構(gòu)造函數(shù)不能加括號(hào),如果加了編譯器認(rèn)為這是一個(gè)函數(shù)聲明//Person p2();//2.2 顯式法Person p2 = Person(10); Person p3 = Person(p2);//Person(10)單獨(dú)寫(xiě)就是匿名對(duì)象 當(dāng)前行結(jié)束之后,馬上析構(gòu)//2.3 隱式轉(zhuǎn)換法Person p4 = 10; // Person p4 = Person(10); Person p5 = p4; // Person p5 = Person(p4); //注意2:不能利用 拷貝構(gòu)造函數(shù) 初始化匿名對(duì)象 編譯器認(rèn)為是對(duì)象聲明//Person p5(p4); }int main() {//test01();test02();system("pause");return 0; }拷貝構(gòu)造函數(shù)調(diào)用時(shí)機(jī)
C++中拷貝構(gòu)造函數(shù)調(diào)用時(shí)機(jī)通常有三種情況
-
使用一個(gè)已經(jīng)創(chuàng)建完畢的對(duì)象來(lái)初始化一個(gè)新對(duì)象
-
值傳遞的方式給函數(shù)參數(shù)傳值
-
以值方式返回局部對(duì)象
test01();運(yùn)行結(jié)果
test02();運(yùn)行結(jié)果
test03();運(yùn)行結(jié)果
構(gòu)造函數(shù)調(diào)用規(guī)則
默認(rèn)情況下,c++編譯器至少給一個(gè)類(lèi)添加3個(gè)函數(shù)
1.默認(rèn)構(gòu)造函數(shù)(無(wú)參,函數(shù)體為空)
2.默認(rèn)析構(gòu)函數(shù)(無(wú)參,函數(shù)體為空)
3.默認(rèn)拷貝構(gòu)造函數(shù),對(duì)屬性進(jìn)行值拷貝
構(gòu)造函數(shù)調(diào)用規(guī)則如下:
-
如果用戶(hù)定義有參構(gòu)造函數(shù),c++不在提供默認(rèn)無(wú)參構(gòu)造,但是會(huì)提供默認(rèn)拷貝構(gòu)造
-
如果用戶(hù)定義拷貝構(gòu)造函數(shù),c++不會(huì)再提供其他構(gòu)造函數(shù)
總結(jié)
- 上一篇: 结构体案例
- 下一篇: 初始化列表||类对象作为类成员|| 静态