C++运算符重载
2013-05-14 01:41
274 查看
在定义一个新的类时,其实是将一个新的数据类型引入C++之中,有时候需要对新的数据类型进行运算,为了符合人们的习惯,人们总希望对于新的数据类型仍然可以使用系统已有的运算符进行操作。
操作符是系统预先定义好的一些函数名称,所以可以把运算符重载看作是函数重载的一种特殊形式,因此运算符重载和函数重载是类似的,都是使一个名称具有多重含义,它体现了面向对象程序设计的多态性。
对新的数据成员进行运算时,不可避免的会直接使用类的数据成员,而对于那些私有成员,则只有类的成员函数和类的友元函数才能够访问。因此只有将运算符重载为类的成员函数或者是类的友元函数时才能达到被重载的运算符达到操作新的数据类型的目的。
运算符重载要遵循以下规则:
1)被重载的运算符不能是下面中的一个
. 类成员运算符
* 指针运算符
:: 类作用域运算符
?: 条件运算符
2)运算符被重载后不能改变优先级和结合性,也不能改变语法结构,即不能将单目运算符重载为双目运算符
3)被重载的运算符必须是系统内预先定义好的,自己不能定一新的运算符
4)被重载的运算符虽然可以用来作任何事情,但最好还是使其新的功能与系统定义的功能相似,以便容易使人理解
下面用时钟类来说明一下将加法运算符重载为类的数据成员和类的友元函数两种运算符重载情况:
#include<iostream>
using namespace std;
class Clock //定义时钟类
{
private:
int h, m, s; //定义私有数据成员时、分、秒
public:
Clock(int x, int y,int z); //有参构造函数
Clock(Clock &c); //复制构造函数
Clock(){}; //无参构造函数
Clockoperator+(Clock &c); //加法运算符重载为类的成员函数
friend Clockoperator+(Clock &c, int n); //加法运算符重载为类的友元函数
friend Clockoperator+(int n, Clock &c); //加法运算符重载为类的友元函数
void Display(){cout<< h << ":" << m << ":" <<s;} //显示时间
};
Clock::Clock(Clock &c) //复制构造函数的实现
{
h = c.h;
m = c.m;
s = c.s;
}
Clock::Clock(int x, int y, int z) //有参构造函数的实现
{
h = x;
m = y;
s = z;
}
Clock Clock::operator+(Clock &c) //加法运算符重载为类的成员函数的实现
{
Clock clock = *this; //重载后的加法运算符的左操作数是this对象,右操作数是函数参数
int cs, cm; //秒、秒相加和分、分相加后的进位
clock.s += c.s; //秒相加
cs = clock.s /60;
clock.s %= 60;
clock.m += cs + c.m; //分相加
cm = clock.m /60;
clock.m %= 60;
clock.h += cm + c.h; //时相加
clock.h %= 24;
if(clock.h < 0)clock.h += 24;
return clock;
}
Clock operator+(Clock &c, int n) //加法运算符重载为类的友元函数,加法的右操作数是整数
{
Clock clock = c;
clock.h += n;
clock.h %= 24;
if(clock.h < 0)clock.h +=24;
return clock;
}
Clock operator+(int n, Clock &c) //加法运算符重载为类的友元函数,加法的左操作数是整数
{
Clock clock = c;
clock.h += n;
clock.h %= 24;
if(clock.h < 0)clock.h += 24;
return clock;
}
int main()
{
Clock c1(1, 35, 4), c2(5, 30, 0); //定义c1和c2两个对象,调用有参构造函数初始化
Clock c3; //定义c3对象,调用无参构造函数
c3 = c1 + c2; //重载后的加法运运算符,两个操作数都是对象
c1.Display();
cout << " + ";
c2.Display();
cout << " = ";
c3.Display();
cout << endl;
cout << "4个小时后..." << endl;
c3 = 4 + c3; //重载后的运算符,左操作数是整数,右操作数是对象
c3.Display();
cout << endl;
cout << "14个小时前..." << endl;
c3 = c3 + -14; //重载后的运算符,左操作数是对象,右操作数是整数
c3.Display();
cout << endl;
return 0;
}
操作符是系统预先定义好的一些函数名称,所以可以把运算符重载看作是函数重载的一种特殊形式,因此运算符重载和函数重载是类似的,都是使一个名称具有多重含义,它体现了面向对象程序设计的多态性。
对新的数据成员进行运算时,不可避免的会直接使用类的数据成员,而对于那些私有成员,则只有类的成员函数和类的友元函数才能够访问。因此只有将运算符重载为类的成员函数或者是类的友元函数时才能达到被重载的运算符达到操作新的数据类型的目的。
运算符重载要遵循以下规则:
1)被重载的运算符不能是下面中的一个
. 类成员运算符
* 指针运算符
:: 类作用域运算符
?: 条件运算符
2)运算符被重载后不能改变优先级和结合性,也不能改变语法结构,即不能将单目运算符重载为双目运算符
3)被重载的运算符必须是系统内预先定义好的,自己不能定一新的运算符
4)被重载的运算符虽然可以用来作任何事情,但最好还是使其新的功能与系统定义的功能相似,以便容易使人理解
下面用时钟类来说明一下将加法运算符重载为类的数据成员和类的友元函数两种运算符重载情况:
#include<iostream>
using namespace std;
class Clock //定义时钟类
{
private:
int h, m, s; //定义私有数据成员时、分、秒
public:
Clock(int x, int y,int z); //有参构造函数
Clock(Clock &c); //复制构造函数
Clock(){}; //无参构造函数
Clockoperator+(Clock &c); //加法运算符重载为类的成员函数
friend Clockoperator+(Clock &c, int n); //加法运算符重载为类的友元函数
friend Clockoperator+(int n, Clock &c); //加法运算符重载为类的友元函数
void Display(){cout<< h << ":" << m << ":" <<s;} //显示时间
};
Clock::Clock(Clock &c) //复制构造函数的实现
{
h = c.h;
m = c.m;
s = c.s;
}
Clock::Clock(int x, int y, int z) //有参构造函数的实现
{
h = x;
m = y;
s = z;
}
Clock Clock::operator+(Clock &c) //加法运算符重载为类的成员函数的实现
{
Clock clock = *this; //重载后的加法运算符的左操作数是this对象,右操作数是函数参数
int cs, cm; //秒、秒相加和分、分相加后的进位
clock.s += c.s; //秒相加
cs = clock.s /60;
clock.s %= 60;
clock.m += cs + c.m; //分相加
cm = clock.m /60;
clock.m %= 60;
clock.h += cm + c.h; //时相加
clock.h %= 24;
if(clock.h < 0)clock.h += 24;
return clock;
}
Clock operator+(Clock &c, int n) //加法运算符重载为类的友元函数,加法的右操作数是整数
{
Clock clock = c;
clock.h += n;
clock.h %= 24;
if(clock.h < 0)clock.h +=24;
return clock;
}
Clock operator+(int n, Clock &c) //加法运算符重载为类的友元函数,加法的左操作数是整数
{
Clock clock = c;
clock.h += n;
clock.h %= 24;
if(clock.h < 0)clock.h += 24;
return clock;
}
int main()
{
Clock c1(1, 35, 4), c2(5, 30, 0); //定义c1和c2两个对象,调用有参构造函数初始化
Clock c3; //定义c3对象,调用无参构造函数
c3 = c1 + c2; //重载后的加法运运算符,两个操作数都是对象
c1.Display();
cout << " + ";
c2.Display();
cout << " = ";
c3.Display();
cout << endl;
cout << "4个小时后..." << endl;
c3 = 4 + c3; //重载后的运算符,左操作数是整数,右操作数是对象
c3.Display();
cout << endl;
cout << "14个小时前..." << endl;
c3 = c3 + -14; //重载后的运算符,左操作数是对象,右操作数是整数
c3.Display();
cout << endl;
return 0;
}