第4章运算符重载_第1页
第4章运算符重载_第2页
第4章运算符重载_第3页
第4章运算符重载_第4页
第4章运算符重载_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换4.1 什么是运算符重载(operator overloading)前面介绍了函数重载,同一个函数名可以代表不同功能的函数。运算符也可以重载。5+8,5.83.67“”运算符重载能适用于int、float和double型问题:将“”运算符重载为复数相加?实现:c3=c1+c2首先,定义一个专

2、门的函数来实现复数相加例4.1通过函数来实现复数相加#include using namespace std;class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex complex_add(Complex &c2); void display(); private: double real; double imag; ;Complex Complex:complex_add(Complex &c2)Complex c; c.real=real+c2.real;

3、c.imag=imag+c2.imag; return c;void Complex:display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3; c3=plex_add(c2); coutc1=; c1.display(); coutc2=; c2.display(); coutreal+c2.real; c.imag=this-imag+c2.imag;c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag;c3=plex_add(c2);什么是运算符重载运算符重载的方法重载

4、运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换4.2 运算符重载的方法 运算符重载是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,即执行表达式就是调用函数的过程。运算符重载是通过定义函数实现的,运算符重载实质上是函数的重载。一般格式:函数类型 operator 运算符名称(形参表列)对运算符的重载处理例如:复数加法的函数原型:Complex operator (Complex&c1,Complex &c2)函数名例4.2重载运算符用于复数相加#include using namespace s

5、td;class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex &c2); void display(); private: double real; double imag; ;Complex Complex:operator + (Complex &c2)Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; void Complex:display(

6、)cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; coutc1=;c1.display(); coutc2=;c2.display(); coutc1+c2=;c3.display(); return 0;Complex Complex:operator + (Complex &c2) return Complex(real+c2.real,imag+c2.imag);在执行本句时,系统自动以类对象c2为实参调用c1的运算符重载函数operator+。c1+c2解释为:c1.operator+(c2)

7、什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换思考题:前例中能否将一个常量和一个复数相加? c3=3+c2; 不正确; c3=complex(3,0)+c2;正确,复数的虚部为0就是实数常量。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换4.3重载运算符的规则什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和

8、提取运算符不同类型数据间的转换防止用户:int operator (int a,int b)return(a-b);如果有两个参数,可以都是类对象,也可以一个是类对象,一个是C+标准类型的数据:Complex operator (int a,Complex c)return(Complex(a+c.real, c.image);什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换4.4运算符重载函数作为类成员函数和友元函数c1+c2解释为:c1.operator+(c2)什么是运算符重载运算符

9、重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换例4.3将运算符“”重载为复数加法,重载函数不作为成员函数,放在类外,作Complex的友元函数。#include /using namespace std;class Complex public: Complex()real=0;imag=0; Complex(double r)real=r;imag=0; Complex(double r,double i)real=r;imag=i; friend Complex operator+ (Complex &c

10、1,Complex &c2); void display(); private: double real; double imag; ;Complex operator+ (Complex &c1,Complex &c2) return Complex(c1.real+c2.real, c1.imag+c2.imag); void Complex:display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; coutc1=; c1.display(); coutc2=; c2.display();

11、 coutc1+c2=; c3.display(); return 0;c1+c2解释为:operator+(c1,c2)什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换运算符重载函数可以是:类的成员函数可以通过This指针自由地访问本类的数据成员,少写一个函数参数。 成员函数定义:Complex Complex:operator + (Complex &c2) return Complex(real+c2.real,imag+c2.imag);调用: c3=c1+c2;要求:第一个参数c

12、1是一个类对象,而且与运算符重载函数的返回类型相同。u将一个复数和一个整数相加,如c1i;成员函数定义: Complex Complex:operator + (int &i) return Complex(real+i,imag);调用: c3=c2i;不能写成: c3=ic2;此时只能将重载函数作为友元函数,不能作为成员函数。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换类的友元函数双目运算符重载为友元函数时,在函数的形参表列中必须有两个参数。声明:friend Complex op

13、erator+ (Complex &c1,Complex &c2);友元函数定义:Complex operator+ (Complex &c1,Complex &c2) return Complex(c1.real+c2.real, c1.imag+c2.imag);调用:c3=c1+c2;形参的顺序任意,不要求第一个参数必须为类对象。要求运算符左侧的操作数与第一个参数对应,运算符右侧的操作数与第二个参数对应。u将一个复数和一个整数相加,如i+c1;声明:friend Complex operator+ (Complex &i,Complex &c);友元函数定义:Complex operat

14、or+ (Complex &i,Complex &c) return Complex(i+c.real, c.imag);调用:c3=i+c2;什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换注意:数学上的交换律不适用调用形式为:c3=c2+i时,再重载运算符“”为:Complex operator+ (Complex &c,Complex &i) return Complex(i+c.real, c.imag);这样, c3=c2+i和c3=i+c2都合法,编译系统会根据表达式的形式选择

15、调用与之匹配的运算符重载函数。一般地,单目运算符重载为成员函数,双目运算符重载为友元函数。既非类的成员函数也非类的友元函数的普通函数普通函数不能访问类的私有成员,所以很少使用。4.5重载双目运算符双目运算符有两个操作数,如:3+5,ab,i10等,相应地,重载函数有两个参数。例4.4定义一个字符串string类,用来存放不定长的字符串,重载运算符“=”,“”用于定义两个字符串的等于,小于和大于的比较运算。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换#include using name

16、space std;class String /String 是用户自己指定的类名 public: String()p=NULL; / 默认构造函数 String(char *str); / 构造函数 void display(); private: char *p; ; String:String(char *str) p=str;void String:display() coutp;int main() String string1(Hello),string2(Book); string1.display(); coutendl; string2.display(); return 0

17、;框架什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换#include #include class String public: String()p=NULL; String(char *str); friend bool operator(String &string1,String &string2); void display(); private: char *p; ;String:String(char *str) p=str;void String:display()cout

18、(String &string1,String &string2) if(strcmp(string1.p,string2.p)0) return true; else return false; int main()String string1(Hello),string2(Book); coutstring2)”什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换#include #include class String public: String()p=NULL; String(ch

19、ar *str); friend bool operator(String &string1,String &string2); friend bool operator(String &string1,String &string2); friend bool operator=(String &string1,String &string2); void display(); private: char *p; ;重载三个运算符String:String(char *str) p=str;void String:display()cout(String &string1,String &s

20、tring2) if(strcmp(string1.p,string2.p)0) return true; else return false; bool operator(String &string1,String &string2) if(strcmp(string1.p,string2.p)0) return true; else return false; bool operator=(String &string1,String &string2) if(strcmp(string1.p,string2.p)=0) return true; else return false; i

21、nt main()String string1(Hello),string2(Book),string3(Computer); coutstring2)endl; cout(string1string3)endl; cout(string1=string2)endl; return 0;什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换#include #include class String public: String()p=NULL; String(char *str); frien

22、d bool operator(String &string1,String &string2); friend bool operator(String &string1,String &string2); friend bool operator=(String &string1,String &string2); void display(); private: char *p; ;String:String(char *str) p=str;void String:display()cout(String &string1,String &string2) if(strcmp(stri

23、ng1.p,string2.p)0) return true; else return false; bool operator(String &string1,String &string2) if(strcmp(string1.p,string2.p)(string1,string2)=1) string1.display();cout;string2.display(); else if(operator(string1,string2)=1) string1.display();cout;string2.display(); else if(operator=(string1,stri

24、ng2)=1) string1.display();cout=;string2.display(); coutendl;int main()String string1(Hello),string2(Book),string3(Computer),string4(Hello); compare(string1,string2); compare(string2,string3); compare(string1,string4); return 0;什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据

25、间的转换4.6重载单目运算符单目运算符只有一个操作数,如:!a,-b,&c,*p,+I,-i等,相应地,重载函数有一个参数。例4.5有一个Time类,包含数据成员minute和second。要求制作秒表:满60秒进位分,秒归零。#include using namespace std;class Timepublic: Time()minute=0;sec=0;/默认构造函数 Time(int m,int s):minute(m),sec(s)/构造函数重载 Time operator+();/声明运算符重载函数 void display()coutminute:sec=60) sec-=60

26、; +minute; return *this;/返回当前对象值int main()Time time1(34,0); for (int i=0;i61;i+)+time1; time1.display(); return 0;什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换C+约定:在自增、自减运算符重载函数中,没有形参int是前置运算符函数,有形参int是后置运算符函数例4.6在前例的基础上增加对后置运算符的重载#include using namespace std;class Ti

27、mepublic: Time()minute=0;sec=0; Time(int m,int s):minute(m),sec(s) Time operator+();/声明前置自增运算符 Time operator+(int);/声明后置自增运算符 void display()coutminute:sec=60) sec-=60; +minute; return *this;Time Time:operator+(int)Time temp(*this); sec+; if(sec=60) sec-=60; +minute; return temp;返回自加后的对象本身返回自加前的对象,然后

28、对象自加int main()Time time1(34,59),time2; cout time1 : ; time1.display();/time原值 +time1; cout+time1: ; time1.display();/+time后的值 time2=time1+; couttime1+: ; time1.display();/time+后的值 cout time2 : ; time2.display();/time+前的值 return 0;重载后置运算符时,多了一个int型参数,增加这个参数只是为了与前置自增运算符重载函数区别,没有别的作用,在定义函数时也不必使用此参数,因此可

29、以省写参数名,只需要在括号中写int即可,编译系统在遇到重载后置自增运算符时,则自动调用此函数。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换4.7重载流插入运算符和流提取运算符 C+位运算符(右移),系统在ostream中进行了重载,用来输入输出C+标准类型的数据。 重载为流提取运算符,属于ostream类库;cin和cout分别是istream类和ostream类的对象。凡用到cout对标准数据类型进行输入输出的,都要#include头文件。用户自己定义的类的对象,是不能直接用来输入

30、和输出的,所以必须进行重载。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换对重载的函数形式为: istream & operator (istream &,自定义类自定义类 &); ostream & operator 和的函数作为友元函数或普通函数,而不能定义为成员函数。&4.7.1重载流插入运算符“”例4.7用运算符输出复数什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换#inc

31、lude class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex &c2); friend ostream& operator (ostream&,Complex&); private: double real; double imag; ;“”运算符重载为成员函数“”运算符重载为友元函数什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不

32、同类型数据间的转换Complex Complex:operator + (Complex &c2) return Complex(real+c2.real,imag+c2.imag);ostream& operator (ostream& output,Complex& c)output(c.real+c.imagi)endl; return output;int main()Complex c1(2,4),c2(6,10),c3; c3=c1+c2; coutc3; return 0;什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符

33、重载插入运算符和提取运算符不同类型数据间的转换对于:ostream& operator (ostream& output,Complex& c) output(c.real+c.imagi)endl; return output;coutc3解释为:operator(cout,c3)形参:&output &c,实参: cout c3函数体相当于: cout(c3.real+c3.imagi)endl; return cout;最后的return cout作用是返回当前值,以便连续向输出流插入信息。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载

34、单目运算符重载插入运算符和提取运算符不同类型数据间的转换如果:coutc3c2;先处理coutc3,则(coutc3)c2;执行得到新的流对象cout,cout(新值)c2,运算符的左侧是ostream对象,右侧是Complex类对象c2,再次调用运算符重载函数,输出c2的数据。注意:重载的流插入运算符的第二个参数为Complex& c,说明只有在输Complex对象时才能使用本重载运算符,对其他类型的对象无效Cout” C+运算符 的作用是从一个输入输出流中提取数据 。重载的目的是输入类的对象。例4.8 在4.7的基础上,增加提取运算符,用cin 输入复数,用cout输出复数。#includ

35、e class Complex public: friend ostream& operator (istream&,Complex&); private: double real; double imag; ;什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换ostream& operator (ostream& output,Complex& c)output(c.real+c.imag (istream& input,Complex& c)coutc.realc.imag; retur

36、n input;cinc1 解释为:operator (cin,c1)形参:&intput &c,实参: cin c1 函数体相当于cinc.realc.imag; return cin;最后的return cin的作用是返回当前值,以便连续从输入流提取数据给程序中的Complex类对象。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换int main()Complex c1,c2; cinc1c2; coutc1=c1endl; coutc2=c2c1c2;语句,每遇到一次就调用一次重载

37、运算符 函数,因此两次提示输入信息。观察下列结果:什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换ostream& operator (ostream& output,Complex& c)output(=0) output+; outputc.imagi); return output;修改:4.8不同类型数据间的转换&4.8.1标准类型数据间的转换复习类型转换:int i=6;i=7.5+i;隐式转换int (8.9);显式转换什么是运算符重载运算符重载的方法重载运算符的规则运算符函数

38、作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换问题:一个自定义的类对象能否转换为标准类型?一个类的对象能否转换为另一个类的对象?答:定义专门的处理函数。&4.8.2转换构造函数默认构造函数 Complex( );/没有参数转换构造函数(conversion constructor function) Complex(double r)real=r,image=0;作用是将double型参数r转换成Complex类对象。带参构造函数 Complex(double r,double i );/用于初始化复制构造函数 Complex(Complex

39、&c );/形参是本类对象的引用转换构造函数只能有一个参数参数类型:需要转换的类型函数体:转换方法什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换转换方法:类名(准备转换类型的数据)隐式转换,定义对象时Complex c1(3.5);/建立一个类对象real3.5,image0Complex (3.5);/声明无名对象显式转换:若重载了“”运算符,c,c1为对象cc1+2.5,/编译错误cc1+Complex(2.5)/正确将一个学生类对象转换为教师类对象,转换构造函数为:Teacher(

40、Student &s)num=s.num;strcpy(name,);sex=sex;要求s中的num,name,sex是公有成员,否则不能被类外引用什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换&4.8.3类型转换函数用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来进行。类型转换函数(type conversion function)的作用是将一个类对象转换成另一类型的数据。类型转换函数也称为:类型转换运算符函数、类型转换运算符重载函数、强制类型转换运算

41、符函数。一般形式:operator 类型名( ) 实现转换的语句什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换operator double( ) return real;/函数名operator double/将一个Complex对象转换为一个double类型数据/其值是Complex类中数据成员real的值类型转换函数不能指定函数类型,函数没有参数。返回值类型是由函数名中指定的类型名来确定。类型转换函数只能作为成员函数,因为转换的主体是本类的对象,不能作为友元函数或普通函数。什么是运

42、算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换double类型经过重载后,除了原有的含义外,还获得新的含义将一个Complex对象转换为double类型数据,并指定了转换方法。转换构造函数和类型转换运算符的共同特点:当需要时,编译系统会自动调用这些函数,建立一个无名的临时对象。例4.9有类型转换函数double,无运算符重载函数#include using namespace std;class Complex public: Complex()real=0;imag=0; Complex(do

43、uble r,double i)real=r;imag=i; operator double() return real; private: double real; double imag; ;int main()Complex c1(3,4),c2(5,-10),c3; double d1,d2=2.5; d1=d2+c1; coutd1endl; return 0;类型转换运算符函数自动调用类型转换函数什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换本例特点:表达式:d1=d2+c1

44、;d2double类型数据,c1是Complex类对象,无operator 重载函数。有operator double重载函数,调用operator double函数,把Complex对象c1转换为double类型数据,建立一个临时的double变量,并与d2相加,最后将一个double型的值赋給d1。什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换例4.10无类型转换函数double,有运算符重载函数和转换构造函数#include /using namespace std;class C

45、omplex public: Complex()real=0;imag=0;/默认构造函数 Complex(double r)real=r;imag=0;/转换构造函数 Complex(double r,double i)real=r;imag=i;/初始化构造函数 friend Complex operator + (Complex c1,Complex c2);/重载运算符 friend ostream& operator (ostream&,Complex&);/重载运算符 private: double real; double imag; ;什么是运算符重载运算符重载的方法重载运算符

46、的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换Complex operator + (Complex c1,Complex c2) return Complex(c1.real+c2.real, c1.imag+c2.imag);ostream& operator (ostream& output,Complex& c)output(=0) output+; outputc.imagi); return output;int main()Complex c1(3,4),c2(5,-10),c3; double d1,d2=2.5

47、; c1=c2+d2; c3=d2+c2; coutc1endl; coutc3endl; return 0;什么是运算符重载运算符重载的方法重载运算符的规则运算符函数作类成员函数和友元函数重载双目运算符重载单目运算符重载插入运算符和提取运算符不同类型数据间的转换本例特点:表达式: c1=c2+d2;c1,c2是Complex类对象,d2是double类型。有operator 重载函数,能实现两个Complex对象相加,但d2不符合要求。无operator double重载函数,不能把c1转换为double类型数据。编译系统发现有转换构造函数,调用Complex(d2),建立一个临时的Complex对象,再调用operator函数,将两个复数相加,值赋給c2。结论:在定义了相应的转换构造函数的前提下,将运算符函数重载为友元函数,在进行两个复数相加时,可以满足交换率。将运算符函数重载为成员函数,不满

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论