Что это значит? ** Это точно?
это указатель на вызывающий объект (он возвращает значение 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) будет указателем.