在C ++二进制文件中,我找到了Qt方法,例如??4QString@@QEAAAEAV0@AEBV0@@Z,它分解为
public: class QString & __ptr64 __cdecl QString::operator=(class QString const & __ptr64) __ptr64

或更短的形式QString& QString::operator=(QString const&)。该返回值似乎未使用。鉴于它似乎不是人们用原始代码编写的构造,因此“一元等于”的目的是什么?
编辑
我发现了造成混淆的根源。我完全可以通过thisoperator=的调用约定来奖赏它。根据我的经验,在反转软件时,人们通常将this表示为直接参数。例如,这就是IDA所做的。这也是我打算做的。因此,它被认为是一元的,因为我只写了一个参数(this)。我不知道是什么原因造成的。我把[demangler.com]的输出放在我的帖子的前半部分中,没有包含隐式的__int64 __fastcall QString__operator_(_QWORD),这与我的期望相反。

评论

返回类型似乎是引用,而不是指针。 C ++允许您为operator =选择任何返回类型,包括void。但是默认行为是返回* this作为参考。

这不是一元的。您看到的单个参数是第二个操作数,第一个操作数是这个(它是类成员函数,而不是自由函数)。

#1 楼

这是一个C++问题,但是:
您看到的是QString类的赋值运算符。它使您能够编写类似a = b的东西,其中a, bQString类型。
之所以返回值,是为了使您能够编写:a = b = c而不是a = cb = c,在其他运算符的情况下,您可能会看到此模式重载(例如,请参见问题)。
C++标准要求编译器如果不是由程序员编写的,则生成=运算符,因此即使不直接使用它,您也可以期望它存在。

#2 楼

基元的默认赋值运算符返回一个值,并且运算符重载的标准约定是不偏离您正在重载的运算符的行为。这就是为什么继续从赋值重载运算符返回赋值引用的好习惯。例如,考虑调用realloc:
// int *ptr;
// size_t size;

size *= 2;
int *nptr = realloc(ptr, size);
if (nptr)
    ptr = nptr;
else
    return ERROR;

我们可以通过在if条件内移动赋值表达式来简化代码。在这里,我们利用两个赋值表达式size *= 2(在加倍后返回变量的值)和对nptr的赋值,失败时将赋值为NULL0)。
// int *ptr;
// size_t size;

int *nptr;
if (nptr = realloc(ptr, size *= 2))
    ptr = nptr;
else
    return ERROR;