运算符重载是一种形式的C++多态。为什么需要函数重载?为了能实现自定义数据类型的运算(如类),对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。使用重载运算符我们可以将两个对象相加。
类重载包括成员函数重载和非成员函数重载。
语法(成员函数重载)
返回类型 operator重载运算符(参数列表)
示例:
- #include
- using namespace std;
-
- class score
- {
- public:
- score()
- {
- math_score = 60;
- };
- ~score(){};
- score operator*(double num);
- void show_score()
- {
- cout << math_score << endl;
- }
-
- private:
- double math_score;
- };
-
- score score::operator*(double num)
- {
- score sc;
- sc.math_score *= num;
- return sc;
- }
-
- int main()
- {
- score sco;
- score sc = sco * 1.5;
- sco.show_score();
- system("pause");
- return 0;
- }
定义了一个score类,在成员函数里声明重载了'*'运算符,并在类外进行实现(实现过程很简单)。
上述代码中score sc = sco * 1.5;的实质是 score sc = sco.operator*(1.5);
因此这就导致一个很大的问题;
以上述方式实现score sc = 1.5 * sco;是行不通的
解决办法是非成员函数重载,即在类外重载。但是有一个问题是,我们的math_score是private的,是访问不到的。于是这时候我们的友元就派上用场了。
友元函数、友元类、友元成员函数
下面用我们的友元函数解决上面的问题
- #include
- using namespace std;
-
- class score
- {
- public:
- score()
- {
- math_score = 60;
- };
- ~score(){};
- score operator*(double num);
- friend score operator*(double num, const score sco);
- void show_score()
- {
- cout << math_score << endl;
- }
-
- private:
- double math_score;
- };
-
- score score::operator*(double num)
- {
- score sc;
- sc.math_score *= num;
- return sc;
- }
-
- score operator*(double num, const score sco)
- {
- score sc;
- sc.math_score *= num;
- return sc;
- }
- int main()
- {
- score sco;
- score sc = 1.5 * sco;
- sc.show_score();
- system("pause");
- return 0;
- }
运行结果:
可以看到,主要更改部分在于在类里面用freind关键字声明了一个友元函数,并且在类外进行了实现(不用加类名::)。由运行结果可知,用函数友元可以有效的解决上述问题。
在之前,我们向屏幕输出math_score使用了sc.show_score函数。然而如果能直接用cout< 如果我们使用成员函数重载,那么有上述可知对象将为第一个操作数,这意味着必须这样使用<<: trip< 于是由上面可知,我们可以使用友元来实现非成员函数重载: 结果: 我们定义了一个Time类,并重载<<运算符来使用cout< 参考资料: C++ Prime Plus 第6版