x = &(*变量) 与 x = 变量有何不同?
How is x = &(*variable) different from x = variable?
我一直在通过研究一些项目来理解c++,我发现了以下内容:
vector<Circle>::iterator circleIt = mCircles.end();
..
mCurrentDragCircle = &(*circleIt);
你为什么要取消引用,然后再引用它?
*
运算符为iterator
类重载。它不会做简单的取消引用。相反,它返回一个对当前指向的变量的引用。对此使用引用运算符将返回一个指向该变量的指针。
使用mCurrentDragCircle = circleIt;
会将迭代器分配给您的字段。
circleIt
是一个迭代器,迭代器重载operator*
,使其看起来像指针。取消对迭代器的引用将给出对该值的引用;&
将其转换为指向该值的指针。这就是将迭代器转换为指针。
顺便说一下。,取消引用超过末尾(即*v.end()
)具有未定义的行为。正确的方法是
v.data() + v.size()
在C++11中,或
&v[0] + v.size()
在C++98中。两者都假定向量不是空的。
因为迭代器是如何工作的。
*circleIt
将返回Circle的实例,例如,您可以执行
Circle & c = *circleIt;
然后你取那个圆圈的地址并将其存储到一个指针中
Circle * mCurrentDragCircle = & (*circleIt);
希望这能有所帮助。
&*
是提取底层指针的一个特别有害的习惯用法。它经常用于具有重载解引用运算符*
的对象。
迭代器就是这样一类对象。由于某种原因,您类的作者正试图获取底层数据的地址。(这里有两个陷阱,(i)*end()
给出了未定义的行为,以及(ii)作者似乎正在存储指针值;幸福地不知道对该容器的修改可能使该值无效)。
您还可以看到它与智能指针一起使用,以避免引用计数。
我的建议是:尽可能避免。
相关文章:
- Python中的for循环与C++有何不同
- 在C++中释放内存期间,迭代器与指针有何不同
- C++奇怪的行为..相同的变量包含不同的值
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 收益率和回报有何不同?
- 覆盖私有功能,它与受保护功能有何不同?
- 成员变量的不同"kinds"之间的区别
- 无论代码长度如何,以下代码的内存要求有何不同?
- stl::unordered_map 和 stl::vector 的销毁有何不同
- C++ 友元函数在内存位置上有何不同?
- C 是否具有接口类概念,如果它在那里,那么它与Java接口类别有何不同
- std::u8string与std::string有何不同?
- 两种类型转换有何不同?
- 这个语句到底是什么意思 stack<int, list<int> > 它与 stack 有何不同<int>?
- 静态变量在不同模块上共享价值
- 英特尔®事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同?
- 全局变量和类变量有何不同,它们是相同的吗
- 全局排序和每原子变量排序有何不同
- x = &(*变量) 与 x = 变量有何不同?
- 此变量赋值有何不同?