Что это значит? ** Это точно?

это указатель на вызывающий объект (он возвращает значение r).

* это указатель на указатель вызывающего объекта (он возвращает значение адреса).

** это указатель на указатель указателя вызывающего объекта (???).

& *** это ссылка на указатель указателя на указатель вызывающего объекта (???).

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

i является указателем на его собственное значение r (возвращает свое собственное значение).

* я - указатель r-значения объекта, содержащегося в векторе (возвращает значение, указанное в & value).

** я - указатель на указатель r-значения объекта, содержащегося в векторе().

Я действительно смущен.

Здесь пример кода, где мы находим выражение & ** 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; }
};

Ответ 1

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

Ответ 2

Если у вас есть класс Foo и метод этого класса, которые используют this и объект Foo obj, тогда

this - это значение типа pointer to Foo, которое имеет значение адреса объекта obj

чтобы вы могли писать так (например, в Foo: test()):

Foo *addr = this;

поэтому addr - это переменная типа pointer to Foo, которая инициализируется значением адреса объекта obj класса Foo.

Все указатели на С++ могут быть разыменованы с помощью *. Поэтому, когда вы разыскиваете указатель на объект, вы получаете этот объект

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) имеют одинаковый синтаксис, потому что они являются одним и тем же объектом.

С++ позволяет перегружать разные языки. Поэтому, когда вы пишете (** this), компилятор смотрит на this и обнаруживает, что this является типом указателя на Foo, поэтому разыменование *this дает объект типа Foo. Затем компилятор найдет (* (*this)). Но Foo не является типом указателя, поэтому по умолчанию не существует оператора *. Таким образом, компилятор вернет ошибку и сломает компиляцию. Но если вы определяете (перегружать) operator*() в классе Foo, то компилятор вызовет этот метод. Итак, **this эквивалентно this->operator*() или (*this).operator*().

Последний <<228 > . По умолчанию этот оператор возвращает указатель на объект. Но, конечно, это может быть перегружено и вернуть что-то еще. Так что &**this может вернуться 1) адрес объекта, который был возвращен operator*(), примененный к объекту (* this)
2) вернуть значение метода operator&() объекта, который был возвращен operator*(), который был применен к (* this).

Если не определено operator*(), то &**this не будет компилироваться.

Кроме того, если не определено operator*() и нет operator&(), то конструкция &**some_pointer либо не будет компилироваться, либо будет возвращена (* some_pointer). И я могу гарантировать, что (* some_pointer) будет указателем.