2

次のようなクラスを宣言した場合(動的メモリ割り当てなし、ポインタなし):

class A{
  int a,b;
public:
  A();
  A(int,int);
  A& operator=(const A);
};

コピーコンストラクターを宣言しないのは安全ですか?デフォルトのコピーコンストラクタはどのように見えますか?

A& A::operator=(const A other)
{
   a=other.a;
   b=other.b;
   return *this;
}

コピーコンストラクターを宣言しなくても、 operator =()を呼び出すとデフォルトのコンストラクターが呼び出されます。


編集:

デフォルトのデストラクタは次のとおりです。

A::~A(){}

だからここでは必要ありません

4

4 に答える 4

6

ルールは、次のいずれかを提供する必要がある場合です。

  • コピーコンストラクターまたは
  • デストラクタまたは
  • コピー代入演算子

その場合、おそらく 3 つすべてを提供する必要があります。このルールは3 つのルールとして知られています。


コピー コンストラクターを宣言しない方が安全ですか?

安全。

あなたの例では必要ですか?

あまり。具体的には、3 つのルールがそれを支配します。詳細については、リンクされた質問を確認してください。


デフォルトのコピー コンストラクターはどのように見えますか?

これは、デフォルトのコピーコンストラクターが何をするのかを尋ねていると思います。
これは次で回答されています:
C++03 Standard 12.8 Copying class objects:
Para 8:

クラス X の暗黙的に定義されたコピー コンストラクターは、そのサブオブジェクトのメンバーごとのコピーを実行します。コピーの順序は、ユーザー定義のコンストラクターでのベースとメンバーの初期化の順序と同じです (12.6.2 を参照)。各サブオブジェクトは、そのタイプに適した方法でコピーされます。

— サブオブジェクトがクラス型の場合、クラスのコピー コンストラクターが使用されます。
— サブオブジェクトが配列の場合、要素の型に適した方法で各要素がコピーされます。
— サブオブジェクトがスカラー型の場合、組み込み代入演算子が使用されます。
仮想基本クラス サブオブジェクトは、暗黙的に定義されたコピー コンストラクターによって 1 回だけコピーされます (12.6.2 を参照)。


コピーコンストラクターを宣言しなくても、呼び出すとデフォルトのコンストラクターが呼び出されますoperator=()

コピー コンストラクターは、クラス オブジェクトのコピーを作成する必要がある場合にのみ呼び出されます。これには、関数の受け渡し中に作成されたオブジェクトのコピーが含まれます。
コピー代入演算子はオブジェクトA を値渡しします。この値渡しは、コピー コンストラクターを介してオブジェクトのコピーを渡すことによって実現されるため、コピー コンストラクターを呼び出します。コピーを避けるには、参照
渡しする必要があります。

A& A::operator=(const A& other)

よく読んでください:
参照渡しと値渡しの違いは何ですか?

于 2013-02-07T15:01:07.590 に答える
3

コピーコンストラクターコピー代入演算子を混同しているようです。暗黙的に生成されたコピー コンストラクターは、各メンバーをコピー構築します。

A::A( A const& source )
  : a( source.a )
  , b( source.b )
{}

暗黙的に生成されたコピー代入演算子は、各メンバーをコピー代入します。

A& A::operator =( A const& source )
{
    a = source.a;
    b = source.b;
    return *this;
}

質問で定義したcopy-assignmentA演算子はby copyを取るため、copy-constructorが呼び出されて に渡される引数が作成されますoperator=。特定の状況下では、コピーが省略される場合があることに注意してください。

于 2013-02-07T15:01:45.437 に答える
1
A::A(const A& other) != A& A::operator=(const A other)
于 2013-02-07T15:02:16.137 に答える
1

あなたのクラスは提供しますoperator=。(@AlokSave が言うように) 3 つのルールに従って、コピー コンストラクターとデストラクタも提供する必要があります。

問題は、デフォルトで提供されるコピー コンストラクターに満足している場合、デフォルトで提供されるコピー代入演算子に満足できないのはなぜでしょうか? もしそうなら、宣言operator=せずに、コンパイラーに「3 のルール」全体を生成させてください。

于 2013-02-07T15:07:04.333 に答える