C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理
構(gòu)造函數(shù)的調(diào)用
默認(rèn)情況下編譯器至少給一個(gè)類(lèi)添加3個(gè)函數(shù)
1.默認(rèn)構(gòu)造函數(shù)(無(wú)參,函數(shù)體實(shí)現(xiàn))--完成對(duì)象的初始化
2.默認(rèn)析構(gòu)函數(shù)(無(wú)參,函數(shù)體為空)--完成對(duì)象的清理
3.默認(rèn)拷貝構(gòu)造函數(shù),屬性進(jìn)行值拷貝
規(guī)則:
如果用戶定義了有參構(gòu)造,c++不會(huì)提供無(wú)參構(gòu)造,但是提供默認(rèn)拷貝構(gòu)造
如果用戶定義了拷貝構(gòu)造函數(shù),c++不會(huì)在提供其他函數(shù)
類(lèi)名(){}
構(gòu)造函數(shù)的語(yǔ)法
1,沒(méi)有返回值,也不寫(xiě)void;
2,函數(shù)名稱(chēng)與類(lèi)名相同;
3,構(gòu)造函數(shù)可以有參數(shù),因此可以發(fā)生重載;
4,程序在調(diào)用對(duì)象時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),無(wú)需手動(dòng)調(diào)用且只調(diào)用一次
析造函數(shù)~類(lèi)名()
1.析造函數(shù),沒(méi)有返回值也不寫(xiě)void
2.函數(shù)名稱(chēng)與類(lèi)名相同在前面加上~
3.構(gòu)造函數(shù)不可以有參數(shù),因此不可以發(fā)生重載
4.程序在對(duì)象銷(xiāo)毀會(huì)自動(dòng)調(diào)用析構(gòu),與構(gòu)造函數(shù)的調(diào)用規(guī)則相同
構(gòu)造函數(shù)的分類(lèi)及調(diào)用
1.按照參數(shù)分類(lèi)為 無(wú)參構(gòu)造和 有參構(gòu)造
class person
{
public:
person()
{
cout<<"無(wú)參構(gòu)造的調(diào)用"<<endl;
}
person(int a)
{
cout<<"有參構(gòu)造的調(diào)用"<<endl;
}
};2.按照類(lèi)型分為 普通構(gòu)造和 拷貝構(gòu)造
person(const person& p)
{
}拷貝構(gòu)造的語(yǔ)法
調(diào)用構(gòu)造函數(shù)的方法
void test()
{
//1.括號(hào)法
person p1;//默認(rèn)無(wú)參構(gòu)造調(diào)用
person p2(10);//默認(rèn)有參構(gòu)造的調(diào)用
preson p3(p2);//拷貝構(gòu)造的調(diào)用;
//若是這樣寫(xiě) 下面這行代碼會(huì)被認(rèn)為是編譯器的聲明
person p1(); // void func();
// 無(wú)法完成函數(shù)的調(diào)用
2.顯示法
person p1;
person p2=person(10);
person p3=person(p2);
// 匿名對(duì)象
person(10);//特點(diǎn):當(dāng)前行執(zhí)行結(jié)束后,系統(tǒng)會(huì)立即回收匿名對(duì)象
// 3.隱式轉(zhuǎn)換法
person p4=10;// 相當(dāng)于 寫(xiě)了 person p4 =person(10);
person p5=p4;
}拷貝構(gòu)造的調(diào)用時(shí)機(jī)
1.使用一個(gè)已經(jīng)創(chuàng)建完畢的對(duì)象來(lái)初始化一個(gè)新對(duì)象
2.值傳遞的形式給函數(shù)參數(shù)傳值
class p
{
};
void dowork(person p )//形參p
{
}
void test02()
{
person p;
dowork(p);// 相當(dāng)于發(fā)生了隱式類(lèi)型轉(zhuǎn)換 傳入值拷貝 person p=p;
}3.值方式返回局部對(duì)象
深拷貝與淺拷貝
如果利用編譯器提供的拷貝構(gòu)造函數(shù)

會(huì)做淺(值)拷貝的操作(會(huì)使得new的對(duì)象指針指向同一個(gè)地址),會(huì)帶來(lái)對(duì)堆區(qū)內(nèi)存持續(xù)釋放的問(wèn)題
如果堆區(qū)開(kāi)辟了內(nèi)存,可以在析構(gòu)函數(shù)中釋放;
對(duì)于拷貝構(gòu)造函數(shù),可以自己實(shí)現(xiàn)一個(gè)拷貝構(gòu)造函數(shù)(深拷貝)(new一個(gè)新的對(duì)象實(shí)現(xiàn)拷貝構(gòu)造)
總結(jié): 如果屬性有在堆區(qū)開(kāi)辟,一定要自己提供拷貝構(gòu)造函數(shù),防止淺拷貝帶來(lái)的問(wèn)題
初始化列表
c++提供了初始化列表語(yǔ)法用來(lái)初始化屬性


class person
{
person(int a,int b,int c):m_a(a),m_b(b),m_c(c);
{
}
int m_a;
int m_b;
int m_c;
};到此這篇關(guān)于C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理的文章就介紹到這了,更多相關(guān)C++構(gòu)造函數(shù)與析造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++構(gòu)造析構(gòu)賦值運(yùn)算函數(shù)應(yīng)用詳解
- C++淺析構(gòu)造函數(shù)的特性
- C++類(lèi)與對(duì)象深入之構(gòu)造函數(shù)與析構(gòu)函數(shù)詳解
- C++超詳細(xì)講解構(gòu)造函數(shù)與析構(gòu)函數(shù)的用法及實(shí)現(xiàn)
- C++分析類(lèi)的對(duì)象作類(lèi)成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
- 一起來(lái)學(xué)習(xí)C++的構(gòu)造和析構(gòu)
- C++繼承中的對(duì)象構(gòu)造與析構(gòu)和賦值重載詳解
- C++編程析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)使用示例詳解
- C++類(lèi)的構(gòu)造與析構(gòu)特點(diǎn)及作用詳解
相關(guān)文章
C語(yǔ)言矩陣連乘 (動(dòng)態(tài)規(guī)劃)詳解
這篇文章主要介紹了C語(yǔ)言矩陣連乘 (動(dòng)態(tài)規(guī)劃)詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
C++實(shí)現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法
這篇文章主要介紹了C++實(shí)現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法,對(duì)于C++程序算法設(shè)計(jì)有一定的借鑒價(jià)值,需要的朋友可以參考下2014-09-09
C++?自增自減運(yùn)算符的實(shí)現(xiàn)示例
本文主要介紹了C++?自增自減運(yùn)算符的實(shí)現(xiàn)示例,自增和自減運(yùn)算符在C++中主要用于循環(huán)語(yǔ)句中,使循環(huán)變量的值自動(dòng)+1或者-1,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
基于Matlab實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識(shí)別
道路交通標(biāo)志用以禁止、警告、指示和限制道路使用者有秩序地使用道路,?保障出行安全.若能自動(dòng)識(shí)別道路交通標(biāo)志,?則將極大減少道路交通事故的發(fā)生。本文將介紹基于Matlab實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識(shí)別,感興趣的可以學(xué)習(xí)一下2022-01-01
Prim(普里姆)算法求最小生成樹(shù)的思想及C語(yǔ)言實(shí)例講解
Prim算法能夠在帶權(quán)的圖中搜索出最小生成樹(shù),這也是各大ACM和面試及考研題目中的熱點(diǎn),下面我們就來(lái)詳細(xì)看一下Prim(普里姆)算法求最小生成樹(shù)的思想及C語(yǔ)言實(shí)例講解2016-06-06
C語(yǔ)言中0數(shù)組\柔性數(shù)組的使用詳解
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中0數(shù)組\柔性數(shù)組使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

