3

「opperator= は src obj の (もちろん、const best) ref のパラメーターを取る必要があります」、私はこれを多くの本で見ますが、代わりに非 ref を使用しようとしています。 ref?paramからのコピーを避けるためだけですか? 私のテストコードは、

#include <iostream>
#include <string>
using namespace std;

class Student{
public:
    Student& operator=(Student);
    string name;
    int num;
};

Student& Student::operator=(Student s)
{
    name=s.name;
    num=s.num;
    return *this;
}

int main(){
Student src;
src.name="haha";
src.num=11;
cout<<src.name<<" "<<src.num<<endl;
Student dst=src;
cout<<src.name<<" "<<src.num<<endl;
}
4

5 に答える 5

1

ここには実際には 2 つの問題があります。

1)定義したコピー代入演算子は呼び出されません。この線

Student dst=src;

コピー代入演算子を呼び出しません! これは、コンパイラによって暗黙的に定義されるコピー コンストラクターを呼び出します。しかし、あなたが書いた場合

Student dst;
dst = src;

その後、operator=呼び出されます。

2)はい、目的はコピーを避けることです。by 値operator=を取るなどの関数を呼び出すときは、オブジェクト引数をコピーする必要があります (コピー コンストラクターへの暗黙的な呼び出しによって)。一方、関数が参照を取る場合、コピーは作成されません。StudentStudent

于 2014-03-02T03:19:43.827 に答える
1

それ以外の場合はコピーである値で渡されるため、コピーコンストラクターを呼び出してコピーコンストラクターを呼び出す必要があります...

于 2014-03-02T04:19:33.927 に答える
0

これ

Student& Student::operator=(Student s)
{
    name=s.name;
    num=s.num;
    return *this;
}

する必要があります

Student& Student::operator=(const Student &s)
{
    if (this == &s) return *this;
    name=s.name;
    num=s.num;
    return *this;
}

参照を使用して CPU の浪費を回避する

于 2014-03-02T03:08:13.417 に答える
0

C++03 では、参照渡しにより、コピー先オブジェクトへのコピーに加えて、変更されることconstのない local のためだけに潜在的に高価な新しいコピーを作成することを回避できます。ss

C++11 では、移動セマンティクスが導入されました。代入によって、新しいオブジェクトへのリソースの転送、またはリソースのコピーが発生する場合があります。pass-by-copy 操作を利用して、宛先オブジェクトに使用されるコピーされたデータを生成できるため、オーバーヘッドが有効に活用されます。を使用して渡す場合move、コピーはありません。C++11 でのベスト プラクティスは、1 つの関数をコピー代入演算子と移動代入演算子の両方として機能させることです。

Student& Student::operator=(Student s)
{
    name = std::move( s.name );
    num = s.num;
    return *this;
}
于 2014-03-02T03:15:53.713 に答える
0

単純。このコードを見てください。

Student a, b;
a = b;

それは等しい

a.operator=(b);

b値渡しされます。そのため、コピー コンストラクターが呼び出されます。

a.operator=(Student(b)); // please notice that it is just psudo code..

したがって、2つのコピーがあります!1 つはコピー コンストラクターで、もう 1 つはコピー代入演算子です。不要です。


また、コピーコンストラクタの param も参照する必要があります。それ以外の場合、値による呼び出しにはコピーが必要であり、コピーには値による呼び出しが必要であるため、無限再帰が発生します...

于 2014-03-02T03:23:05.063 に答える