ob->i
应该返回ob this
的地址,但会返回i
,有什么解释吗?
#include <iostream>
using namespace std;
class myclass {
public:
int i;
myclass *operator->() {return this;}
};
int main() {
myclass ob;
ob.i = 10;
cout << ob.i << " " << ob->i;
// ob->i supposed to return the address of ob "this" but it returns i
return 0;
}
答案 0 :(得分:4)
i
的回归在这里有意义。您的通话相当于说this->i
,因为this
是箭头操作员返回的内容。换句话说,您正在解除引用this
,并使用它来访问您班级中的变量i
。要获取对象的地址,必须在对象上使用一元&
(引用)运算符,即(std::cout << &obj << "\n"
)
答案 1 :(得分:3)
使用operator->
有点棘手。当编译器看到类似ob->i
的表达式时,它首先应用myclass::operator->()
,正如您所期望的那样。但这并不涉及i
之后的->
部分,因此编译器会将->
运算符应用于返回的myclass::operator->()
调用。它一直这样做,直到它得到一个普通的旧指针,然后它知道如何处理i
。因此,在上面的代码中,ob->i
有两个步骤。首先,它调用myclass::operator->()
并返回this
,其类型为myclass*
。现在它有一个普通的指针,所以它使用该指针来到i
所属的ob
。
这使得编写看起来像普通指针的类成为可能:
struct my_type {
int i;
};
class funky_class {
my_type* operator->() { return &obj; }
private:
my_type obj;
};
现在我可以说
funky_class funky;
funky->i = 3;
最后一行更改i
内funky.obj
的值。
在现实世界中,这个例子有点愚蠢;相反,funky_class
将保持指向其他对象的指针。这就是你可以写
std::shared_ptr<my_type> my_obj(new my_type);
my_obj->i = 3;
此处,my_obj::operator->
返回my_type*
,编译器使用该指针获取i
的{{1}}成员。