コンストラクタの呼び出しについて。 – プログラミング – Home

コンストラクタの呼び出しについて。
 
通知
すべてクリア

[解決済] コンストラクタの呼び出しについて。


かつや
 かつや
(@かつや)
ゲスト
結合: 25年前
投稿: 8
Topic starter  

お世話になります。コンストラクタの呼び出しについて
教えてください。

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)です。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 6.CTest Test();←?????

引数なし/戻り値の型CTestである関数Testを宣言したことになります。

// ↓コレといっしょ。
int f();
int n = f();


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

「6.」は、CTest型を戻すTest()という関数の、
「プロトタイプ宣言」であると判定されたのでしょう。

2005Expressでは以下の様な警告が出ます。

test2.cpp(53) : warning C4930: 'CTest Test3(void)': プロトタイプされている関数
が呼び出されませんでした (変数の定義が意図されていますか?)

まぁ、アレな日本語ではありますが(vv;)。


返信引用
かつや
 かつや
(@かつや)
ゲスト
結合: 25年前
投稿: 8
Topic starter  

επιστημηさん/仲澤@失業者さん
回答ありがとうございます。

よーく考えたらそうですね・・・恥ずかしい。
「プロトタイプ宣言=ヘッダでやるもの」ぐらいの
意識でいたので、全く気がつきませんでした(--;

--------------------------------------------------
ここで、//2の宣言及び関数部分をコメントアウトして、
6.の宣言を実行すると、//1に飛ぶことが確認されました。
--------------------------------------------------
今試しましたがウントモスントモ言いません。
何か間違えていたかも知れません。トンチンカンな事を
書いてしまいすみません。

ついでとなってしまいますが、と言うことは、
【CTest::CTest(const char *inStr = NULL)】
定義を行っていてもファイル名を「未指定」としての呼び出しは
出来ないって事になってしまうでしょうか?
(デフォルトコンストラクタにファイル名がNULL時の処理を
書けば良いだけの話なのでしょうが・・・)

ひとまず当初の質問は解決致しましたので、解決と致しますが、
宜しければ、上記の件レス頂けると幸いです。
ありがとうございました。


返信引用
かつや
 かつや
(@かつや)
ゲスト
結合: 25年前
投稿: 8
Topic starter  

自己解決しました。

class CTest
{
 CTest::CTest(const char *inStr = NULL);
 CTest::~CTest();
:
}

と宣言するだけで
・CTest Test(ABC);
・CTest Test;

のどっちでも呼び出し出来ました。
お騒がせ致しました。m(__)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました