&**这到底是什么回报?
What does &**this return exactly?
这是一个指向调用对象的指针(它返回r值)。
*这是一个指向调用对象的指针的指针(它返回地址的值)。
**这是指向调用对象(??)的指针的指针。
&***这是对调用对象(??)的指针的指针的指针的引用。
std::vector<int>:: iterator i = vector1.begin();
i是指向它自己的r值的指针(返回它自己的值)。
*i是vector对象的r值指针(返回&value中所指的值)。
**i是指向vector(??)中包含的对象的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
的值,其值为对象obj
的地址
所以你可以这样写(例如在Foo:test()中):
Foo *addr = this;
所以addr
是一个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*()
返回的对象地址应用于对象(*this)
2)应用于(*this)的operator*()
返回的对象的operator&()
方法的返回值。
如果没有定义operator*()
,则&**this
将无法编译。
另外,如果没有定义operator*()
和operator&()
,那么&**some_pointer
的构造将不编译或返回(*some_pointer)。我可以保证(*some_pointer)将是一个指针。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 我不明白编程中的回报是什么?
- &**这到底是什么回报?