C++ 如何使用指针访问运算符->;作品 #包括 使用名称空间std; 类myclass { 公众: 虚无乐趣() { cout将返回指向myclass的指针,但指针指向的myclass对象如何调用fun()
编辑:既然C++ 如何使用指针访问运算符->;作品 #包括 使用名称空间std; 类myclass { 公众: 虚无乐趣() { cout将返回指向myclass的指针,但指针指向的myclass对象如何调用fun(),c++,pointers,C++,Pointers,编辑:既然spointer::operator->返回一个指向myclass的指针,为什么人们可以说s->fun(),而不是说s->->->fun()或其他什么C++11标准这样说重载的操作符(13.5.6“重载/重载操作符/类成员访问”): 如果存在T::operator->(),并且重载解析机制将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为(x.operator->())->m 因此,成员访问操作符(->)应用于重载实现的结果(产生类似于s->->fun()的注释)
spointer::operator->
返回一个指向myclass
的指针,为什么人们可以说s->fun()
,而不是说s->->->fun()
或其他什么C++11标准这样说重载的
操作符(13.5.6“重载/重载操作符/类成员访问”):
如果存在T::operator->()
,并且重载解析机制将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为(x.operator->())->m
因此,成员访问操作符(
->
)应用于重载实现的结果(产生类似于s->->fun()的注释)。这允许重载在实现智能指针或指针代理时“自然”运行。C++11标准对重载的->
运算符(13.5.6“重载/重载运算符/类成员访问”)作了如下说明:
如果存在T::operator->()
,并且重载解析机制将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为(x.operator->())->m
因此,成员访问操作符(->
)应用于重载实现的结果(产生类似于s->->fun()的注释)。这使得重载在实现智能指针或指针代理时“自然”运行。对不起。你的问题到底是什么?@JoelCornett我猜,既然spointer::operator->
返回指向myclass
的指针,为什么人们可以说s->fun()
,而不必说s->fun())
或其他什么。我认为这是一个有效的问题。@JoelCornett juanchopanza正确地解释了它。@q126y基本答案是“它必须这样工作”,因为它的关键是允许用户定义的类型看起来像指针(至少就反引用而言)除非你需要所有额外的东西,否则不要使用std::endl
。'\n'
开始新的一行。对不起。你的问题到底是什么?@JoelCornett我猜,既然spointer::operator->
返回了一个指向myclass
的指针,为什么可以说s->fun()
,而不必说s->->fun()
或其他什么。我认为这是一个有效的问题。@JoelCornett juanchopanza,正确地解释了它。@q126y基本答案是“它必须这样工作”,因为整个要点是允许用户定义的类型看起来像指针(至少就反引用而言)除非你需要所有额外的东西,否则不要使用std::endl
。'\n'
开始一个新行。如果operator->
返回一个类(不是指针),并且该类也有operator->
返回一个类(不是指针),那么这也可以“级联”还有操作符->
#include <iostream>
using namespace std;
class myclass
{
public:
void fun()
{
cout<<"Having some fun"<<endl;
}
};
class spointer
{
myclass * mptr;
public:
spointer(myclass * m)
{
mptr=m;
}
myclass * operator->()
{
return mptr;
}
};
int main() {
// your code goes here
spointer s(new myclass);
s->fun();
return 0;
}