我已经使用赋值运算符重载下面的代码:
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;
}
它完美地工作,避免了拷贝构造函数问题,但有这方面的任何未知的问题(我)?
有与赋值运算符的第二个版本没有问题。 事实上,这是一个赋值操作符的标准方式。
编辑 :请注意,我指的是赋值运算符的返回类型,而不是实现本身。 正如在评论中已经指出的那样,实现本身是另一个问题。 见这里 。
在这种情况下,你几乎可以肯定是最好跳跃的自我分配的检查 - 当你只分配,这似乎是一个简单的类型(可能是一个双)一个成员,它通常更快的做任务不是阻止它,所以你最终有:
SimpleCircle & SimpleCircle::operator=(const SimpleCircle & rhs)
{
itsRadius = rhs.getRadius(); // or just `itsRadius = rhs.itsRadius;`
return *this;
}
我认识许多老人和/或低质量的书都建议检查自赋值。 至少在我的经验,但是,这是非常罕见的是,你最好没有它(如果运营商依赖于它的正确性,它几乎肯定不是异常安全的)。
顺便说一句,我会注意的是定义一个圆,你一般需要一个中心和半径,当你复制或分配,要复制/分配两者。
第二个是非常标准。 你经常喜欢从返回赋值运算符的引用,使之类的语句a = b = c;
解决预期。 我想不出任何情况下,我想从分配返回副本。
有一点要注意的是,如果你不需要深拷贝它有时被认为是最好使用编译器比滚你自己所产生的隐含拷贝构造函数和赋值操作符。 真的取决于你虽然...
编辑:
下面是一些基本的电话:
SimpleCircle x; // default constructor
SimpleCircle y(x); // copy constructor
x = y; // assignment operator
现在说我们有你的赋值运算符的第一个版本:
SimpleCircle SimpleCircle::operator=(const SimpleCircle & rhs)
{
if(this == &rhs)
return *this; // calls copy constructor SimpleCircle(*this)
itsRadius = rhs.getRadius(); // copy member
return *this; // calls copy constructor
}
它调用拷贝构造函数和传递给一个参考this
为了构建要返回的副本。 现在,在第二个例子中,我们避免了复制的只是恢复到基准this
SimpleCircle & SimpleCircle::operator=(const SimpleCircle & rhs)
{
if(this == &rhs)
return *this; // return reference to this (no copy)
itsRadius = rhs.getRadius(); // copy member
return *this; // return reference to this (no copy)
}
它的使用操作符重载现在您可以通过参考避免值拷贝让你的对象正确的方式。
这可能会有所帮助:
// Operator overloading in C++
//assignment operator overloading
#include<iostream>
using namespace std;
class Employee
{
private:
int idNum;
double salary;
public:
Employee ( ) {
idNum = 0, salary = 0.0;
}
void setValues (int a, int b);
void operator= (Employee &emp );
};
void Employee::setValues ( int idN , int sal )
{
salary = sal; idNum = idN;
}
void Employee::operator = (Employee &emp) // Assignment operator overloading function
{
salary = emp.salary;
}
int main ( )
{
Employee emp1;
emp1.setValues(10,33);
Employee emp2;
emp2 = emp1; // emp2 is calling object using assignment operator
}