匿名对象的生命周期
調(diào)用構(gòu)造函數(shù)可以生成匿名對象
//對象做函數(shù)參數(shù) //1 研究拷貝構(gòu)造 //2 研究構(gòu)造函數(shù),析構(gòu)函數(shù)的調(diào)用順序//總結(jié) 構(gòu)造和析構(gòu)的調(diào)用順序#include <iostream> using namespace std;class ABCD { public:ABCD(int a, int b, int c){this->a = a;this->b = b;this->c = c;printf("ABCD() construct, a:%d,b:%d,c:%d \n", this->a, this->b, this->c);}~ABCD(){printf("~ABCD() construct,a:%d,b:%d,c:%d \n", this->a, this->b, this->c);}int getA() {return this->a;} protected: private:int a;int b;int c; };class MyE { public:MyE():abcd1(1,2,3),abcd2(4,5,6),m(100){cout<<"MyD()"<<endl;}~MyE(){cout<<"~MyD()"<<endl;}MyE(const MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(100) //在拷貝構(gòu)造函數(shù)中也要有初始化列表{printf("MyD(const MyD & obj)\n");}protected://private: public:ABCD abcd1; //c++編譯器不知道如何構(gòu)造abc1ABCD abcd2;const int m; //常量要在初始化列表中進行初始化};int doThing(MyE mye1) //在調(diào)用的時候?qū)φ{(diào)用copy構(gòu)造函數(shù) 《==》MyE mye1 =參數(shù)調(diào)用copy構(gòu)造函數(shù) {printf("doThing() mye1.abc1.a:%d \n", mye1.abcd1.getA()); //這種情況下是一個類中有另一個類的變量return 0; }int run2() {MyE myE;doThing(myE); // 執(zhí)行這個過程會調(diào)用 return 0; }// int run3() {printf("run3 start..\n");//匿名對象可以理解為臨時對象 一般系統(tǒng)自動的生成 如果一個函數(shù)返回一個對象 這個對象再返回時會生成一個臨時對象//咋執(zhí)行此代碼的時候 利用構(gòu)造函數(shù)生成一個匿名對象 執(zhí)行完此行代碼 //因為沒有外部接此匿名對象的變量 此匿名對象又被析構(gòu) ABCD(400, 500, 600); //臨時對象的生命周期 就在這一行// ABCD abcd = ABCD(100, 200, 300);//若直接調(diào)用構(gòu)造函數(shù)呢?//想調(diào)用構(gòu)造函數(shù)對abc對象進行再復制,可以嗎?//在構(gòu)造函數(shù)里面調(diào)用另外一個構(gòu)造函數(shù),會有什么結(jié)果?printf("run3 end\n");return 0; }int main() {//run2();run3();system("pause");return 0; } //對象做函數(shù)參數(shù) //1 研究拷貝構(gòu)造 //2 研究構(gòu)造函數(shù),析構(gòu)函數(shù)的調(diào)用順序//總結(jié) 構(gòu)造和析構(gòu)的調(diào)用順序#include <iostream> using namespace std;class ABCD { public:ABCD(int a, int b, int c){this->a = a;this->b = b;this->c = c;printf("ABCD() construct, a:%d,b:%d,c:%d \n", this->a, this->b, this->c);}~ABCD(){printf("~ABCD() construct,a:%d,b:%d,c:%d \n", this->a, this->b, this->c);}int getA() {return this->a;} protected: private:int a;int b;int c; };class MyE { public:MyE():abcd1(1,2,3),abcd2(4,5,6),m(100){cout<<"MyD()"<<endl;}~MyE(){cout<<"~MyD()"<<endl;}MyE(const MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(100) //在拷貝構(gòu)造函數(shù)中也要有初始化列表{printf("MyD(const MyD & obj)\n");}protected://private: public:ABCD abcd1; //c++編譯器不知道如何構(gòu)造abc1ABCD abcd2;const int m; //常量要在初始化列表中進行初始化};int doThing(MyE mye1) //在調(diào)用的時候?qū)φ{(diào)用copy構(gòu)造函數(shù) 《==》MyE mye1 =參數(shù)調(diào)用copy構(gòu)造函數(shù) {printf("doThing() mye1.abc1.a:%d \n", mye1.abcd1.getA()); //這種情況下是一個類中有另一個類的變量return 0; }int run2() {MyE myE;doThing(myE); // 執(zhí)行這個過程會調(diào)用 return 0; }// int run3() {printf("run3 start..\n");////匿名對象可以理解為臨時對象 一般系統(tǒng)自動的生成 如果一個函數(shù)返回一個對象 這個對象再返回時會生成一個臨時對象//咋執(zhí)行此代碼的時候 利用構(gòu)造函數(shù)生成一個匿名對象 執(zhí)行完此行代碼 //因為沒有外部接此匿名對象的變量 此匿名對象又被析構(gòu) //ABCD(400, 500, 600); //臨時對象的生命周期 就在這一行//會將匿名對象直接轉(zhuǎn)換成 abcd這個對象//這樣做就相當于使用匿名對象給 abcd對象賦值但是 C++編譯器優(yōu)化之后 直接就相當于 定義一個 abcd對象ABCD abcd = ABCD(100, 200, 300);//若直接調(diào)用構(gòu)造函數(shù)呢?//想調(diào)用構(gòu)造函數(shù)對abc對象進行再復制,可以嗎?//在構(gòu)造函數(shù)里面調(diào)用另外一個構(gòu)造函數(shù),會有什么結(jié)果?printf("run3 end\n");return 0; }int main() {//run2();run3();system("pause");return 0; }講一個匿名對象賦值給一個一個新生成的對象 那么匿名對象將會被直接轉(zhuǎn)換為 該對象 直到聲明的對象被釋放
總結(jié)
- 上一篇: 对象的初始化列表const变量的初始化
- 下一篇: 基于领域知识的Docker镜像自动构建方