对象的初始化列表const变量的初始化
生活随笔
收集整理的這篇文章主要介紹了
对象的初始化列表const变量的初始化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
當(dāng)B類中有A類并且A類還有自己的有參數(shù)構(gòu)造函數(shù)的時(shí)候,那這時(shí)若是B再使用默認(rèn)構(gòu)造函數(shù)就不能使用了,因?yàn)锽不能對(duì)A進(jìn)行初始化;
#include <iostream> using namespace std;class A { public:A(int _a){a = _a; } protected: private:int a; }; class B { public: protected: private:int b1;;int b2;A a1;A a2;}; int main() {A a1(10);B objB; //在調(diào)用objB的時(shí)候沒有機(jī)會(huì)調(diào)用A的初始化函數(shù),給A中的變量分配內(nèi)存所以不能使用cout << "hello world!" << endl;system("pause");return 0; }解決辦法:使用對(duì)象初始化列表
#include <iostream> using namespace std;class A { public:A(int _a){a = _a; cout << "構(gòu)造函數(shù)a = " << a<<endl;}~A( ){cout <<"析構(gòu)函數(shù)a" << endl;} protected: private:int a; }; //構(gòu)造函數(shù)的初始化列表,解決了在B類中 組合了一個(gè)其他類的對(duì)象(A類) A中使用了有參數(shù)構(gòu)造函數(shù) //根據(jù)構(gòu)造函數(shù)的調(diào)用規(guī)則 設(shè)計(jì)了A的構(gòu)造函數(shù) 就必須使用A的構(gòu)造函數(shù) 但是沒有機(jī)會(huì)使用 A的構(gòu)造函數(shù) //這時(shí) 構(gòu)造函數(shù)額的初始化列表就排上用場(chǎng) class B { public:B(int _b1,int _b2): a1(1),a2(2) //構(gòu)造函數(shù)的初始化列表{}//參數(shù)傳遞B(int _b1,int _b2,int m,int n): a1(m),a2(n) //構(gòu)造函數(shù)的初始化列表{b1 =_b1;b2 =_b2;cout << "B的構(gòu)造函數(shù)" << endl;}~B(){cout <<"這是B的析構(gòu)函數(shù)" << endl;} protected: private:int b1;int b2;A a2; //把a(bǔ)2放到上面是為了測(cè)試 被組合對(duì)象構(gòu)造函數(shù)的調(diào)用順序是跟定義的順序相關(guān) 而不是列表初始化的順序A a1; //A類已經(jīng)有定義的有參構(gòu)造函數(shù) 若B中使用 就要使用 初始化列表}; void display() {B objB1(1,2,3,4); } //首先在執(zhí)行被組合對(duì)象的構(gòu)造函數(shù) //如果被組合對(duì)象有多個(gè) 按照被組合對(duì)象定義的順序 而不是按照 初始化列表的順序、//析構(gòu)函數(shù)和構(gòu)造函數(shù)的調(diào)用順序相反 int main() { // A a1(10); // B objB(1,2); //在調(diào)用objB的時(shí)候沒有機(jī)會(huì)調(diào)用A的初始化函數(shù),給A中的變量分配內(nèi)存所以不能使用display();cout << "hello world!" << endl;system("pause");return 0; }執(zhí)行的結(jié)果:
從結(jié)果上可以看出被組合對(duì)象,構(gòu)造函數(shù)的調(diào)用的順序是和定義的順序相關(guān)而不是初始化列表初始化的順序;
當(dāng)一個(gè)類中有 const類型的變量的時(shí)候 要使用初始化列表進(jìn)行初始化
#include <iostream> using namespace std;class A { public:A(int _a){a = _a; cout << "構(gòu)造函數(shù)a = " << a<<endl;}~A( ){cout <<"析構(gòu)函數(shù)a" << endl;} protected: private:int a; }; //構(gòu)造函數(shù)的初始化列表,解決了在B類中 組合了一個(gè)其他類的對(duì)象(A類) A中使用了有參數(shù)構(gòu)造函數(shù) //根據(jù)構(gòu)造函數(shù)的調(diào)用規(guī)則 設(shè)計(jì)了A的構(gòu)造函數(shù) 就必須使用A的構(gòu)造函數(shù) 但是沒有機(jī)會(huì)使用 A的構(gòu)造函數(shù) //這時(shí) 構(gòu)造函數(shù)額的初始化列表就排上用場(chǎng) //初始化 列表用來給const 類型變量初始化 class B { public:B(int _b1,int _b2): a1(1),a2(2),c(0) //構(gòu)造函數(shù)的初始化列表{}//參數(shù)傳遞B(int _b1,int _b2,int m,int n): a1(m),a2(n),c(0) //構(gòu)造函數(shù)的初始化列表 const 類型變量必須在 初始化成{b1 =_b1;b2 =_b2;cout << "B的構(gòu)造函數(shù)" << endl;}~B(){cout <<"這是B的析構(gòu)函數(shù)" << endl;} protected: private:int b1;int b2;A a2; //把a(bǔ)2放到上面是為了測(cè)試 被組合對(duì)象構(gòu)造函數(shù)的調(diào)用順序是跟定義的順序相關(guān) 而不是列表初始化的順序A a1; //A類已經(jīng)有定義的有參構(gòu)造函數(shù) 若B中使用 就要使用 初始化列表const int c; //如果類的成員中有const 類型的成員變量則必須在 初始化了,列表中進(jìn)行初始化}; void display() {B objB1(1,2,3,4); } //首先在執(zhí)行被組合對(duì)象的構(gòu)造函數(shù) //如果被組合對(duì)象有多個(gè) 按照被組合對(duì)象定義的順序 而不是按照 初始化列表的順序、//析構(gòu)函數(shù)和構(gòu)造函數(shù)的調(diào)用順序相反 int main() { // A a1(10); // B objB(1,2); //在調(diào)用objB的時(shí)候沒有機(jī)會(huì)調(diào)用A的初始化函數(shù),給A中的變量分配內(nèi)存所以不能使用display();cout << "hello world!" << endl;system("pause");return 0; }綜合
//對(duì)象做函數(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; //常量要在初始化列表中進(jìn)行初始化};int doThing(MyE mye1) //在調(diào)用函數(shù)的時(shí)候也會(huì)調(diào)用 copy構(gòu)造函數(shù) {printf("doThing() mye1.abc1.a:%d \n", mye1.abcd1.getA()); //這種情況下是一個(gè)類中有另一個(gè)類的變量return 0; }int run2() {MyE myE;doThing(myE);return 0; }// int run3() {printf("run3 start..\n");//ABCD(400, 500, 600); //臨時(shí)對(duì)象的生命周期 ABCD abcd = ABCD(100, 200, 300);//若直接調(diào)用構(gòu)造函數(shù)呢?//想調(diào)用構(gòu)造函數(shù)對(duì)abc對(duì)象進(jìn)行再?gòu)?fù)制,可以嗎?//在構(gòu)造函數(shù)里面調(diào)用另外一個(gè)構(gòu)造函數(shù),會(huì)有什么結(jié)果?printf("run3 end\n");return 0; }int main() {run2();run3();system("pause");return 0; }結(jié)果:
“demotest.exe”: 已加載“E:\VS2008\demotest\Debug\demotest.exe”,已加載符號(hào)。 “demotest.exe”: 已加載“C:\Windows\SysWOW64\ntdll.dll” “demotest.exe”: 已加載“C:\Windows\SysWOW64\kernel32.dll” “demotest.exe”: 已加載“C:\Windows\SysWOW64\KernelBase.dll” “demotest.exe”: 已加載“C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2\msvcp90d.dll”,已加載符號(hào)。 “demotest.exe”: 已加載“C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2\msvcr90d.dll”,已加載符號(hào)。 “demotest.exe”: 已加載“C:\Windows\SysWOW64\apphelp.dll” “demotest.exe”: 已加載“ImageAtBase0x4a2d0000”,未加載任何符號(hào)。 “demotest.exe”: 已卸載“ImageAtBase0x4a2d0000” 程序“[3204] demotest.exe: 本機(jī)”已退出,返回值為 0 (0x0)。總結(jié)
以上是生活随笔為你收集整理的对象的初始化列表const变量的初始化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “数据资产化”线上论坛圆满结束!
- 下一篇: 匿名对象的生命周期