変数定義時に引数無しのコンストラクタを呼んではならない
ロベールのC++入門講座 06-04
まず引数ありのコンストラクタを持つクラスを定義する場合
#include <iostream> using namespace std; class CSample { public: CSample (int num) {} }; int main () { CSample obj(100); return 0; }
obj(100)のようにして引数を渡すことができます。
そして、引数無しのコンストラクタを呼ぶ場合も「obj(100)」と同じように「obj()」と書けそうと思いがちですが、実はこれは正しい処理になりません。
コンパイルは通りますが、警告が出ます。
#include <iostream> using namespace std; class CSample { public: CSample () {} }; int main () { CSample obj(); return 0; }
$ cl /W4 /EHs main.cpp Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. main.cpp main.cpp(10) : warning C4930: 'CSample obj(void)': プロトタイプされている関数が 呼び出されませんでした (変数の定義が意図されていますか?)
まんまな警告ですね。
要は
CSample obj();
これがCSampleクラスのobj変数の宣言なのか、CSampleクラスを戻り値に返すobj関数のプロトタイプ宣言なのか、見分けが付かないのです。
引数の必要ない変数の定義をする場合は常に
CSample obj;
としないとダメだということですね。