C++分析構(gòu)造函數(shù)與析造函數(shù)的特點梳理
構(gòu)造函數(shù)的調(diào)用
默認情況下編譯器至少給一個類添加3個函數(shù)
1.默認構(gòu)造函數(shù)(無參,函數(shù)體實現(xiàn))--完成對象的初始化
2.默認析構(gòu)函數(shù)(無參,函數(shù)體為空)--完成對象的清理
3.默認拷貝構(gòu)造函數(shù),屬性進行值拷貝
規(guī)則:
如果用戶定義了有參構(gòu)造,c++不會提供無參構(gòu)造,但是提供默認拷貝構(gòu)造
如果用戶定義了拷貝構(gòu)造函數(shù),c++不會在提供其他函數(shù)
類名(){}
構(gòu)造函數(shù)的語法
1,沒有返回值,也不寫void;
2,函數(shù)名稱與類名相同;
3,構(gòu)造函數(shù)可以有參數(shù),因此可以發(fā)生重載;
4,程序在調(diào)用對象時會自動調(diào)用構(gòu)造函數(shù),無需手動調(diào)用且只調(diào)用一次
析造函數(shù)~類名()
1.析造函數(shù),沒有返回值也不寫void
2.函數(shù)名稱與類名相同在前面加上~
3.構(gòu)造函數(shù)不可以有參數(shù),因此不可以發(fā)生重載
4.程序在對象銷毀會自動調(diào)用析構(gòu),與構(gòu)造函數(shù)的調(diào)用規(guī)則相同
構(gòu)造函數(shù)的分類及調(diào)用
1.按照參數(shù)分類為 無參構(gòu)造和 有參構(gòu)造
class person { public: person() { cout<<"無參構(gòu)造的調(diào)用"<<endl; } person(int a) { cout<<"有參構(gòu)造的調(diào)用"<<endl; } };
2.按照類型分為 普通構(gòu)造和 拷貝構(gòu)造
person(const person& p) { }
拷貝構(gòu)造的語法
調(diào)用構(gòu)造函數(shù)的方法
void test() { //1.括號法 person p1;//默認無參構(gòu)造調(diào)用 person p2(10);//默認有參構(gòu)造的調(diào)用 preson p3(p2);//拷貝構(gòu)造的調(diào)用; //若是這樣寫 下面這行代碼會被認為是編譯器的聲明 person p1(); // void func(); // 無法完成函數(shù)的調(diào)用 2.顯示法 person p1; person p2=person(10); person p3=person(p2); // 匿名對象 person(10);//特點:當前行執(zhí)行結(jié)束后,系統(tǒng)會立即回收匿名對象 // 3.隱式轉(zhuǎn)換法 person p4=10;// 相當于 寫了 person p4 =person(10); person p5=p4; }
拷貝構(gòu)造的調(diào)用時機
1.使用一個已經(jīng)創(chuàng)建完畢的對象來初始化一個新對象
2.值傳遞的形式給函數(shù)參數(shù)傳值
class p { }; void dowork(person p )//形參p { } void test02() { person p; dowork(p);// 相當于發(fā)生了隱式類型轉(zhuǎn)換 傳入值拷貝 person p=p; }
3.值方式返回局部對象
深拷貝與淺拷貝
如果利用編譯器提供的拷貝構(gòu)造函數(shù)
會做淺(值)拷貝的操作(會使得new的對象指針指向同一個地址),會帶來對堆區(qū)內(nèi)存持續(xù)釋放的問題
如果堆區(qū)開辟了內(nèi)存,可以在析構(gòu)函數(shù)中釋放;
對于拷貝構(gòu)造函數(shù),可以自己實現(xiàn)一個拷貝構(gòu)造函數(shù)(深拷貝)(new一個新的對象實現(xiàn)拷貝構(gòu)造)
總結(jié): 如果屬性有在堆區(qū)開辟,一定要自己提供拷貝構(gòu)造函數(shù),防止淺拷貝帶來的問題
初始化列表
c++提供了初始化列表語法用來初始化屬性
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ù)的特點梳理的文章就介紹到這了,更多相關(guān)C++構(gòu)造函數(shù)與析造函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++構(gòu)造析構(gòu)賦值運算函數(shù)應(yīng)用詳解
- C++淺析構(gòu)造函數(shù)的特性
- C++類與對象深入之構(gòu)造函數(shù)與析構(gòu)函數(shù)詳解
- C++超詳細講解構(gòu)造函數(shù)與析構(gòu)函數(shù)的用法及實現(xiàn)
- C++分析類的對象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
- 一起來學習C++的構(gòu)造和析構(gòu)
- C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載詳解
- C++編程析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)使用示例詳解
- C++類的構(gòu)造與析構(gòu)特點及作用詳解
相關(guān)文章
C語言中隊列的結(jié)構(gòu)和函數(shù)接口的使用示例
隊列只允許一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出FIFO的性質(zhì);隊列可用數(shù)組和鏈表 的方法實現(xiàn),使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組節(jié),出隊列時刪去首元素需要將整個數(shù)組前移,效率比較低2023-02-02C++實現(xiàn)stack與queue數(shù)據(jù)結(jié)構(gòu)的模擬
stack是一種容器適配器,專門用在具有后進先出操作的上下文環(huán)境中,其刪除只能從容器的一端進行 元素的插入與提取操作;隊列是一種容器適配器,專門用于在FIFO上下文(先進先出)中操作,其中從容器一端插入元素,另一端提取元素2023-04-04gazebo里通過節(jié)點發(fā)布topic讓關(guān)節(jié)轉(zhuǎn)動實現(xiàn)詳解
這篇文章主要介紹了gazebo里通過節(jié)點發(fā)布topic讓關(guān)節(jié)轉(zhuǎn)動實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12