C++ 您可以手动调用箭头(->;)运算符功能吗?
如果我有一个C++ 您可以手动调用箭头(->;)运算符功能吗?,c++,operators,C++,Operators,如果我有一个Foo*Foo,我可以说Foo->bar()。是否可以手动调用操作员->()功能?如果是这样,我将如何传递它bar() 如果改为Foo-Foo,会有区别吗 可能类似于foo.operator->(bar)?是的,您可以。使用重载->时,编译器将foo->bar()表达式解释为foo.operator->()->->bar()。这正是“手动”调用它的方式:foo.operator->()->bar() 如果重载的运算符->函数“正确”实现,即它返回的内容也支持运算符->,那么使用“手动
Foo*Foo
,我可以说Foo->bar()。是否可以手动调用操作员->()
功能?如果是这样,我将如何传递它bar()
如果改为Foo-Foo
,会有区别吗
可能类似于foo.operator->(bar)
?是的,您可以。使用重载->
时,编译器将foo->bar()
表达式解释为foo.operator->()->->bar()
。这正是“手动”调用它的方式:foo.operator->()->bar()
如果重载的运算符->
函数“正确”实现,即它返回的内容也支持运算符->
,那么使用“手动”语法没有多大意义,因为它与“非手动”语法的作用相同
唯一需要使用“手动”语法的情况是,重载的运算符->
的实现返回的内容不支持另一个>
应用程序。例如,int
值
是否可以手动调用运算符->()函数
没有运算符->()函数,因为示例中的foo
是指针。对于指针,->
的行为由语言定义
如果类型Foo
有一个operator->()
函数,并且您定义了Foo*Foo
,您可以这样做来调用operator->()
函数:
(*foo)->...;
也可以使用直接调用语法:
(*foo)operator->()->...;
对
@迈克尔,把代码弄糊涂了哈哈,我只是想礼貌一点:)你没有通过bar
。可重载的运算符->
是一元运算符,仅作用于其LHS。它返回一个指针,或者返回一个对象,该对象依次重载了运算符->
。最终,您会得到一个指针,它在中被替换为LHS。C++函数不能把名字作为参数,所以没有办法说“当<代码> bar >代码>被查找在类<代码> fo的实例中,这样做:“例如,你可能习惯于从python中得到的<代码>
或->
?@Nawaz不能重载运算符,除非至少有一个类型是用户定义的。如果允许,调用的形式将是operator->(foo)->bar()
,因为只有类类型才有成员。想想operator+(int,T const&)
,如果T
是用户定义的,0+T
将是operator+(0,T)
的糖,而不是0。operator+(T)
@Luc:我不明白你的评论。我的困惑在于
与->
在foo中。操作员@Nawaz我假设foo
有类型foo*
,就像OP的问题一样。如果foo
有一个类类型,例如std::unique_ptr
,那么您是正确的:foo->bar
相当于foo。操作符->()->bar
将在一个链中隐式调用操作符->()
,以获取指针类型的内容,此时,->
(取消引用指针并访问成员)的内置逻辑开始生效。(这不能被重写,因为不能重载指针类型的运算符。)当然,如果链以既不是指针也没有重载的类型(例如int
)结束,则会出现编译器错误。
(*foo)->bar(); //syntax one (implicit)
(*foo)->operaror->()->bar(); //syntax two (explicit)
foo->operator->()->bar(); //syntax three (explicit)