C++学习笔记-----在一个构造函数中调用另一个构造函数
在構(gòu)造函數(shù)中調(diào)用另一個(gè)構(gòu)造函數(shù)如果一不注意就會(huì)有無(wú)限遞歸的危險(xiǎn),而且構(gòu)造函數(shù)的參數(shù)的不同也決定了調(diào)用的不同,所以特意總結(jié)了一下哪些形式的調(diào)用時(shí)允許的:
首先假設(shè)構(gòu)造函數(shù)調(diào)用時(shí)參數(shù)都是外部的變量,而不是一個(gè)常量。
第一種,也是C++11支持的一種調(diào)用方式。在函數(shù)的初始化列表中調(diào)用另一個(gè)構(gòu)造函數(shù):
int b = 2; class Test { public:Test() : Test(b) {} //在初始化列表調(diào)用Test(int a)Test(int a) : p(a) {}~Test() {}int get() { return p; } private:int p; };
第二種,用this指針顯示調(diào)用構(gòu)造函數(shù):
int b = 2; class Test { public:Test(){this->Test::Test(b); //通過this指針顯式調(diào)用Test(int a)}Test(int a) : p(a) {}~Test() {}int get() { return p; } private:int p; };這種方法一定不能忘記加上作用域,不然編譯無(wú)法通過!
第三種,在原始內(nèi)存覆蓋:
int b = 2; class Test { public:Test(){new (this) Test(b);}Test(int a) : p(a) {}~Test() {}int get() { return p; } private:int p; };使用new (void*p) Type(...),這種語(yǔ)句的意思是不重新分配內(nèi)存,而是直接覆蓋在原內(nèi)存上。就本例而言,定義一個(gè)Test類型的變量覆蓋在this地址指向的內(nèi)存上。
上述三種都在對(duì)this指向的對(duì)象進(jìn)行操作,如果是想在構(gòu)造函數(shù)中定義一個(gè)同類型的變量,需要使用花括號(hào)而不是圓括號(hào)傳參:
int b = 2; class Test { public:Test(){Test{ b }; //使用花括號(hào){}}Test(int a) : p(a) {}~Test() {}int get() { return p; } private:int p; };另一種方法是顯式指出類型:
int b = 2; class Test { public:Test(){Test((int)b); //顯式指出類型}Test(int a) : p(a) {}~Test() {}int get() { return p; } private:int p; };這兩種都不會(huì)無(wú)限遞歸,但是只是創(chuàng)建了一個(gè)局部變量,構(gòu)造函數(shù)結(jié)束的時(shí)候這個(gè)局部變量會(huì)被銷毀。
另外需要注意的是,如果把變量b換成常量2,使用Test(2)不用造成無(wú)限遞歸,會(huì)正確執(zhí)行。
如果編譯器支持C++11,那么比較推薦的方法是使用初始化列表來(lái)調(diào)用其它構(gòu)造函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的C++学习笔记-----在一个构造函数中调用另一个构造函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++学习笔记-----在重载的赋值运算
- 下一篇: 数据结构-----AVL树的旋转操作