4

たとえば、これは正しいです:

class C 
{
   private: 
     C();
     C(const & C other);
}

または、定義を提供する必要があります。

class C 
{
   private: 
     C() {};
     C(const & C other) {};
}

? 現在の回答をありがとう。この質問を拡張してみましょう - コンパイラは、この例の 1 つでより良いコードを生成しますか? ctor に本体を提供すると、コンパイラがコンパイル単位にいくつかの(空の)コードを強制的に含めると想像できますか?これは自動生成コードにも当てはまりますか?

4

8 に答える 8

11

オブジェクトをコピー可能にしたくない場合は、実装を提供する必要はありません。実装なしで copy ctor private を宣言するだけです。同じことが他の ctor にも当てはまります。いずれの体にも使用させたくない場合は、実装せずに非公開として宣言してください。

于 2009-11-13T11:59:47.980 に答える
9

それらを使用しない限り問題ありません。

0x 規格では、削除された関数を使用できます。

class X {
   // ...
   X& operator=(const X&) = delete; // Disallow copying
   X(const X&) = delete;
};
于 2009-11-13T12:08:20.400 に答える
5

宣言のみのコンストラクターを使用して、標準の構築やコピー構築などの特定の構築を禁止することができます。

たとえば、オブジェクトがコピーされるのを避けたい場合は、コピー コンストラクターと代入演算子をプライベートとして宣言し、それらを定義しないと、あなたを含め、オブジェクトをコピーしようとする人にリンカー エラーが発生します。

最後の編集について:まともなコンパイラがデフォルトのコンストラクターと空のコンストラクターと初期化リストなしで同じコードを生成することを期待しています。最終的に必要なのは、各メンバーをデフォルトで初期化することです。

于 2009-11-13T11:59:07.623 に答える
2

実装を提供せずに宣言すると、それらは存在しないため使用できません。コンストラクターを使用する場合は、コンパイラーがコンストラクターを宣言せずにコンストラクターを作成できるようにするか、コンストラクターを宣言して実装を提供する必要があります。

使用したくないコンストラクターの宣言を提供するが、実装を提供しないと便利な場合があります。これは、コピーを作成したくないオブジェクト (シングルトンなど) のコピー コンストラクターを使用して行われることがよくあります。そのような場合、宣言も非公開にすることがよくあります。

于 2009-11-13T12:00:58.727 に答える
2

まず、クラスを完全にコピー不可にしたい場合は、プライベート コピー コンストラクターと代入演算子を実装しないでください。そうしないと、アクセス権を持つコード (メソッドまたはフレンド) が黙ってコピーを作成できる可能性があります。実装しないと、リンカー エラーが発生します。

ただし、エラーをより早く見つけることができるため、コンパイラ エラーの方が望ましいでしょう。このために、またはコピー コンストラクターと代入演算子を非表示boost::noncopyableする基本クラスから派生させることができます。

デフォルトのコンストラクターに関して: コンストラクターを宣言しても、コンパイラーはコンストラクターを生成しません。通常、それを具体的に非表示にする必要はありません。

于 2009-11-13T16:55:20.413 に答える
0

'empty' 宣言を使用すると、コンパイラは既定の実装を生成しなくなり、リンク エラーが発生します。それらを宣言する場合は、それらを記述する必要があるため、空ブレース形式が必要です。

于 2009-11-13T11:57:21.603 に答える
0

定義を提供する必要があります。そうしないと、それらを使用しようとすると、リンクに失敗します。

于 2009-11-13T11:57:58.093 に答える
0

それは、これらのコンストラクターを使用するかどうかによって異なります。それらを使用しない場合は、それらを未定義のままにしておくことができます。それらを使用する場合 (たとえば、クラスの静的関数からクラスのオブジェクトを作成する場合は、それらを定義する必要があります)、定義を提供する必要があります。そうしないと、リンカーから未解決の外部シンボル エラーが発生します。

于 2009-11-13T11:58:29.123 に答える