赋值运算符重载跳过/未发生

时间:2011-03-04 05:42:54

标签: c++ operator-overloading

我正在尝试为某些工作创建一个库,并使用运算符重载进行赋值操作。 假设X和Y是具有=重载的类的两个实例:

A& A::operator=(A &rhs)
{
    A::assign(*this, rhs);
    return *this;
}

当我这样做时:

A z;
z = x + y; // x and y are other instances of class A
但是,当我做一个`

时,一切都很好
A p = q + r;

不会调用重载的例程。我对运算符重载没有经验,有人可以解释发生了什么。一种解释可能是p只是已经创建的q + r对象的别名,但是,z创建了一个新的A类实例,因此当分配z时,运算符重载就会启动。有点像:

#include <iostream>
using namespace std; 
class X
{
    public:
    X();
};

X::X()
{
    cout<<"called"<<endl;
}

int main(int argc, char *argv[]) 
{
    X e; X f;
    X g = e;
}

其中调用仅打印两次,每次打印一次为e和f,并且不打印g。

如果是这种情况,有人可以建议一种方法来触发操作符重载p。

感谢。

3 个答案:

答案 0 :(得分:3)

如果声明一个变量并在同一行上初始化它,它仍会调用复制构造函数。

这是两种初始化语法:

X a;
X b(a);

X a;
X b = a;

它们的含义略有不同,但在大多数情况下它们都是一样的。区别在于编译器是否保证避免某些构造/破坏。在任何一种情况下,都会调用复制构造函数,因为您正在构造一个对象。我不太清楚保证差异的细节是什么。

答案 1 :(得分:1)

发生了什么,

A p = q + r;

调用A的复制构造函数,而不是赋值运算符。是的,这很奇怪。这与你输入的内容相同:

A p(q + r);

答案 2 :(得分:1)

调用复制构造函数的情况:

when you return an object
when you pass an object to some function
X b(a);
X b = a;

调用赋值运算符重载函数的情况是

X b; b=a;//where a is already existing object and already intialised.