c ++中的运算符重载如何工作

时间:2014-06-27 06:58:46

标签: c++ assignment-operator

我正在学习c ++的赋值运算符的一些理论。

让我们说

class MyClass {
private:
   T1 member1;
   T2 member2;
public:
   // The default copy assignment operator which assigns an object via memberwise copy
   MyClass & operator=(const MyClass & rhs) {
      member1 = rhs.member1;
      member2 = rhs.member2;
      return *this;
   }
......
}

c7 = c6; //member wise copy assignment.

这里我们在赋值操作期间返回对象的引用,并为其指定新对象c7

但是,如果我的代码有点像这样:

    int a=12;
    int &b=a;
    int c=&b;        //error::invalid conversion from ‘int*’ to ‘int’

为什么这与上述案例不同?

3 个答案:

答案 0 :(得分:6)

声明

int& b = a;

声明b为参考,并使其引用变量a

声明

int c = &b;

c声明为普通int变量,然后尝试将其初始化为指向int的指针。 &符号&根据上下文执行不同的操作。


对于复制赋值运算符,在初始化声明中的变量时调用 ,而不是调用复制构造函数。


当你有一个拷贝赋值运算符时,例如

MyClass a, b;

a = b;  // Copy-assignment operator called

编译器基本上用以下调用替换赋值

a.operator=(b);

换句话说,它是一个普通的成员函数调用,就像任何其他函数一样。

答案 1 :(得分:2)

c7 = c6; //member wise copy assignment.

你说:

  

这里我们将返回对象的引用   赋值操作并为其指定新对象c7。

这不会返回引用并将其分配给c7。它使用引用c6的operator =参数在c7上调用rhs

你的operator =需要返回引用的原因是,赋值的结果可以用在另一个表达式中(通常是另一个赋值,但它可以是任何表达式)。所以你可以做到

c8 = c7 = c6;

将在c7上调用operator =rhs引用c6,然后使用该分配的结果在c8上调用operator =(这将是对c7的返回引用,基于在你的代码上。)

答案 2 :(得分:0)

您的运营商超载不合适。假设这是您的运营商重载代码 -

class ABC:
{
public:
    ABC();

    bool operator==(const ABC& ip) const
    {
        if( (this->a == ip.a) &&
            (this->b == ip.b))
        {
            return true;
        }

        return false;
    }



    ~ABC();

int a,b;

};

现在您可以执行以下操作 -

ABC x,y;
// do new or other operations.
if (x==y)
{return true;}
else return false;

这里我们只重载运算符(==),其他运算符可以以相同的方式重载。