web-dev-qa-db-ja.com

C ++でデフォルトコンストラクターの使用を禁止する方法

私のプログラムでは、コンストラクタに引数を渡さずにオブジェクトを作成できるようにしたくありません。

方法はありますか?

23
Debugger

他のコンストラクタを宣言すると、コンパイラはデフォルトのコンストラクタを生成しません。デフォルトの引数なしコンストラクターを指定した場合は、それをプライベートにすることができます。

コンパイラーは、クラスのこれら4つのメンバー関数のそれぞれを自動的に生成できることに注意してください。

  • デフォルトの引数なしコンストラクタ
  • デフォルトのデストラクタ
  • コピーコンストラクタ
  • 代入演算子

ただし、自分で宣言した場合、デフォルトのコンストラクタは生成されません。つまり、自分でコンストラクタを宣言した場合、デフォルトのコンストラクタは作成されません。他の3つを宣言しなかった場合でも、コンパイラーがそれらを生成できます。

編集:この情報はC++ 03に適用されますが、Matthieu M.がコメントで言及しているように、C++ 11では異なります。 C++ 11では、コンストラクターを明示的に禁止することもできます。 Offirmoの回答 を参照してください。

25
wkl

他の答えは真実ですが、それを表現するためのC++ 11の新しい手法があります: 削除されたデフォルトコンストラクター

他のトリックに依存せずに関数を禁止することができます。また、コードで意図を明確に示します。

class X
{ 
public:
    X(int) {}
    X() = delete; // will never be generated
};

int main()
{ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}
22
Offirmo

正しい引数をとるコンストラクタを定義します。これにより、コンパイラーがデフォルトのコンストラクターを定義できなくなります。

class X { 
public:
   X(int) {}
};

int main(){ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}
7
Jerry Coffin

コンストラクタに引数を渡さずにオブジェクトを作成できるのは、デフォルトのコンストラクタがあるためです。デフォルトコンストラクターは、パラメーターを持たない、またはデフォルト値を持つすべてのパラメーターを持たない一種のコンストラクターです。また、コンストラクターを宣言しなかった場合は、コンパイラーがコンストラクターを作成します。したがって、解決策は非常に簡単です。デフォルト値のないパラメーターを使用してコンストラクターを宣言できます。そうすれば、コンパイラーはコンストラクターを作成しません。

2
Crazy Bear

空でないコンストラクタを作成すると、空のデフォルトコンストラクタが「キャンセル」されるため、空のコンストラクタも明示的に作成しない場合、引数を指定しないとオブジェクトは作成されません。

1
amit

プライベートデフォルトコンストラクターを作成します。

0