我正在编写一个代码库,我遇到了一些让我很难过的东西,或者至少让我三思而后行。
我有一个通过引用传递的函数的参数,如下所示:
const PathTile &refTile
在函数中的某一时刻,pathTile
可以像预期的那样使用操作符->
访问 的成员函数,使用操作符访问相同的成员函数只需几行.
。奇怪的是代码有效。使用时这是->
隐含的.
吗?
我问是因为我不确定前一个人是否故意这样做。我应该改变它吗?
我正在编写一个代码库,我遇到了一些让我很难过的东西,或者至少让我三思而后行。
我有一个通过引用传递的函数的参数,如下所示:
const PathTile &refTile
在函数中的某一时刻,pathTile
可以像预期的那样使用操作符->
访问 的成员函数,使用操作符访问相同的成员函数只需几行.
。奇怪的是代码有效。使用时这是->
隐含的.
吗?
我问是因为我不确定前一个人是否故意这样做。我应该改变它吗?
在函数中的某一点,使用 -> 操作符访问 pathTile 的成员函数,就像预期的那样
这是不正确的。引用成员通常应通过.
. 正如 Seth 在评论中指出的那样,->
可以重载......当您想假装您的类型是指针时,这很有用。.
不能超载。
这是 -> 当 . 用来??
不,必须有另一种解释。->
(立即想到不同的变量和重载)
有一些称为智能指针的特殊对象,其使用方式几乎与常规指针相同。提供它们重载 operator -> 但它们是真实对象,因此您可以通过 . 所以:
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.
如果您使用引用没有区别,因此如果上面示例中的指针是对类型 smart_pointer 的引用,那么它将是相同的。
这可能与您可以:
foo *x=new foo();
foo &y=*x;
现在:
x->bar();
和:
y.bar();
是等效的、合法的、有效的、将编译并做同样的事情等。
请更多代码
不,访问是不一样的/可互换的,仅仅是因为它们是引用。
一种常见的情况是被引用对象是容器对象(即智能指针)时;obj.member
可以访问容器成员,同时obj->member
可以通过operator->()
.
我会PathTile
检查operator->()
.