c-跳过/未发生赋值运算符重载
作者:互联网
我正在尝试为某些工作创建一个库,并且正在使用运算符重载进行赋值操作.
假设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的运算符重载.
谢谢.
解决方法:
如果您声明变量并在同一行上对其进行初始化,则它仍将调用复制构造函数.
有两种初始化语法:
X a;
X b(a);
X a;
X b = a;
它们的含义略有不同,但是在大多数情况下,它们的作用相同.不同之处在于是否保证编译器可以避免某些构造/破坏.无论哪种情况,都会调用复制构造函数,因为您正在构造一个对象.我不太记得关于担保差异的细节.
标签:c,operator-overloading 来源: https://codeday.me/bug/20191013/1908898.html