其他分享
首页 > 其他分享> > c-跳过/未发生赋值运算符重载

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