C++编程教程_箭头(-)运算符的重载
C++箭头操作符不同。它可能会出现像一个二元运算符为:接收对象和一个成员的名字。为解引用成员的对象。无论怎样的箭头操作符的外观不接受明确的参数。没有第二参数,因为 – >右操作数不是表达式,相反,是对应于类成员的标识符。有作为一个参数传递给函数,与此相反,以获得由编译器部件处理工作没有可行的方式明确标识符。
箭头操作符( – >)常见的用法是使用一类对象的指针调用对象的指针的成员。左操作数是一个对象指针(本),该对象的右操作数名成员。在定义了重载箭头操作符看起来有点特别,你可以用一个指针类对象调用,您可以直接与类对象调用。重载箭头操作员必须被定义为类的成员函数。
1.箭头操作符的调用过程
当这样编写时:
point->action();
由于优先级规则,它实际等价于编写:
(point->action)();换句话说,我们要调用是点 – >诉讼,寻求一个结果值。编译器,以便将代码进行评估:
(1)如果该点是一个指向一个对象与命名的动作的构件类,编译器将调用动作代码编译为对象的成员(默认语义)。
(2)否则,如果点(注:中国版误写为行动引物)是一个对象操作符 – >操作符,该点 – >操作和point.operator的定义 – >() – >行动相同。即,操作者的执行点 – >(),然后使用的重复这三个步骤的结果。 (递归调用)
(3)。否则,代码错误。
总结:通过箭头( – >)执行运营商,我们可以得出结论,“重载箭头操作人员必须返回一个指向类类型,或返回定义了自己的箭头操作符类类型的对象。”返回前利用调用编译器的默认语义结束箭头操作符(如果返回类型是一个指针,内置箭头操作符,可用于指针,引用指针编译器解决方案,并从指定的成员对象得到结果),这用于返回递归调用。 (如果返回类型是引用另一对象类型(或对象),操作者将被应用递归编译器检查返回的对象是否属于箭头类型的成员,如果有的话,对操作者的申请;否则,编译器将产生错误。这个过程继续,直到返回一个指针对象与指针的指定成员,或返回一些其它值,在后一种情况下,该代码是错误的)。
2. 实例分析
根据编程语言理解,定义了3个类,C包含B,B包含A。A、B、C都定义了一个action的成员函数。B和C都重载箭头操作符,不同的是B的重载箭头操作符返回的是A类对象的指针,而C的重载箭头操作符返回的是B类对象。
1.
点击(此处)折叠或打开
#include
using namespace std;
class A{
public:
void action(){
cout << “Action in class A!” << endl;
}
};
class B{
A a;
public:
A* operator->(){ //返回指针
return &a;
}
void action(){
cout << “Action in class B!” << endl;
}
};
class C{
B b;
public:
B operator->(){ //返回对象
return b;
}
void action(){
cout << “Action in class C!” << endl;
}
};
int main(int argc, char *argv[])
{
C* pc = new C;
pc->action(); //指针调用(使用默认语义)
C c;
c->action(); //对象调用(使用重载语义)
getchar();
return 0;
}
上面代码输出结果是:
Action in class C!
Action in class A!
其中的代码
C* pc = new C;
pc->action();
输出的结果是
Action in class C!
这个结果比较好理解,pc是类对象指针,此时的箭头操作符使用的是内置含义,对pc解引用然后调用对象的成员函数action。
而下面的代码
C c;
c->action();
输出的结果是
Action in class A!
其实c->action();的含义与c.operator->().operator->()->action();相同。
C++为对象,C后面的箭头运营商正在使用箭头操作符要求C类重载运营商 – >()成员函数。这将返回类对象B,所以称之为B级的运营商 – >()成员函数,B的运营商 – >()返回一个指针,所以现在你可以使用内置的箭头操作符。运营商B的 – >(反向指针)提领,然后调用该对象的成员函数解引用动作之后,在这种情况下,呼叫是行动的A级()。这里有一个递归调用运营商 – >()方法,并最终采用了内置意箭头运算符。更多有关c++相关的网络课程可资讯课课家网络教育平台进行学习观看视频教程!