这是一个指向调用对象的指针(它返回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; }
};
答案 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;
所以addr
是pointer 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
相当于**this
或this->operator*()
。
最后一个是(*this).operator*()
。默认情况下,此运算符返回指向object的指针。但当然它可以超载并返回其他东西。
所以operator&()
可以返回
1)由&**this
返回的对象的地址应用于对象(* this)
2)返回operator*()
返回的对象的方法operator&()
的值,该值被应用于(* this)。
如果没有定义operator*()
,则operator*()
无法编译。
此外,如果未定义&**this
且未定义operator*()
,则operator&()
的构造将无法编译或将返回(* some_pointer)。我可以保证(* some_pointer)将是一个指针。