構造関数を明示的に呼び出す悲劇
昨日、ある同級生が私にプログラムをデバッグさせて、奇妙な問題を発見しました.クラスのプライベートメンバーが割り当てられているのに、実行時はいつも不定の値です.長い間よく調べていたが,構造関数を普通の関数として明示的に呼び出し,悲劇を生んだことが分かった.
彼の問題を簡単に抽象化するのは以下の通りです.
次のコードの出力結果を見てみましょうか?このコードに問題がありますか?
彼の問題を簡単に抽象化するのは以下の通りです.
次のコードの出力結果を見てみましょうか?このコードに問題がありますか?
#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