変数定義時に引数無しのコンストラクタを呼んではならない

ロベールの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;

としないとダメだということですね。