&(*similarObject) 和similarObject 之间的区别?他们不一样吗?

Posted

技术标签:

【中文标题】&(*similarObject) 和similarObject 之间的区别?他们不一样吗?【英文标题】:Difference between &(*similarObject) and similarObject? Are they not same? 【发布时间】:2011-10-20 23:21:00 【问题描述】:

谁能给我解释一下

dynamic_cast<SomeObject *>( &(*similarObject) );

解引用指针的地址有什么意义?指针本身不就是它的地址吗?

【问题讨论】:

similarObject 是智能指针吗?当 * 被重载时,这种技术有时用于获取原始指针的引用。 解引用和地址操作符是否重载了? @DanDan:把这个作为答案。 &* 也称为“不智能”运算符。括号是不必要的。 Is similarObject 是一个空指针,这会调用未定义的行为(至少在当前标准中)。此外,如果similarObject 是共享指针或类似的东西,您就会引入潜在的泄漏(有dynamic_pointer_cast 用于此用途)。 someObject 也可以是迭代器,而不是指针。 【参考方案1】:

可能是similarObject 的类型重载了operator*,因此它返回了您要传递给dynamic_cast 的地址。

&amp;(*x)x 可能不总是相同的东西。例如,想想迭代器:

std::map<int, int>::iterator it = v.begin();

那么it&amp;(*it) 是两个不同的东西:

it 的类型是std::map&lt;int, int&gt;::iterator &amp;(*it) 的类型是std::pair&lt;int,int&gt;*

他们完全一样。您的 code-sn-p 也可能发生类似的事情。

【讨论】:

我有时使用&amp;*v.begin() 而不是&amp;v[0] 来获取指向std::vector 开头的指针。 @Alexandre:在这种情况下,我觉得&amp;v[0] 很容易理解,所以我更喜欢它而不是&amp;*v.begin() 我以前也更容易找到&amp;v[0],但现在不是了。口味会随着时间而变化。 @Alexandre:你的意思是你以前更容易找到&amp;v[0],然后你出了事故,你开始觉得很难? :P :D 方括号很难在法语键盘上输入,并且始终使用v.begin() 让我很高兴:)。关键是“&amp;* operator”有一些用处。【参考方案2】:

如果similarObject是一个智能指针,当*已经被重载时,这个技术有时被用来获取一个原始指针的引用。

【讨论】:

auto_ptr 和 Boost 和 tr1 智能指针都有一个功能,.get()【参考方案3】:

还没有人提到similarObject 是左值,而&amp;*similarObject 是右值。

【讨论】:

&amp;*similarObject 不必是右值。它也可以是左值。 @Nawaz:仅当您重载一元 &amp; 运算符以返回引用时。这是你绝对不应该做的事情。

以上是关于&(*similarObject) 和similarObject 之间的区别?他们不一样吗?的主要内容,如果未能解决你的问题,请参考以下文章

Si2155

T700&T750 SDRAM高频SI测试

CreateProcess 只执行一半命令

学习:滚动条

CreateProcess

MFC进程的创建销毁线程的创建与交互