关于构造函数和this调用的思考
文中一系列思考和內(nèi)容引發(fā)自以下問題:
我需要在一個(gè)類的構(gòu)造函數(shù)中調(diào)用另一個(gè)對象的構(gòu)造函數(shù),并使用this初始化其中的一個(gè)引用成員。
主要遇到的問題:
1. 構(gòu)造函數(shù)的初始化列表中能訪問this嗎?
很明顯c++創(chuàng)建一個(gè)對象分為兩部分,創(chuàng)建內(nèi)存和調(diào)用構(gòu)造函數(shù)。
顯然在初始化列表中,當(dāng)前對象占用的內(nèi)存已經(jīng)創(chuàng)建好了,ok,this是可以訪問的,只是其中的某些成員是沒有初始化的(因?yàn)闆]有構(gòu)造函數(shù)還沒執(zhí)行完,只能說對象是部分有效的)。
那也間接說明一個(gè)問題,在構(gòu)造函數(shù)的函數(shù)體中使用this是完全可靠的,所有編譯器可以自動(dòng)初始化的成員都完成了初始化(比如基類的成員、帶有默認(rèn)構(gòu)造函數(shù)的成員,注意具體初始化順序是由類成員定義順序確定的),但當(dāng)前類的部分未在初始化列表中初始化的且沒有默認(rèn)構(gòu)造函數(shù)類成員變量(比如常見的c++內(nèi)置類型,int、float、指針等)的值是未定義的。
2. 構(gòu)造函數(shù)參數(shù)與成員同名
構(gòu)造函數(shù)的形式如下:帶有一個(gè)和類成員同名的參數(shù)。打印輸出只是為了驗(yàn)證成員變量是否初始化。
class A { public:A(int a): a(a){cout<<a<<endl;} private:int a; };由于初始化列表中不能直接出現(xiàn)this,所以編譯器會(huì)處理這種重名的情況。也就說,你不能在構(gòu)造函數(shù)的初始化列表中顯式用this做限定符,比如下面代碼是無法通過編譯的:
A:this->a(a){}3. 如何在一個(gè)類的構(gòu)造函數(shù)匯中調(diào)用另一個(gè)構(gòu)造函數(shù)
構(gòu)造函數(shù)是不允許嵌套調(diào)用的,但可以調(diào)用不同的重載形式。比如下面代碼:(注意這是一道面試題目)
struct CLS {int m_i;CLS( int i ) : m_i(i){}CLS(){CLS(0);} }; int main() {CLS obj;cout << obj.m_i << endl;return 0; }輸出是多少?
---------------------------------------------------------------------------
答案是未知,因?yàn)閙_i是未初始化的變量,是個(gè)野值。
"CLS(0);"的語句表示創(chuàng)建一個(gè)臨時(shí)的CLS對象,并把該對象的成員m_i初始化為0。當(dāng)前對象的值并沒有初始化。
?
如果需要實(shí)現(xiàn)構(gòu)造函數(shù)類調(diào)用另一個(gè)構(gòu)造函數(shù),需要借助于placement new運(yùn)算符。代碼如下:
struct CLS {int m_i;CLS( int i ) : m_i(i){}CLS(){new (this)CLS(0);} };如果你對placement new不了解,建議看看c++ primer或者TCPL。
?
在c++11中可以直接通過委托或繼承構(gòu)造函數(shù)的形式實(shí)現(xiàn)上面功能。
struct CLS {int m_i;CLS( int i ) : m_i(i){}CLS():CLS(0){} };?
4. 解決方案
寫到這里。我對于構(gòu)造函數(shù)的初始化列表中引用this的情況基本了解,可以用下面代碼解決本文開始提出的問題。
class Context; class Ref { public:Ref(Context&context):context(context){} private:Context &context; }; class Context { public:Context():ref(*this){} private:Ref ref; };復(fù)述下開始的問題:我需要在一個(gè)類的構(gòu)造函數(shù)中調(diào)用另一個(gè)對象的構(gòu)造函數(shù),并使用this初始化其中的一個(gè)引用成員。
類Context會(huì)在其構(gòu)造函數(shù)的初始化列表中通過this調(diào)用Ref的構(gòu)造函數(shù)。
?
5. 參考資料
[1]?從一道題談C++中構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)? ??http://www.cnblogs.com/chio/archive/2007/10/20/931043.html
[2] c++ 一個(gè)構(gòu)造函數(shù) 調(diào)用 另一個(gè) 構(gòu)造函數(shù)? ??http://www.cnblogs.com/ayanmw/archive/2012/08/20/2647808.html
?
總結(jié)
以上是生活随笔為你收集整理的关于构造函数和this调用的思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一张图看懂encodeURI、encod
- 下一篇: js模拟blur