我正在尝试为某些工作创建一个库,并使用运算符重载进行赋值操作。 假设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。
感谢。
答案 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.