c++ operator ->() 的问题。
智能指针中operator->()的使用貌似不符合一般重载运算符的规则啊。智能指针中,operator->()括号内并没有参数,相当于一个一元重载运算符啊,怎么能当双目运...
智能指针中 operator ->() 的使用貌似不符合一般重载运算符的规则啊。
智能指针中,operator ->() 括号内并没有参数,相当于一个一元重载运算符啊,怎么能当双目运算符来用呢?举个例子:
std::auto_ptr<CString> p(new CString);//CString为MFC的字符串类
p->MakeUpper();//这样便可以调用CString中的函数了
而->被重载的是一元运算符啊,怎么可以这样调用呢,貌似和一般的重载调用规则有所不同。
p->MakeUpper()这一句话貌似被解释成了(p.operator->())->MakeUpper()
那按一般的重载规则,貌似应该这样写才对啊(p->)->MakeUpper()
为什么少了一个箭头啊。是规定或者特例吗,还是有其他的原因。 展开
智能指针中,operator ->() 括号内并没有参数,相当于一个一元重载运算符啊,怎么能当双目运算符来用呢?举个例子:
std::auto_ptr<CString> p(new CString);//CString为MFC的字符串类
p->MakeUpper();//这样便可以调用CString中的函数了
而->被重载的是一元运算符啊,怎么可以这样调用呢,貌似和一般的重载调用规则有所不同。
p->MakeUpper()这一句话貌似被解释成了(p.operator->())->MakeUpper()
那按一般的重载规则,貌似应该这样写才对啊(p->)->MakeUpper()
为什么少了一个箭头啊。是规定或者特例吗,还是有其他的原因。 展开
1个回答
展开全部
你钻牛角尖了。
C++的运算符重载本身就是为了让人们写代码方便而使用的。让人们能有一个类似于简单运算符的直观的函数调用方式。
operator ->()运算符你其实也是可以理解为一元运算符的,它返回的就是一个地址。A->B实际上是对A调用->运算符取得地址,然后加上B的偏移量获取最终地址的一个过程。
所谓规则是人制定的,目的是为了简化问题而不是让问题复杂化。要是为了强制与其它operator行为一致而搞成(p->)->MakeUpper()这种写法,那用起来会极端不方便,而且与人们通常使用->的写法也不一致,就违背“让人们写代码方便”的初衷了。
C++的运算符重载本身就是为了让人们写代码方便而使用的。让人们能有一个类似于简单运算符的直观的函数调用方式。
operator ->()运算符你其实也是可以理解为一元运算符的,它返回的就是一个地址。A->B实际上是对A调用->运算符取得地址,然后加上B的偏移量获取最终地址的一个过程。
所谓规则是人制定的,目的是为了简化问题而不是让问题复杂化。要是为了强制与其它operator行为一致而搞成(p->)->MakeUpper()这种写法,那用起来会极端不方便,而且与人们通常使用->的写法也不一致,就违背“让人们写代码方便”的初衷了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询