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