C++でクラスの代入演算子をオーバーロードするとき、そのパラメータは参照でなければなりませんか?
例えば、
class MyClass {
public:
...
MyClass & operator=(const MyClass &rhs);
...
}
それはできますか
class MyClass {
public:
...
MyClass & operator=(const MyClass rhs);
...
}
?
ありがとう!
C++でクラスの代入演算子をオーバーロードするとき、そのパラメータは参照でなければなりませんか?
例えば、
class MyClass {
public:
...
MyClass & operator=(const MyClass &rhs);
...
}
それはできますか
class MyClass {
public:
...
MyClass & operator=(const MyClass rhs);
...
}
?
ありがとう!
オーバーロードされた代入演算子のパラメーターは任意の型にすることができ、参照または値によって渡すことができます (型がコピー構築可能でない場合、明らかに値によって渡すことはできません)。
したがって、たとえば、をint
パラメーターとして受け取る代入演算子を使用できます。
MyClass& operator=(int);
コピー代入演算子は、代入演算子の特殊なケースです。値または参照 (参照は const または volatile で修飾されている場合があります) によって、クラスと同じ型を取る任意の代入演算子です。
何らかの形式のコピー代入演算子を明示的に実装しない場合は、コンパイラによって暗黙的に宣言および実装されます。
C++ Operator Overloading Guidelinesは、代入演算子が const 参照を取得することを提案しています。このサイトによると、その理由は、引数を変更したくない (const であるため) ためであり、演算子の左側だけを変更したいからです。したがって、参照渡しの時間を節約できます。
また、代入演算子 - 演算子連鎖によっても参照が返される理由を示しています。動作させるには、 が に代入 ( )できる参照を返すa = (b = 1)
必要があります。(b = 1)
=
a
一般的に、決定するのはあなた次第です。must はありません。最初のバリアントは一般的で「標準的」であり、どの代入演算子の実装でも問題ありません。
問題が速度である場合は、値渡しテクニックに関するこの記事を読むべきだと思います。これは、場合によっては、値渡しの方が const 参照渡しよりも効果的であることを意味します。
また、値渡しはコピーが作成されたかのように機能するため、2 番目のバリアントはconst
キーワードを必要としないため、元のオブジェクトは確実に変更されません。
例外安全な割り当てのためのコピーとスワップのイディオムを知っていますか?
MyClass& operator=(const MyClass& rhs)
{
MyClass copy(rhs);
swap(copy);
return *this;
}
値による呼び出しを介して、実装を簡略化(場合によっては高速化)できます。
MyClass& operator=(MyClass copy)
{
swap(copy);
return *this;
}
この問題があり、良い答えが見つからなかったので、学んだことを共有します。
値で渡すことができますが、それには何の問題もありません。(あなたの質問で示したように。)
しかし、const 参照によってパラメーターを渡す理由は、関数が呼び出された値の実際のコピーを作成しないようにするためです。参照されているため、メモリ内のどこにでもその値を指しているだけです。
これは、特に何千もの名前を持つ大きなものである場合に処理時間を節約します...この場合、節約される時間はほとんどありません。
また、const については、参照によって渡されるため、メモリ内の元の場所にアクセスできるため、変更される可能性があるため、参照される値が変更されないことを関数のユーザーに保証します。関数定義が実際にconst 参照によって呼び出されるパラメーターの値を変更すると、コンパイラ エラーが発生し、それを行うことができなくなります。const を配置すると、この値を変更できないことをコンパイラに伝えているためです。