什么& **这回归到底是什么?

时间:2014-03-13 03:05:46

标签: c++ pointers

这是一个指向调用对象的指针(它返回r值)。

*这是一个指向调用对象指针的指针(它返回地址的值)。

**这是一个指向调用对象(???)指针的指针。

& ***这是对调用对象(???)指针指针的引用。

std::vector<int>:: iterator i = vector1.begin();

我是指向自己的r值的指针(返回自己的值)。

* i是向量中包含的对象的r值的指针(返回指向&amp; value的值)。

** i是指向包含在向量(???)中的对象的r值的指针。

我真的很困惑。

这是一个示例代码,我们在其中找到表达式&amp; ** this:

class _Iter
{
private:
    ListElem *pCurr;
    const List *pList;

public:
    _Iter(ListElem *pCurr, const List *list)
        : pCurr_(pCurr), pList(list)
    {}

    T& operator*() { return pCurr_->data; }
    T* operator->() { return &**this; }
};

2 个答案:

答案 0 :(得分:20)

this是指向当前对象的指针。

*this是对当前对象的引用,即this已取消引用。

**this是在当前对象上调用的重载一元operator*函数的返回值。

如果从**this返回的对象具有过载的operator&()函数,则&**this将计算返回的值(**this).operator&()。否则,&**this是指向当前对象上调用的重载一元operator*函数的返回值的指针。

示例:

#include <iostream>

struct A
{
   int b;
   int a;
   int& operator*() {return a;}

   int* test()
   {
      return &**this;
   }
};

int main()
{
   A a;
   std::cout << "Address of a.a: " << a.test() << std::endl;
   std::cout << "Address of a.a: " << &(*a) << std::endl;
   std::cout << "Address of a.a: " << &(a.a) << std::endl;
   return 0;
}

示例输出:

Address of a.a: 0x7fffbc200754
Address of a.a: 0x7fffbc200754
Address of a.a: 0x7fffbc200754

答案 1 :(得分:3)

如果您有一个班级Foo,并且此班级的方法使用this,而对象Foo obj

this - 是pointer to Foo类型的值,其值为对象obj的地址

所以你可以像这样写(例如在Foo:test()中):

Foo *addr = this;

所以addrpointer to Foo类型的变量,使用类obj的对象Foo的地址值进行初始化。

C ++中的所有指针都可以使用*取消引用。因此,当您取消引用指向对象的指针时,您将获得该对象

Foo *addr = get_pointer_to(obj); //function that return a pointer to object

//three equivalent ways to call someMethod() of object obj of class Foo
obj.someMethod();
addr->someMethod();
(*addr).someMethod();

代码的上半部分说明了对象obj和解除引用的指针(*addr)具有相同的语法,因为它们是同一个对象。

C ++允许您重载不同的语言运算符。因此,当您编写(** this)时,编译器会查找this并发现this是指向Foo的指针类型,因此解除引用*this会给出类型为{{{ 1}}。然后编译器找到Foo。但(* (*this))不是指针的类型,因此默认情况下没有Foo运算符。因此编译器将返回错误并中断编译。但是如果在类*中定义(重载)operator*(),则编译器将调用此方法。因此Foo相当于**thisthis->operator*()

最后一个是(*this).operator*()。默认情况下,此运算符返回指向object的指针。但当然它可以超载并返回其他东西。 所以operator&()可以返回 1)由&**this返回的对象的地址应用于对象(* this)
2)返回operator*()返回的对象的方法operator&()的值,该值被应用于(* this)。

如果没有定义operator*(),则operator*()无法编译。

此外,如果未定义&**this且未定义operator*(),则operator&()的构造将无法编译或将返回(* some_pointer)。我可以保证(* some_pointer)将是一个指针。