Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 您可以手动调用箭头(->;)运算符功能吗?_C++_Operators - Fatal编程技术网

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)