構造関数を明示的に呼び出す悲劇


昨日、ある同級生が私にプログラムをデバッグさせて、奇妙な問題を発見しました.クラスのプライベートメンバーが割り当てられているのに、実行時はいつも不定の値です.長い間よく調べていたが,構造関数を普通の関数として明示的に呼び出し,悲劇を生んだことが分かった.
    
彼の問題を簡単に抽象化するのは以下の通りです.
    
次のコードの出力結果を見てみましょうか?このコードに問題がありますか?
#include   
 
class CTest  
{
  
public:
 
    CTest()  
    {  
        m_a = 1;  
    }  
    CTest(int b)  
    {  
        m_b = b;  
        CTest();  
    }  
    ~CTest()  
    {}  
      
    void show  
    {  
        std::cout < 
  


-----------------------------------------------------------
【 】
-----------------------------------------------------------


,m_a , ,m_b 2




CTest(int b)
{
   m_b = b;
   CTest();
}

CTest() を び すと、 には の CTestクラスオブジェクトが され、CTest()にm_が り てられます.a=1も オブジェクトに を するので, が したmyTestのm_a は されていません.すなわち、コンストラクション は、 の のように されるのではなく、オブジェクトが され、そのオブジェクトに が されるため、 にコンストラクション を び すことは、プライベートメンバーに を する を できません.
この は、 でコードに1つのコンストラクション を して のコンストラクション を に び さないでください.これにより、 が します. には、 されたコードの には、 のinit に くことができ、 コンストラクション が を び せばよいものもあります.
ここで、ついでにもう つの をして えさせます.
CTest *p = NULL;  
 
void func()  
 
{  
 
    p = new CTest();  
 
}

    
コードの にCTest()が び され、 として の オブジェクトaが され、その の オブジェクトaのアドレスがポインタpに り てられるかどうかが されます.もしそうであればfunc が た 、 オブジェクトaは されますか?そのポインタpは ポインタになっていませんか?この を できますか.
     
c++コンストラクション の な と については、「C++コンストラクション の 」の で に されています. のある は を してください.http://ticktick.blog.51cto.com/823160/194307