显式调用构造函数产生的悲剧
昨天一個同學讓我幫他調試程序,發現一個詭異的問題,明明一個類的私有成員被賦值了,但運行時卻總是不定的值。仔細檢查了好久,才發現原來他把構造函數當作普通函數進行了顯式調用,結果產生了悲劇。
????
將他的問題簡單的抽象如下:
????
大家看看下面這段代碼的輸出結果是什么?這段代碼有問題么?
-----------------------------------------------------------
【分析】
-----------------------------------------------------------
輸出結果中,m_a是一個不確定的值,因為沒有被賦初值,m_b 為2
注意下面這段代碼
在調用CTest()函數時,實際上是創建了一個匿名的臨時CTest類對象,CTest()中賦值 m_a = 1 也是對該匿名對象賦值,故我們定義的myTest的m_a其實沒有被賦值。說白了,其實構造函數并不像普通函數那樣進行一段處理,而是創建了一個對象,并且對該對象賦初值,所以顯式調用構造函數無法實現給私有成員賦值的目的。
這個例子告訴我們以后代碼中千萬不要出現使用一個構造函數顯式調用另外一個構造函數,這樣會出現不確定性。其實一些初始化的代碼可以寫在一個單獨的init函數中,然后每一個構造函數都調用一下該初始化函數就行了。
在此,順便再提出另外一個問題以供思考:
????
代碼右邊顯示調用CTest(),是否依然會產生一個匿名的臨時對象a,然后將該匿名的臨時對象a的地址賦給指針p? 如果是這樣的話,出了func函數后,臨時對象a是否會被析構? 那指針p不成為了野指針了?你能解釋這個問題么?
?????
關于c++構造函數的詳細分類與示例在《C++構造函數詳解》一文中有詳細的描述,有興趣的讀者可以看看:http://ticktick.blog.51cto.com/823160/194307
總結
以上是生活随笔為你收集整理的显式调用构造函数产生的悲剧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问题步骤记录器——“懒教师”的好帮手
- 下一篇: php_mysql注入load_file