本文主要介绍在C++编程语言中使用关键字operator重载运算符(也称“重载操作符”)的相关知识,同时通过示例代码介绍使用关键字operator重载运算符的具体方法。
1 概述
1.1 What
operator是C++的一个关键字,它和运算符(如“=”)一起使用,表示一个运算符重载函数,在理解时可将operator和待重载的运算符整体(如“operator=”)视为一个函数名。
使用operator重载运算符,是C++扩展运算符功能的方法。使用operator扩展运算符功能的原因如下:
- 使重载后的运算符的使用方法与重载前一致;
- 扩展运算符的功能只能通过函数的方式实现。(实际上,C++中各种“功能”都是通过函数实现的)
1.2 Why
C++提供的运算符,通常只支持对于基本数据类型和标准库中提供的类进行操作,而对于用户自己定义的类,如果想要通过这些运算符实现一些基本操作(如比较大小、判断是否相等),就需要用户自己对这个运算符进行相应的功能实现了。
例如,我们设计了一个名为“person”的类,现在要判断person类的两个对象p1和p2是否相同,比较规则是比较对象的年龄(person类的数据成员“age”)大小。那么,在设计person类的时候,就可以通过对运算符“==”进行重载,来使运算符“==”具有比较对象p1和p2的能力(实际上比较的内容是person类中的数据成员“age”)。
上面描述的对运算符“==”进行重载,之所以叫“重载”,是由于编译器在实现运算符“==”功能的时候,已经针对这个运算符提供了对于一些基本数据类型的操作支持,只不过现在该运算符所操作的对象变成了我们自定义的数据类型(如class)。而在默认情况下,该运算符是不能对我们自定义的数据类型进行操作的。因此,通过对该运算符进行重载,给出该运算符操作我们自定义的数据类型的方法,达到使用该运算符对我们自定义的数据类型进行运算的目的。
1.3 How
实现运算符重载的方式通常有以下两种:
- 运算符重载实现为类的成员函数;
- 运算符重载实现为非类的成员函数(即全局函数)。
1.3.1 运算符重载实现为类的成员函数
在类体中声明(定义)需要重载的运算符,声明方式跟普通的成员函数一样,只不过运算符重载函数的名字是“关键字operator紧跟一个C++预定义的操作符”,示例用法如下(person是我们定义的类):
bool operator==(const person& ps) { if (this->age == ps.age) { return true; } return false; }
示例代码内容如下:
#include <iostream> using namespace std; class person { private: int age; public: person(int nAge) { this->age = nAge; } bool operator==(const person& ps) { if (this->age == ps.age) { return true; } return false; } }; int main() { person p1(10); person p2(10); if (p1 == p2) { cout << "p1 is equal with p2." << endl; } else { cout << "p1 is not equal with p2." << endl; } return 0; }
编译并运行上述代码,结果如下:
通过上述结果能够知道:因为运算符重载函数“operator==”是person类的一个成员函数,所以对象p1、p2都可以调用该函数。其中的“if (p1 == p2)”语句,相当于对象p1调用函数“operator==”,把对象p2作为一个参数传递给该函数,从而实现了两个对象的比较。
1.3.2 运算符重载实现为非类的成员函数(即全局函数)
对于全局重载运算符,代表左操作数的参数的类型必须被显式指定。
示例代码如下:
#include <iostream> using namespace std; class person { public: int age; }; // 左操作数的类型必须被显式指定 // 此处指定的类型为person类 bool operator==(person const& p1 ,person const& p2) { if (p1.age == p2.age) { return true; } else { return false; } } int main() { person p1; person p2; p1.age = 18; p2.age = 18; if (p1 == p2) { cout << "p1 is equal with p2." << endl; } else { cout << "p1 is NOT equal with p2." << endl; } return 0; }
编译并运行上述代码,结果如下:
1.3.4 运算符重载的方式选择
可以根据以下因素,确定把一个运算符重载为类的成员函数还是全局函数:
- 如果一个重载运算符是类的成员函数,那么只有当与它一起使用的左操作数是该类的对象时,该运算符才会被调用;而如果该运算符的左操作数确定为其他的类型,则运算符必须被重载为全局函数;
- C++要求'='、'[]'、'()'、'->'运算符必须被定义为类的成员函数,把这些运算符通过全局函数进行重载时会出现编译错误;
- 如果有一个操作数是类类型(如string类),那么对于对称操作符(比如操作符“==”),最好通过全局函数的方式进行重载。
1.3.5 运算符重载的限制
实现运算符重载时,需要注意以下几点:
- 重载后的运算符的操作数至少有一个是用户定义的类型;
- 不能违反运算符原来的语法规则;
- 不能创建新的运算符;
- 有一些运算符是不能重载的,如“sizeof”;
- =、()、[]、->操作符只能被类的成员函数重载。
1.3.6 运算符重载的详细用法
- 关于赋值运算符的重载函数(operator=)的相关内容,请点击此处
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/600.html