[英]What does &**this return exactly?
这是一个指向调用对象的指针(它返回r值)。
*这是一个指向调用对象指针的指针(它返回地址的值)。
**这是一个指向调用对象(???)指针的指针。
&***这是对调用对象(???)指针指针的引用。
std::vector<int>:: iterator i = vector1.begin();
我是指向它自己的r值的指针(返回它自己的值)。
* i是向量中包含的对象的r值的指针(返回&value中指向的值)。
** i是指向包含在向量(???)中的对象的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; }
};
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
如果你有一个类Foo
和这个类的方法,那么使用this
和对象Foo obj
this
- 是pointer to Foo
的类型pointer to Foo
的值,其值为object obj
的地址
所以你可以像这样写(例如在Foo:test()中):
Foo *addr = this;
所以addr
是一个pointer to Foo
的类型pointer to Foo
的变量,它用类Foo
的对象obj
的地址值初始化。
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
会生成Foo
类型的对象。 然后编译器找到(* (*this))
。 但是Foo
不是指针的类型,所以默认情况下没有*
运算符。 因此编译器将返回错误并中断编译。 但是如果在类Foo
定义(重载) operator*()
,则编译器将调用此方法。 所以**this
相当于this->operator*()
或者(*this).operator*()
。
最后一个是operator&()
。 默认情况下,此运算符返回指向object的指针。 但当然它可以超载并返回其他东西。 所以&**this
可以返回1 operator*()
应用于对象的operator*()
返回的对象的地址(* this)
2)返回operator&()
operator*()
返回的对象的方法operator&()
的值,该值被应用于(* this)。
如果没有定义operator*()
那么&**this
将不会编译。
另外,如果没有定义operator*()
并且没有定义operator&()
那么&**some_pointer
的构造将不会编译或将返回(* some_pointer)。 我可以保证(* some_pointer)将是一个指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.