日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

对象的初始化和清理

發(fā)布時(shí)間:2025/4/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对象的初始化和清理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(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)用一次

  • #include <iostream> using namespace std; #include <string> class Person { public://構(gòu)造函數(shù)Person(){cout << "Person的構(gòu)造函數(shù)調(diào)用" << endl;}//析構(gòu)函數(shù)~Person(){cout << "Person的析構(gòu)函數(shù)調(diào)用" << endl;}};void test01() {Person p; }int main() {test01();system("pause");return 0; }



    構(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ì)象

    #include <iostream> using namespace std; class Person { public:Person() {cout << "無(wú)參構(gòu)造函數(shù)!" << endl;mAge = 0;}Person(int age) {cout << "有參構(gòu)造函數(shù)!" << endl;mAge = age;}Person(const Person& p) {cout << "拷貝構(gòu)造函數(shù)!" << endl;mAge = p.mAge;}//析構(gòu)函數(shù)在釋放內(nèi)存之前調(diào)用~Person() {cout << "析構(gòu)函數(shù)!" << endl;} public:int mAge; };//1. 使用一個(gè)已經(jīng)創(chuàng)建完畢的對(duì)象來(lái)初始化一個(gè)新對(duì)象 void test01() {Person man(100); //p對(duì)象已經(jīng)創(chuàng)建完畢Person newman(man); //調(diào)用拷貝構(gòu)造函數(shù)Person newman2 = man; //拷貝構(gòu)造//Person newman3;//newman3 = man; //不是調(diào)用拷貝構(gòu)造函數(shù),賦值操作 }//2. 值傳遞的方式給函數(shù)參數(shù)傳值 //相當(dāng)于Person p1 = p; void doWork(Person p1) {} void test02() {Person p; //無(wú)參構(gòu)造函數(shù)doWork(p); }//3. 以值方式返回局部對(duì)象 Person doWork2() {Person p1;cout << (int *)&p1 << endl;return p1; }void test03() {Person p = doWork2();cout << (int *)&p << endl; }int main() {//test01();//test02();test03();system("pause");return 0; }

    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ù)

    #include <iostream> using namespace std; 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; };void test01() {Person p1(18);//如果不寫(xiě)拷貝構(gòu)造,編譯器會(huì)自動(dòng)添加拷貝構(gòu)造,并且做淺拷貝操作Person p2(p1);cout << "p2的年齡為: " << p2.age << endl; }void test02() {//如果用戶(hù)提供有參構(gòu)造,編譯器不會(huì)提供默認(rèn)構(gòu)造,會(huì)提供拷貝構(gòu)造Person p1; //此時(shí)如果用戶(hù)自己沒(méi)有提供默認(rèn)構(gòu)造,會(huì)出錯(cuò)Person p2(10); //用戶(hù)提供的有參Person p3(p2); //此時(shí)如果用戶(hù)沒(méi)有提供拷貝構(gòu)造,編譯器會(huì)提供//如果用戶(hù)提供拷貝構(gòu)造,編譯器不會(huì)提供其他構(gòu)造函數(shù)Person p4; //此時(shí)如果用戶(hù)自己沒(méi)有提供默認(rèn)構(gòu)造,會(huì)出錯(cuò)Person p5(10); //此時(shí)如果用戶(hù)自己沒(méi)有提供有參,會(huì)出錯(cuò)Person p6(p5); //用戶(hù)自己提供拷貝構(gòu)造 }int main() {test01();system("pause");return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的对象的初始化和清理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。