お世話になります。コンストラクタの呼び出しについて
教えてください。
class CTest
{
CTest::CTest(); //1
CTest::CTest(const char *inStr);//2
:
:
:
}
ひとまずこんなクラスを作ったのですが、
クラスを生成する際の宣言で疑問があります。
1.CTest *pTest = new CTest(ABC);←//2が呼ばれる。
2.CTest *pTest = new CTest;←//1が呼ばれる。
3.CTest *pTest = new CTest();←//1が呼ばれる。
4.CTest Test(ABC);←//2が呼ばれる。
5.CTest Test;←//1が呼ばれる。
6.CTest Test();←?????
//1及び//2の関数の頭でブレークを張ってデバッグしたのですが、
6.の宣言を実行した場合にどちらのコンストラクタも呼ばれません。
ここで、//2の宣言及び関数部分をコメントアウトして、
6.の宣言を実行すると、//1に飛ぶことが確認されました。
コンストラクタをオーバーロードした場合6.の呼び出しは
どうなるのでしょうか?
ビルドエラーは出ていない&1.~3.で宣言すれば問題はないの
ですが、動けばいいやではいけないと思い理由が知りたいです。
すごく基本的な事かも知れませんがどなたかご説明頂けませんか?
---------------------------------------------------------------
実際はクラスの生成時にファイル名を引数で取りたくて、//2の行は
最初、【CTest::CTest(const char *inStr = NULL)】としており、
ファイル名の未指定時(6.の呼び出しを想定)にも//2が呼ばれる事を
期待していたのですが・・・上手く動かなくてデフォルトコンストラクタ
を作成した所、上の事象となった訳です。
---------------------------------------------------------------
長文になってしまいましたが、どなたか回答お願い致します。
環境はWinXPPro + VC++6.0(SP6)です。
> 6.CTest Test();←?????
引数なし/戻り値の型CTestである関数Testを宣言したことになります。
// ↓コレといっしょ。
int f();
int n = f();
「6.」は、CTest型を戻すTest()という関数の、
「プロトタイプ宣言」であると判定されたのでしょう。
2005Expressでは以下の様な警告が出ます。
test2.cpp(53) : warning C4930: 'CTest Test3(void)': プロトタイプされている関数
が呼び出されませんでした (変数の定義が意図されていますか?)
まぁ、アレな日本語ではありますが(vv;)。
επιστημηさん/仲澤@失業者さん
回答ありがとうございます。
よーく考えたらそうですね・・・恥ずかしい。
「プロトタイプ宣言=ヘッダでやるもの」ぐらいの
意識でいたので、全く気がつきませんでした(--;
--------------------------------------------------
ここで、//2の宣言及び関数部分をコメントアウトして、
6.の宣言を実行すると、//1に飛ぶことが確認されました。
--------------------------------------------------
今試しましたがウントモスントモ言いません。
何か間違えていたかも知れません。トンチンカンな事を
書いてしまいすみません。
ついでとなってしまいますが、と言うことは、
【CTest::CTest(const char *inStr = NULL)】
定義を行っていてもファイル名を「未指定」としての呼び出しは
出来ないって事になってしまうでしょうか?
(デフォルトコンストラクタにファイル名がNULL時の処理を
書けば良いだけの話なのでしょうが・・・)
ひとまず当初の質問は解決致しましたので、解決と致しますが、
宜しければ、上記の件レス頂けると幸いです。
ありがとうございました。
自己解決しました。
class CTest
{
CTest::CTest(const char *inStr = NULL);
CTest::~CTest();
:
}
と宣言するだけで
・CTest Test(ABC);
・CTest Test;
のどっちでも呼び出し出来ました。
お騒がせ致しました。m(__)m