1

現時点では、C++ 11 standardを読んでいます。その中で (第 12 章) 特別なメンバー関数の中で?copy?が言及されています。代入演算子.

私はすでにoperator= に直面していますが、これは単に代入演算子です

私の最初の推測では、次のようなステートメントで使用されています。

Class_name instance_name1 = instance_name2;   

オブジェクトの作成と初期化が同時に行われるとき、私は自分の仮定をチェックし、これがコピーコンストラクターによって行われることを確認しました(これは予想されていました)。

では、コピー代入演算子には何を使用し、どのように宣言するのか、その使用例を教えてください。前もって感謝します!

4

3 に答える 3

7

これは、標準の 12.8/17 で定義されています。

ユーザー宣言のコピー代入演算子は、 、、、または型のパラメーターを 1 つだけ持つX::operator=class の非静的非テンプレート メンバー関数です。XXX&const X&volatile X&const volatile X&

たとえば、次のようになります。

struct X {
    int a;
    // an assignment operator which is not a copy assignment operator
    X &operator=(int rhs) { a = rhs; return *this; }
    // a copy assignment operator
    X &operator=(const X &rhs) { a = rhs.a; return *this; }
    // another copy assignment operator
    volatile X &operator=(const volatile X &rhs) volatile { 
        a = rhs.a; 
        return *this; 
    }
};

代入演算子は、オブジェクトに代入するときに使用されます。それはあまり意味がないと思うかもしれませんが、サンプル コードはオブジェクトに代入Class_name instance_name1 = instance_name2; せず、オブジェクトを初期化します。違いは言語の文法にあります。どちらの場合も、=シンボルはinitializer-clauseと呼ばれるものの前にありますがClass_name instance_name1 = instance_name2;、定義ですが、が定義されinstance_name1 = instance_name2;た後instance_name1は、代入式を含む式ステートメントです。代入式は代入演算子を使用し、定義はコンストラクターを使用します。

オーバーロード解決の通常のルールで、コピー代入演算子である代入演算子が選択される場合は、コピー代入演算子が使用されます。

X x;
x = 4; // uses non-copy assignment operator
X y;
y = x; // uses copy assignment operator

コピー代入演算子と非コピー代入演算子が区別される理由は、コピー代入演算子を宣言すると、デフォルトのコピー代入演算子が抑制されるためです。非コピー代入演算子を宣言すると、デフォルトのコピー代入は抑制されません。

于 2012-11-07T10:30:12.690 に答える
1

ほとんどの場合、それらは同じです。皮肉なことに、標準は次のように述べています。

13.5.3 割り当て [over.ass]

2) 代入演算子は、たとえ copy や move 代入演算子であっても、仮想にすることができます。

(スティーブの答えの正しい参照)

これにより、代入演算子はコピーまたは移動演算子でなくても存在できると信じるようになります。

与えられた例は次のとおりです。

struct B {
   virtual int operator= (int);
   virtual B& operator= (const B&);
};

これは、最初のものは単純な代入演算子であり、2番目のものはコピー代入演算子であると私に信じさせます。これにより、コピー コンストラクターで使用される命名法も維持されます。

したがって、コピー代入演算子は、同じ型の参照 (またはオブジェクト) をパラメーターとして受け取る代入演算子であると言えます。

于 2012-11-07T10:27:11.290 に答える
0

代入演算子は=であり、次のようにオーバーロードできます。

struct T
{
   T& operator=(const int&);
};

この場合、私は取るようにしましたがint、これはかなり珍しいことであり、おそらく望ましくありません。通常、コピー代入演算子を記述します。これは、次への参照を取ることを意味しますT

struct T
{
   T& operator=(const T&);
};
于 2012-11-07T10:40:05.797 に答える