ob->我本应该回复ob"这个"但它返回我,任何解释?

时间:2018-02-03 15:51:33

标签: c++ overloading

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;
}

2 个答案:

答案 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;

最后一行更改ifunky.obj的值。

在现实世界中,这个例子有点愚蠢;相反,funky_class将保持指向其他对象的指针。这就是你可以写

的原因
std::shared_ptr<my_type> my_obj(new my_type);
my_obj->i = 3;

此处,my_obj::operator->返回my_type*,编译器使用该指针获取i的{​​{1}}成员。