3

=C++での演算子の実装に関連する質問があります。私の記憶が正しければ=、クラスに実装する方法は 2 つあります。1 つは =明示的にオーバーロードする方法で、たとえば次のようになります。

class ABC
{
   public:
       int a;
       int b;
       ABC& operator = (const ABC &other)
       {
          this->a = other.a;
          this->b = other.b;
       }
}

=もう 1 つは、暗黙的に定義すること です。例えば:

   class ABC
    {
       public:
           int a;
           int b;
           ABC(const ABC &other)
           { 
             a = other.a;
             b = other.b;
           }
    }

私の質問は次のとおりです。

=1)明示的および暗黙的に実装する必要がありますか? 2) それらの 1 つだけが必要な場合、どの実装が優先されますか?

ありがとう!

4

3 に答える 3

4

最初に示すのは代入演算子で、2 番目はコピー コンストラクターです。それらは、異なることを行う別個の機能です。(つまり、ctor は生成中のオブジェクトをセットアップし、op= は既存のオブジェクトの状態を別のオブジェクトの状態と一致するように変更します。)

運が良ければ (設計に助けられて)、どちらも実装せず、言語に任せて作成します。賢明なメンバーと基本クラスを使用すると、それが起こります。

それらを実装する必要がある場合 (実際に 2 回チェックするのが実際のケースです!)、両方が必要になる可能性があります。Rule of 3を参照してください。

于 2013-06-05T15:46:10.043 に答える
1

あなたの場合、コンパイラがこれらのメンバー関数を自動的に生成するため、コピー構築もコピー代入も実装する必要はありません。生成された関数は、各データ メンバーに対してコピー コンストラクターまたはコピー代入演算子をそれぞれ呼び出すだけです。

動作をカスタマイズしたい場合にのみ、関数を実装する必要があります。ところで、コピー コンストラクターを実装する場合、コピー代入演算子は上記と同じデフォルトの動作を保持し、逆も同様です。したがって、2 つのうちの 1 つをカスタマイズする場合は、おそらくもう 1 つもカスタマイズする必要があります。そしておそらくデストラクタも。これを 3 のルールと呼びます。ほとんどの場合、デフォルトの動作で問題ありません。

于 2013-06-05T15:43:54.240 に答える