概述
运算符重载的实质是函数重载.
运算符重载是通过创建运算符函数实现的。
运算符函数定义的一般格式:
<返回类型说明符> operator <运算符符号>(<参数表>)
运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数(非成员函数通常是友元)。
一、成员函数运算符重载
当运算符重载为类的成员函数时,成员函数用this指针隐式地访问了类的一个对象,因此函数的参数个数比原来的操作数要少一个(后置一元运算符重载除外)。常见情况有以下三种:
(1) 二元运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
(2) 前置一元运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
(3) 后置一元运算符重载为类的成员函数时,函数要带有一个整型形参。
以前置一元运算符重载的例子说明:(取负运算)
下面的实例演示了如何重载一元减(取负)运算符( - )
(来源:http://www.runoob.com/cplusplus/cpp-overloading.html )
#include <iostream>
using namespace std;
class Distance
{
private:
int feet;
int inches;
public:
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
void displayDistance()
{
cout << "F: " << feet << " I:" << inches <<endl;
}
Distance operator- () // 重载负运算符( - )
{
feet = -feet;
inches = -inches;
return Distance(feet, inches);
}
};
int main()
{
Distance D1(11, 10), D2(-5, 11);
-D1; // 使用了重载运算符-
D1.displayDistance();
-D2; // 使用了重载运算符-
D2.displayDistance();
return 0;
}
结果:
F: -11 I:-10
F: 5 I:-11
再以二元运算符重载的例子说明:(加运算)
(来源:http://www.runoob.com/cplusplus/cpp-overloading.html )
#include <iostream>
using namespace std;
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
void setLength( double len )
{
length = len;
}
void setBreadth( double bre )
{
breadth = bre;
}
void setHeight( double hei )
{
height = hei;
}
Box operator+(const Box& b) // 重载 + 运算符,用于把两个 Box 对象相加
{
Box box;
box.length = this->length + b.length;
box.breadth = this->breadth + b.breadth;
box.height = this->height + b.height;
return box;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
// 程序的主函数
int main( )
{
Box Box1;
Box Box2;
Box Box3;
double volume = 0.0;
// Box1 详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Box1 的体积
volume = Box1.getVolume();
cout << "Volume of Box1 : " << volume <<endl;
// Box2 的体积
volume = Box2.getVolume();
cout << "Volume of Box2 : " << volume <<endl;
// 把两个对象相加,得到 Box3
Box3 = Box1 + Box2;
// Box3 的体积
volume = Box3.getVolume();
cout << "Volume of Box3 : " << volume <<endl;
return 0;
}
结果:
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400
二、友元函数运算符重载
一般格式为:
friend <函数类型> operator <运算符>(<参数表>)
当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。
调用友元函数运算符的格式如下:
operator <运算符>(<参数1>,<参数2>)
它等价于: <参数1><运算符><参数2>
例如:a+b等价于operator +(a,b)。
实例:输入/输出运算符重载( << 和 >> )
C++ 可以通过重载流提取运算符>>和流插入运算符 <<, 来操作对象等用户自定义的数据类型。
在这里,有一点很重要,我们需要把运算符重载函数声明为类的友元函数,这样我们就能不用创建对象而直接调用函数。
下面的实例演示了如何重载提取运算符 >> 和插入运算符 <<。
(来源:http://www.runoob.com/cplusplus/input-output-operators-overloading.html )
#include <iostream>
using namespace std;
class Distance
{
private:
int feet;
int inches;
public:
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
friend ostream &operator<<( ostream &output, const Distance &D )//重载输出运算符
{
output << "F : " << D.feet << " I : " << D.inches;
return output;
}
friend istream &operator>>( istream &input, Distance &D )//重载输入运算符
{
input >> D.feet >> D.inches;
return input;
}
};
int main()
{
Distance D1(11, 10), D2(5, 11), D3;
cout << "Enter the value of object : " << endl;
cin >> D3; //使用输入重载运算符>>
cout << "First Distance : " ;
cout<< D1 << endl; //使用输出重载运算符<<
cout << "Second Distance :";
cout << D2 << endl; //使用输出重载运算符<<
cout << "Third Distance :";
cout << D3 << endl; //使用输出重载运算符<<
return 0;
}
输出结果:
Enter the value of object :
70
10
First Distance : F : 11 I : 10
Second Distance :F : 5 I : 11
Third Distance :F : 70 I : 10
三、注意事项
1、运算重载符不可以改变语法结构。
2、运算重载符不可以改变操作数的个数。
3、运算重载符不可以改变优先级。
4、运算重载符不可以改变结合性。
5、如下图: