??4QString@@QEAAAEAV0@AEBV0@@Z
,它分解为public: class QString & __ptr64 __cdecl QString::operator=(class QString const & __ptr64) __ptr64
或更短的形式
QString& QString::operator=(QString const&)
。该返回值似乎未使用。鉴于它似乎不是人们用原始代码编写的构造,因此“一元等于”的目的是什么?编辑
我发现了造成混淆的根源。我完全可以通过
this
和operator=
的调用约定来奖赏它。根据我的经验,在反转软件时,人们通常将this
表示为直接参数。例如,这就是IDA所做的。这也是我打算做的。因此,它被认为是一元的,因为我只写了一个参数(this
)。我不知道是什么原因造成的。我把[demangler.com]的输出放在我的帖子的前半部分中,没有包含隐式的__int64 __fastcall QString__operator_(_QWORD)
,这与我的期望相反。#1 楼
这是一个C++
问题,但是:您看到的是
QString
类的赋值运算符。它使您能够编写类似a = b
的东西,其中a, b
是QString
类型。之所以返回值,是为了使您能够编写:
a = b = c
而不是a = c
和b = 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
的赋值,失败时将赋值为NULL
(0
)。// int *ptr;
// size_t size;
int *nptr;
if (nptr = realloc(ptr, size *= 2))
ptr = nptr;
else
return ERROR;
评论
返回类型似乎是引用,而不是指针。 C ++允许您为operator =选择任何返回类型,包括void。但是默认行为是返回* this作为参考。这不是一元的。您看到的单个参数是第二个操作数,第一个操作数是这个(它是类成员函数,而不是自由函数)。