运算符重载实例
- 格式:docx
- 大小:12.61 KB
- 文档页数:2
第14课运算符重载一、运算符重载的概念1、概念一符多用。
通过重载,对运算符赋予新的含义。
如“+”号,通过重载(C++系统完成),既可以进行整数运算,也可以进行浮点数运算。
2、实例:复数的加法(14_001.cpp)3、上例:对“+”运算符进行重载(14_002.cpp)-------------------------------------------------------------------------------二、运算符重载的规则1、不允许自己定义新的运算符2、不能重载的运算符(1). (成员访问运算符)(2)* (成员指针访问运算符)(3):: (域运算符)(4)sizeof (长度运算符)(5)?: (条件运算符)3、不能改变运算对象的个数4、不能改变运算符的运算级别5、不能改变结合性6、重载运算符的函数不能有默认的参数7、至少有一个参数是自定义的类对象(不能全是C++的标准类型)8、用于类对象的运算符必须重载,有两个例外:“=”“&”9、重载功能应该类似于标准的功能------------------------------------------------------------------------------- 三、运算符重载函数作为友元函数实例:复数相加(14_003.cpp)说明:1、在VC++ 6.0中运行此程序,应修改头两行,见程序。
2、由于友元函数会破坏类的封装性,所以应尽量避免使用。
四、重载双目运算符(有两个操作数,如“+”)1、实例:重载字符串比较运算符“==”、“>”、“<”、“!=”说明:C++的字符串类型,就是对以上的运算符进行了重载,方便了字符串的比较 2、程序(14_004.cpp):以“==”运算符重载为例注意:如果将重载函数定义为友元函数,则程序开头两句应改为:#include <iostream.h>3、重载“+”运算符,对类对象进行相加运算(14_exam.cpp)4、重载“<”运算符,对类对象进行比较(14_011.cpp)5、重载“<”运算符,判断点在不在背景空白处(14_012.cpp)-------------------------------------------------------------------------------五、重载单目运算符1、实例:重载运算符“++”(14_005.cpp)说明:第二个重载函数,多了一个“int”参数,无实际意义,只是与第一个函数区别开来。
一、为什么要重载操作符1.操作符重载就是把操作符比如+,-,*,/这些运算符赋于新的意义。
2.操作符重载的目的:C++有许多内置的数据类型,包括int,char,double等,每一种类型都有许多运算符,例如加+,减,乘,除等。
当用户定义了类的对象时,两个对象之间是不能进行这些操作的,比如hyong类的对象a+b,这样的语句如果没有重载+运算符就会出错。
但C++允许用户把这些运算符添加到自已的类中以方便类对象之间的运算就像内置类型的运算一样方便,比如对象a+b这样就很明白更容易懂,当然也可以在类中定义一个对象间相加的函数,比如 a.add(b)调用函数add()以实现两个对象a和b相加,但是这条语句没有比a+b更容易让人理解。
3.怎样实现操作符重载:要实现操作符重载就要使用操作符重载函数,操作符重载函数用关见字operator实现,其形式为:反回类型 operator 操作符 (参数列表){}。
操作符重载函数是一个函数,只不过这个函数的函数名为operator再加上后面要重载的操作符而已,比如要重载+号,则: hyong operator +(hyong m){}这就声明了一个反回类型为hyong的操作符函数,其函数名为operator +4.作为类的成员和友元或者独立于类的区别当操作符重载函数作为类的成员函数时,操作符重载函数的参数会比作为友元或者独立于类的操作符重载函数少一个参数,因为操作符重载类成员函数把调用该函数的第一个类的对象作为函数的第一个参数,也就是隐含的this指针指向调用该函数的第一个对象,所以会少一个参数。
5.调用操作符重载函数的方式:5.1 调用类中的操作符重载函数的方法:当调用类中定义的操作符重载函数时最左边的对象是调用操作符重载函数的对象。
比如在类hyong中重定义的+操作符 hyong operator +(hyong m){},有类hyong的对象m和n则调用操作符重载函数的方法有m+n和m.operator +(n),前一条语句会自动转换为后面这条语句,且m+n的表达式中最左边的对象是调用操作符重载函数的对象,而最右边的那个将被作为参数传送。
/*1.定义一个复数类,通过重载运算符:+、-、*、/ 等,实现两个复数之间的各种运算。
编写一个完整的程序。
*/#include<iostream.h>class Complex{float Real,Image;public:Complex(float x=0,float y=0){Real=x;Image=y;}friend Complex operator + (Complex &,Complex &);friend Complex operator - (Complex &,Complex &);friend Complex operator * (Complex &,Complex &);friend Complex operator / (Complex &,Complex &);void show(){cout<<"Real="<<Real<<'\t'<<"Image="<<Image<<endl;}};Complex operator + (Complex &a,Complex &b){Complex t;t.Real=a.Real+b.Real;t.Image=a.Image+b.Image;return t;}Complex operator - (Complex &a,Complex &b){Complex t;t.Real=a.Real-b.Real;t.Image=a.Image-b.Image;return t;}Complex operator * (Complex &a,Complex &b){Complex t;t.Real=a.Real*b.Real-a.Image*b.Image;t.Image=a.Real*b.Image+a.Image*a.Real;return t;}Complex operator / (Complex &a,Complex &b){Complex t;t.Real=(a.Real*b.Real+a.Image*b.Image)/(b.Real*b.Real+b.Image*b.Image);t.Image=(a.Image*a.Real-a.Real*b.Image)/(b.Real*b.Real+b.Image*b.Image);return t;}{Complex c1(10,20),c2,c3(50,40);c2=c1+c3;c2.show();c2=c1-c3;c2.show();c2=c1*c3;c2.show();c2=c1/c3;c2.show();}/*2.定义描述一个三维点,利用友元函数重载"++"和"--"运算符,并区分这两种运算符的前置和后置运算。
运算符重载
#include<iostream>
using namespace std;
class Time{
public:
Time(int newH,int newM,int newS); //有参构造
Time(){ //无参构造
hour=0;
minute=0;
second=0;}
int getH(){return hour;}int getM(){return minute;}
int getS(){return second;}
void getslot(){cin>>hour>>minute>>second;}
void getoldtime(){cin>>hour>>minute>>second;}
void gettime() const;
Time& operator+();
int hour,minute,second;
};
Time::Time(int hour/*=0*/,int minute/*=0*/,int second/*=0*/){
if(0<=hour&&hour<24&&0<=minute&&minute<60&&0<=second&&second<60)
{this->hour=hour;
this->minute=minute;
this->second=second;
}else cout<<"Time error!"<<endl;
}
void Time::gettime()const{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
Time&Time::operator+()
{cout<<"timeslot>>";Time timeslot;timeslot.getslot();cout<<"New time>>";
second=second+timeslot.second;if(second>=60){second-=60;minute=minute+1;
if(minute>=60){minute-=60;
hour=(hour+1)%24;
}}
minute=minute+timeslot.minute; if(minute>=60){minute-=60;
hour=(hour+1)%24;}
hour=hour+timeslot.hour;if(hour>=24){hour=(hour+1)%24;
}
return *this;
}
int main(){
Time oldclock;
cout<<"Set time>>";
oldclock.getoldtime();
if(oldclock.hour>=24||oldclock.minute>=60||oldclock.second>=60) cout<<"Time error!";
else {cout<<"old Time>>";
oldclock.gettime();
(+oldclock).gettime();}
return 0;
}。