我正在编写一个代码库,我遇到了一些让我感到难过的东西,或者至少让我三思而后行。
我有一个通过引用传递的函数的参数,如下所示:
const PathTile &refTile
在函数中的某一点,pathTile
的成员函数被访问,就像人们期望的那样,使用->
运算符,只需使用{{{ 1}}运算符。奇怪的是代码工作。使用.
时隐含此->
吗?
我问,因为我不确定前一个人是否有意这样做过。我应该改变吗?
答案 0 :(得分:4)
在函数中的某一点,pathTile的成员函数被访问,就像人们期望的那样,使用 - >操作
这是不正确的。通常应通过.
访问引用成员。正如Seth在评论中指出的那样,->
可以重载......当你想假装你的类型是一个指针时,这很有用。 .
不能超载。
这是 - >隐含的时候。用的是??
不,必须有另一种解释。 (立即想到不同的变量和重载的->
)
答案 1 :(得分:2)
有一些称为智能指针的特殊对象,其使用方法与常规指针几乎相同。提供他们重载运算符 - >但它们是真实的物体,所以你可以通过它们调用自己的方法。这样:
struct Foobar { void method(); };
smart_pointer<Foobar> spointer;
spointer->method(); // called method() of class Foobar of instance where spointer points to
spointer.reset(); // called reset() of object spointer itself.
如果你使用引用没有区别,所以如果上面的例子中的spointer是一个引用类型smart_pointer它将是相同的。
答案 2 :(得分:1)
这可能与你可以这样做有关:
foo *x=new foo();
foo &y=*x;
现在:
x->bar();
和
y.bar();
是等同的,合法的,有效的,将编译,并做同样的事情等。
请更多代码
答案 3 :(得分:0)
不,访问次数不同/可互换只是因为它们是引用。
一种常见的情况是引用的对象是容器对象(即智能指针); obj.member
可以访问容器成员,同时obj->member
可以通过operator->()
的标记方便来指定访问包含对象的成员。
我会PathTile
检查operator->()
。