我使用了以下代码来实现赋值运算符重载:
SimpleCircle SimpleCircle::operator=(const SimpleCircle & rhs)
{
if(this == &rhs)
return *this;
itsRadius = rhs.getRadius();
return *this;
}
我的复制构造函数是:
SimpleCircle::SimpleCircle(const SimpleCircle & rhs)
{
itsRadius = rhs.getRadius();
}
在上面的操作符重载代码中,由于创建了一个新对象,因此调用了复制构造函数;因此,我使用了以下代码:
SimpleCircle & SimpleCircle::operator=(const SimpleCircle & rhs)
{
if(this == &rhs)
return *this;
itsRadius = rhs.getRadius();
return *this;
}
它工作得很好,并且避免了复制构造函数的问题,但是(对我来说)这方面有什么未知的问题吗?
发布于 2012-04-10 00:34:32
在这种情况下,你最好跳过对自我赋值的检查--当你只赋值一个似乎是简单类型(可能是双精度类型)的成员时,通常比避免赋值更快,所以你最终会得到:
SimpleCircle & SimpleCircle::operator=(const SimpleCircle & rhs)
{
itsRadius = rhs.getRadius(); // or just `itsRadius = rhs.itsRadius;`
return *this;
}
我意识到许多旧的和/或质量较低的书建议检查自我分配。然而,至少在我的经验中,没有它你会过得更好的情况非常罕见(如果操作员依赖于它的正确性,它几乎肯定不是异常安全的)。
顺便说一句,为了定义一个圆,你通常需要一个圆心和一个半径,当你复制或赋值时,你想要同时复制/赋值。
发布于 2020-06-01 23:52:46
#include<iostream>
using namespace std;
class employee
{
int idnum;
double salary;
public:
employee(){}
employee(int a,int b)
{
idnum=a;
salary=b;
}
void dis()
{
cout<<"1st emp:"<<endl<<"idnum="<<idnum<<endl<<"salary="<<salary<<endl<<endl;
}
void operator=(employee &emp)
{
idnum=emp.idnum;
salary=emp.salary;
}
void show()
{
cout<<"2nd emp:"<<endl<<"idnum="<<idnum<<endl<<"salary="<<salary<<endl;
}
};
main()
{
int a;
double b;
cout<<"enter id num and salary"<<endl;
cin>>a>>b;
employee e1(a,b);
e1.dis();
employee e2;
e2=e1;
e2.show();
}
发布于 2012-04-10 00:34:43
这是使用操作符重载的正确方法,现在你可以通过引用来获取对象,避免了值复制。
https://stackoverflow.com/questions/10076285
复制相似问题