x = &(*变量) 与 x = 变量有何不同?

How is x = &(*variable) different from x = variable?

本文关键字:变量 何不同      更新时间:2023-10-16

我一直在通过研究一些项目来理解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)作者似乎正在存储指针值;幸福地不知道对该容器的修改可能使该值无效)。

您还可以看到它与智能指针一起使用,以避免引用计数。

我的建议是:尽可能避免。