3

“operator= 应该采用 src obj 的(当然,最好的)ref 的参数”,我在很多书中都看到了这一点,但我尝试使用非 ref 代替,它也有效!所以,使用的目的是什么ref?是否只是为了避免从参数中复制?我的测试代码是,

#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

因为否则它将通过值传递,这是一个副本,所以你需要调用复制构造函数来调用复制构造函数......

于 2014-03-02T04:19:33.927 回答
1

这里确实有两个问题:

1)您定义的复制赋值运算符不会被调用。线

Student dst=src;

不调用复制赋值运算符!它调用由编译器隐式定义的复制构造函数。但是,如果你写

Student dst;
dst = src;

然后operator=会被调用。

2)是的,目的是避免复制。当你调用一个函数,包括operator=,它接受一个Student值,Student对象参数必须被复制(通过对复制构造函数的隐式调用)。另一方面,如果函数需要引用,则不会进行复制。

于 2014-03-02T03:19:43.827 回答
0

Simple. Look at this code.

Student a, b;
a = b;

it is equal to

a.operator=(b);

and b is passed by value. so the copy constructor is called.

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

Therefore, there are two copying! One is copy constructor, and the other is copy assignment operator. It is unnecessary.


Moreover, copy constructor's param must be reference, too. Otherwise, the infinite recursion occurs because call-by-value requires copying and copying requires call-by-value and...

于 2014-03-02T03:23:05.063 回答
0

在 C++03 中,除了复制到目标对象之外,通过const引用传递避免了仅为 local 制作潜在昂贵的新副本,该副本永远不会被修改。ss

在 C++11 中,现在我们有了移动语义:赋值可能导致资源转移到新对象,或资源复制。可以利用传递复制操作来生成用于目标对象的复制数据,因此可以很好地利用开销。如果您通过 using move,则没有副本。C++11 中的最佳实践是让单个函数同时用作复制和移动赋值运算符:

Student& Student::operator=(Student s)
{
    name = std::move( s.name );
    num = s.num;
    return *this;
}
于 2014-03-02T03:15:53.713 回答
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 回答