C++ 与;(*similarObject)和similarObject?它们不一样吗?
有人能给我解释一下吗C++ 与;(*similarObject)和similarObject?它们不一样吗?,c++,dynamic,casting,C++,Dynamic,Casting,有人能给我解释一下吗 dynamic_cast<SomeObject *>( &(*similarObject) ); dynamic_cast(&(*similarObject)); 对解引用指针的地址执行操作的意义是什么?指针本身不是它的地址吗?可能是similarObject的类型重载了运算符*,因此它返回的是您要传递给dynamic\u cast的地址 &(*x)和x可能并不总是一回事。例如,想想迭代器: std::map<int, int>::ite
dynamic_cast<SomeObject *>( &(*similarObject) );
dynamic_cast(&(*similarObject));
对解引用指针的地址执行操作的意义是什么?指针本身不是它的地址吗?可能是
similarObject
的类型重载了运算符*
,因此它返回的是您要传递给dynamic\u cast
的地址
&(*x)
和x
可能并不总是一回事。例如,想想迭代器:
std::map<int, int>::iterator it = v.begin();
std::map::iterator it=v.begin();
那么it
和&(*it)
是两件不同的事情:
的类型是it
std::map::iterator
的类型是&(*it)
std::pair*
他们完全不一样。类似的情况也可能发生在您的代码片段上。如果similarObject是智能指针,则当*重载时,此技术有时用于获取原始指针的引用。还没有人提到
similarObject
是左值,而&*similarObject
是右值。similarObject是智能指针吗?当*被重载时,这种技术有时用于获取原始指针的引用。运算符的解引用和地址是否可能被重载?@DanDan:将此作为答案。&*也称为“不智能”运算符。括号是不必要的。IssimilarObject
是空指针,这将调用未定义的行为(至少在当前标准中是这样)。此外,如果similarObject
是共享指针或类似的东西,则可能会导致泄漏(对于此用途,存在dynamic\u pointer\u cast
)。另外,someObject
可以是迭代器,而不是指针。我有时使用&*v.begin()
而不是&v[0]
来获取指向std::vector
@Alexandre:在这种情况下,我发现&v[0]
很容易理解,因此我更喜欢它而不是&v.begin()
。我过去常常找到&v[0]
也更容易,但现在不行了。口味会随着时间而变化。@Alexandre:你是说你以前觉得&v[0]
更容易,后来你出了事故,开始觉得很难了P:Dsquare括号很难在法国键盘上输入,使用v.begin()
一直让我很高兴:)。关键是“&*
操作符”有一些用处。auto_ptr
以及Boost和tr1智能指针都有一个函数来实现这一点,.get()
&*similarObject
不必是右值。它也可以是左值。@Nawaz:仅当您重载一元&
运算符以返回引用时。这是你绝对不应该做的。