第4章_运算符重载.ppt

上传人:hyn****60 文档编号:70746832 上传时间:2023-01-27 格式:PPT 页数:75 大小:159KB
返回 下载 相关 举报
第4章_运算符重载.ppt_第1页
第1页 / 共75页
第4章_运算符重载.ppt_第2页
第2页 / 共75页
点击查看更多>>
资源描述

《第4章_运算符重载.ppt》由会员分享,可在线阅读,更多相关《第4章_运算符重载.ppt(75页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第四四章章 运算符重载运算符重载C+面向对象程序设计C+语言程序设计本章主要内容本章主要内容4.1 什么是运算符重载什么是运算符重载4.2 运算符重载的方法运算符重载的方法4.3 重载运算符的规则重载运算符的规则4.4 运算符重载函数作运算符重载函数作为类成员函数和友元为类成员函数和友元函数函数4.5 重载双目运算符重载双目运算符4.6 重载单目运算符重载单目运算符4.7 重载流插入运算重载流插入运算符和流提取运算符符和流提取运算符4.8 不同类型数据间不同类型数据间的转换的转换2C+语言程序设计【目的要求目的要求】1、掌握运算符重载的基础知识。2、掌握运算符重载函数为类成员函数及友元函数的

2、方法。3、熟悉不同类型数据间的转换。【重点重点】运算符重载的方法;运算符重载函数作为类成员函数;运算符重载函数作为友元函数;单目运算符重载;不同类型数据之间的转换。【难点难点】单目运算符重载函数;不同类型数据间的转换。3C+语言程序设计4.1 什么是运算符重载什么是运算符重载 函数的重载函数的重载 所谓函数的重载是指完成不同功能的函数所谓函数的重载是指完成不同功能的函数可以具有相同的函数名。可以具有相同的函数名。C+的编译器是根据函数的实参来确定应的编译器是根据函数的实参来确定应该调用哪一个函数的。该调用哪一个函数的。运算符重载运算符重载 就是赋予已有的运算符多重含义就是赋予已有的运算符多重含

3、义。C+通通过重新定义运算符,使它能够用于特定过重新定义运算符,使它能够用于特定类的类的对象对象执行特定的功能执行特定的功能4C+语言程序设计例如:例如:“”是是右移运算符右移运算符,但在输入操作中又是,但在输入操作中又是与流对象与流对象cin配合使用的配合使用的流提取运算符流提取运算符。因此,如果程序中用因此,如果程序中用“”作流作流插入运算符和流提取运算符,必须在本文件插入运算符和流提取运算符,必须在本文件模块中包含头文件模块中包含头文件iostream。例例4.1 没有用运算符重载,通过函数来实现两没有用运算符重载,通过函数来实现两个复数相加。个复数相加。5C+语言程序设计#includ

4、e 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;/虚部虚部;6C+语言程序设计Complex Complex:complex_add(Complex&c2)Complex c;c.real=real+c2.re

5、al;/两个复数实部相加两个复数实部相加 c.imag=imag+c2.imag;/两个复数虚部相加两个复数虚部相加 return c;void Complex:display()/定义输出函数定义输出函数 cout(real,imagi)endl;7C+语言程序设计int main()Complex c1(3,4),c2(5,-10),c3;c3=plex_add(c2);/调用复数相加函数调用复数相加函数 coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;8C+语言程序设计运算结果是正确的。

6、但能否进行:运算结果是正确的。但能否进行:c3=c1+c2;的运算呢?的运算呢?4.2 运算符重载的方法运算符重载的方法 运算符重载的方法是运算符重载的方法是定义一个重载运算符的定义一个重载运算符的函数函数,在需要执行被重载的运算符时,系统,在需要执行被重载的运算符时,系统就自动调用该函数。即:就自动调用该函数。即:运算符重载实质上运算符重载实质上是函数的重载。是函数的重载。重载运算符的一般格式为:重载运算符的一般格式为:函数类型函数类型 operator 运算符名称运算符名称(形参表列形参表列)对运算符的重载处理对运算符的重载处理 9C+语言程序设计例如:想将例如:想将“+”用于用于Comp

7、lex类类(复数复数)的加法运算,函数的原型可以是:的加法运算,函数的原型可以是:Complex operator+(Complex&c1,Complex&c2);其中:其中:operator是关键字,是专门用于定义是关键字,是专门用于定义重载运算符的函数的;重载运算符的函数的;运算符名称就是运算符名称就是C+提提供给用户的预下定义运算符。供给用户的预下定义运算符。注意:函数名是由注意:函数名是由operator和运算符组成,和运算符组成,即上面的即上面的operator+就是函数名,意思就是函数名,意思是:对运算符是:对运算符+重载。重载。10C+语言程序设计定义了重载运算符的函数后,可出说

8、:函定义了重载运算符的函数后,可出说:函数数operator+重载了运算符重载了运算符+。如执行到如执行到复数相加:复数相加:c3=c2+c1;时,系统就会调;时,系统就会调用用operator+函数,把函数,把c1和和c2作为实参。作为实参。怎样理解运算符重载函数?怎样理解运算符重载函数?对于普通函数,对于普通函数,参数出现在圆括号内,而对于运算符重载函参数出现在圆括号内,而对于运算符重载函数,参数出现在其左、左两侧数,参数出现在其左、左两侧。例例4.2 重载运算符重载运算符“+”,使之能用于两个复,使之能用于两个复数对象的相加。数对象的相加。11C+语言程序设计#include using

9、 namespace std;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;12C+语言程序设计Complex Complex:operator+(Complex&c2)/定义重载运

10、算符定义重载运算符+的函数的函数 Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complex:display()cout(real,imagi)endl;13C+语言程序设计int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;/运算符运算符+用于复数运算用于复数运算 coutc1=;c1.display();coutc2=;c2.display();coutreal+c2.real 将运算符重载为成员函数后,如出现含该运将运算符重载为成员函数后,如出现含该运算符的表达

11、式,如:算符的表达式,如:c1+c2,编译系统把它解,编译系统把它解释为:释为:c1.oporator+(c2)即通过对象即通过对象c1调用运算符重载函数,并以表调用运算符重载函数,并以表达式中第二个参数达式中第二个参数(c2)作为函数实参。作为函数实参。c1.real20C+语言程序设计例例4.3 将运算符将运算符“+”重载为重载为Complex类的友元函数。类的友元函数。#include class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;friend Complex oper

12、ator+(Complex&c1,Complex&c2);/重载函数作为友元函数重载函数作为友元函数 void display();private:double real;double imag;21C+语言程序设计Complex operator+(Complex&c1,Complex&c2)/定义作为友元函数的重载函数定义作为友元函数的重载函数 return Complex(c1.real+c2.real,c1.imag+c2.imag);void Complex:display()cout(real,“imagi)endl;22C+语言程序设计int main()Complex c1(3

13、,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;此例与上例比较后区别如下:此例与上例比较后区别如下:(1)运算符重载函数是作为运算符重载函数是作为Complex的友元函数的友元函数23C+语言程序设计(2)运算符重载函数有两个参数。即运算符重载函数有两个参数。即c1+c2 解释为:解释为:operator+(c1,c2)C+规定,有的运算符,如:规定,有的运算符,如:赋值运算符赋值运算符、下标运算符下标运算符、函数调用运算符函数调用运算符必须

14、定义为类必须定义为类的成员函数;有的运算符只能定义为友元函的成员函数;有的运算符只能定义为友元函数,如:数,如:流插入流插入()运算符、运算符、类型转换运算符。类型转换运算符。一般:将单目运算符重载为成员函数,将一般:将单目运算符重载为成员函数,将双目运算符重载为友元函数。双目运算符重载为友元函数。说明:说明:VC6.0它提供的不带后缀它提供的不带后缀.h的头文的头文件不支持把成员函数重载为友元函数。故头件不支持把成员函数重载为友元函数。故头文件采用文件采用#include 24C+语言程序设计4.5 重载双目运算符重载双目运算符双目运算符又称二元运算符,是双目运算符又称二元运算符,是C+中最

15、常用中最常用的运算符。双目运算符有两个操作数,通常的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,如在运算符的左右两侧,如3+5,ab等。重载等。重载双目运算符,不言而喻在函数中应该有两个双目运算符,不言而喻在函数中应该有两个参数。参数。例:例:4.4 定义一个字符串类定义一个字符串类String,用来存放,用来存放不定长的字符串,重载运算符不定长的字符串,重载运算符“=”、“”,用于两个字符串的等于、小于和大,用于两个字符串的等于、小于和大于的比较运算。于的比较运算。25C+语言程序设计(1)先建立一个先建立一个String类:见类:见C4-4-1(VC+).CPP#include

16、 using namespace std;Class String /String 是用户自己指定的类名是用户自己指定的类名public:String()p=NULL;/默认构造函数默认构造函数 String(char*str);/构造函数构造函数 void display();private:char *p;/字符型指针,用于指向字符串字符型指针,用于指向字符串;26C+语言程序设计String:String(char*str)/定义构造函数定义构造函数 p=str;/使使p指向实参字符串指向实参字符串void String:display()coutp;/输出输出p所指向的字符串所指向的字

17、符串int main()String string1(Hello),string2(Book);string1.display();coutendl;/换行换行 string2.display();cout”运算符重载部分。运算符重载部分。C4-4-2(VC).CPP#include#include class String public:String()p=NULL;String(char *str);/重载构造函数声明重载构造函数声明 friend bool operator(String&string1,String&string2);/声明运算符函数为友元函数声明运算符函数为友元函数

18、void display();private:char *p;/字符型指针,用于指向字符串字符型指针,用于指向字符串;28C+语言程序设计String:String(char*str)p=str;void String:display()cout(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)return true;else return false;int main()String string1(Hello),string2(Book);coutstring2)endl;return 0;29C+语言程序设计(3

19、)扩展到对扩展到对3个运算符重载。个运算符重载。C4-4-3(VC).CPP#include#include class Stringpublic:String()p=NULL;String(char*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;30C+语言程

20、序设计String:String(char*str)p=str;void String:display()cout(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;31C+语言程序设计bool operator=(String&string1,Stri

21、ng&string2)if(strcmp(string1.p,string2.p)=0)return true;else return false;int main()String string1(Hello),string2(Book),string3(Computer);coutstring2)endl;cout(string1string3)endl;cout(string1=string2)endl;return 0;32C+语言程序设计(4)进一步完善成最终的程序。进一步完善成最终的程序。C4-4-4(VC).CPP#include#include class Stringpubli

22、c:String()p=NULL;String(char*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;33C+语言程序设计String:String(char*str)p=str;void String:display()cout(String&string1

23、,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)(string1,string2)=1)string1.display();cout;string2.display();else if(operator(string1,string2)=1)string1.display();cout;string2.display();else if(op

24、erator=(string1,string2)=1)string1.display();cout=;string2.display();coutendl;35C+语言程序设计int main()String string1(Hello),string2(Book),string3(Computer),string4(Hello);compare(string1,string2);compare(string2,string3);compare(string1,string4);return 0;36C+语言程序设计本程序设计的指导思想:先搭框架,逐步扩充,本程序设计的指导思想:先搭框架,逐步

25、扩充,由简到繁,最后完善。边编程,边调试,边由简到繁,最后完善。边编程,边调试,边扩充。扩充。4.6 重载单目运算符重载单目运算符 单目运算符只有一个参数,如单目运算符只有一个参数,如-b,!,!a,*p,+i,i+等。重载单目运算符与重载双目等。重载单目运算符与重载双目运算符的方法是一样的,但由于单目运算符运算符的方法是一样的,但由于单目运算符只有一个操作数,因此运算符重载函数只有只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。数,则还可省略此参数。下面的例以自增运算符下面的例以自增运算符“+”进行重载。

26、进行重载。37C+语言程序设计例例 4.5 “+”前缀运算符的重载。前缀运算符的重载。#include using namespace std;class Time public:Time()minute=0;sec=0;/默认构造函数默认构造函数 Time(int m,int s):minute(m),sec(s)/构造函数重载构造函数重载 Time operator+();/声明运算符重载函数声明运算符重载函数 void display()coutminute:sec=60)sec-=60;/满满60秒进秒进1分钟分钟 +minute;return*this;/返回当前对象值返回当前对象值

27、 int main()Time time1(34,0);for(int i=0;i61;i+)+time1;time1.display();return 0;39C+语言程序设计此例是前置自增运算符,那后置自增运算符怎此例是前置自增运算符,那后置自增运算符怎么重载呢?么重载呢?C+约定:约定:如果在自增如果在自增(自减自减)运算符重运算符重载函数中,增加一个载函数中,增加一个int型参数,就是后置自型参数,就是后置自增增(自减自减)运算符运算符。例例4.6 含后置的自增运算符。含后置的自增运算符。#include using namespace std;class Time public:40

28、C+语言程序设计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)/定义后置自增运算符定义后置自增运算符“+”重载函数重载函数 T

29、ime temp(*this);sec+;if(sec=60)sec-=60;+minute;return temp;/返回的是自加前的对象返回的是自加前的对象42C+语言程序设计int main()Time time1(34,59),time2;cout time1:;time1.display();+time1;cout+time1:;time1.display();time2=time1+;/将自加前的对象的值赋给将自加前的对象的值赋给time2 couttime1+:;time1.display();cout time2:;time2.display();/输出输出time2对象的值对

30、象的值 return 0;43C+语言程序设计说明:重载后置自增运算符时,多了一个说明:重载后置自增运算符时,多了一个int型型的参数,增加这个参数的目的只是为了与前的参数,增加这个参数的目的只是为了与前置自增运算符重载函数相区别,没有任何作置自增运算符重载函数相区别,没有任何作用,因此在定义函数时只给出了类型名而没用,因此在定义函数时只给出了类型名而没有参数名。有参数名。4.7 重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符 C+流插入运算符流插入运算符“”是是C+在类库中提供的,所有的在类库中提供的,所有的C+编编译系统都在类库中提供输入流类译系统都在类库中提供输入流类ist

31、ream和输和输出流类出流类ostream。cin和和cout分别是分别是istream类和类和ostream类的对象。在类库提供的头文件类的对象。在类库提供的头文件中已经对中已经对“”进行了重进行了重44C+语言程序设计载,使之作为流插入运算符和流提取运算符,载,使之作为流插入运算符和流提取运算符,能用来输出和输入能用来输出和输入C+标准类型的数据。这就标准类型的数据。这就是前面每一个程序都加:是前面每一个程序都加:#include 语句的原因,即把头语句的原因,即把头文件包含到本程序中来。文件包含到本程序中来。用户自己定义的类型的数据,是不能直用户自己定义的类型的数据,是不能直接用接用“”

32、来输出和输入的。如果来输出和输入的。如果想让它们输出和输入自己声明的类型的数据,想让它们输出和输入自己声明的类型的数据,必须对它们重载。必须对它们重载。对对“”重载的函数形式如下:重载的函数形式如下:45C+语言程序设计istream&operator(istream&,自定义类自定义类&);ostream&operator”的函数的第一个参数和的函数的第一个参数和函数的类型都必须是函数的类型都必须是istream&类型,第二个参类型,第二个参数是要进行输入操作的类。数是要进行输入操作的类。重载运算符重载运算符“”和和“”的函数的函数作为友元函数或普通的函数作为友元函数或普通的函数(一般很少使

33、用一般很少使用),而不能将它们定义为成员函数。而不能将它们定义为成员函数。原因是什么?原因是什么?(第一个参数的类型不是自定义的类类型第一个参数的类型不是自定义的类类型)46C+语言程序设计4.7.1 重载流插入运算符重载流插入运算符“”例例4.7 重载重载“”,然后直接输出复数。,然后直接输出复数。#include class Complex public:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex&c2);friend ostream&operator (o

34、stream&,Complex&);/运算符运算符“”重载为友员函数重载为友员函数 private:double real;double imag;/运算符运算符“+”重载为成员函数重载为成员函数47C+语言程序设计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 mai

35、n()Complex c1(2,4),c2(6,10),c3;c3=c1+c2;coutc3;return 0;48C+语言程序设计说明:编译系统在主程序中的说明:编译系统在主程序中的coutc3;解释为:解释为:operator(cout,c3)即以即以cout和和c3作为实参,调用作为实参,调用operator 函数:函数:ostream&operator (ostream&output,Complex&c)/定义运算符定义运算符“”重载函重载函数数 output(c.real+c.imagi)endl;return output;调用函数时,形参调用函数时,形参output成为成为cou

36、t的引用,的引用,形参形参c成为成为c3的引用。因此,调用函数的过程相当于的引用。因此,调用函数的过程相当于执行:执行:cout(c3.real+c3.imagi)endl;return cout;此行中的此行中的”重载流提取运算符重载流提取运算符“”的目的是将的目的是将“”用于输入自定义类型的对象的信息。用于输入自定义类型的对象的信息。例例4.8 重载重载“”两种运算符。两种运算符。用用“cin”输入复数,输入复数,用用“cout”来输出复数来输出复数50C+语言程序设计#include class Complex public:friend ostream&operator (ostrea

37、m&,Complex&);/声明重载运算符声明重载运算符“(istream&,Complex&);/声明重载运算符声明重载运算符“”函数函数 private:double real;double imag;51C+语言程序设计ostream&operator (ostream&output,Complex&c)/定义重载运算符定义重载运算符“”函数函数 output(=0)output“+”;/虚部为正数时为虚部为正数时为+号号 outputc.imag(istream&input,Complex&c)/定义重载运算符定义重载运算符“”函数函数 coutc.realc.imag;return

38、input;52C+语言程序设计int main()Complex c1,c2;cinc1c2;coutc1=c1endl;coutc2=c2endl;return 0;有了运算符重载,在声明了类之后,我们有了运算符重载,在声明了类之后,我们就可以像使用标准类型一样来使用自己声明就可以像使用标准类型一样来使用自己声明的类了。的类了。53C+语言程序设计4.8 不同类型数据间的转换不同类型数据间的转换 4.8.1 标准类型数据间的转换标准类型数据间的转换1.隐式转换。隐式转换。如:如:int i=6;i=7.5+i;赋值后,赋值后,i的值为的值为132.显式转换显式转换 C+中的形式:中的形式:

39、类型名类型名(数据数据)如:如:int(89.5)C语言中的形式语言中的形式 (类型名类型名)数据数据 如:如:(int)89.5问题:以上是标准类型的转换,那么:问题:以上是标准类型的转换,那么:一个自一个自定义类的对象能否转换成标准类型的数据呢?定义类的对象能否转换成标准类型的数据呢?54C+语言程序设计4.8.2 转换构造函数转换构造函数 转换构造函数转换构造函数的作用的作用是将一个其他类型的数是将一个其他类型的数据转换成一个指定的类的对象。据转换成一个指定的类的对象。回顾构造函数:以回顾构造函数:以Complex类为例类为例(1)默认构造函数。默认构造函数。Complex();/没有参

40、数没有参数(2)用于初始化的构造函数。用于初始化的构造函数。Complex(double r,double I);/两个以上的两个以上的参数参数(3)用于复制对象的拷贝构造函数。用于复制对象的拷贝构造函数。Complex(Complex&c);/形参是本类对象的引形参是本类对象的引用用55C+语言程序设计(4)转换构造函数。转换构造函数。Complex(double r)real=r;imag=0;转换构造函数只有一个参数,其作用转换构造函数只有一个参数,其作用是将是将double型的参数型的参数r转换成转换成Complex类的对象类的对象。以上几种构造函数可以同时出现在一个类以上几种构造函数

41、可以同时出现在一个类中,它们是中,它们是构造函数的重载构造函数的重载。编译系统会。编译系统会根根据建立对象时给出的实参的个数与类型去选据建立对象时给出的实参的个数与类型去选择形参与之匹配的构造函数择形参与之匹配的构造函数。补充例:转换构造函数的使用。补充例:转换构造函数的使用。见见C4-3-3.cpp或或C4-3-4.cpp由由C4-3修改而来。修改而来。56C+语言程序设计#include class Complex public:Complex()real=0;imag=0;/默认构造函数默认构造函数(没有参没有参数数)Complex(double r)real=r;imag=0;/转换构

42、造函数,将实数转换为复数转换构造函数,将实数转换为复数 Complex(double r,double i)real=r;imag=i;/构造函数重载构造函数重载(有两个参数有两个参数)friend Complex operator+(Complex c1,Complex c2);/声明友元的重载运算符声明友元的重载运算符+的函数的函数 void display();/普通成员函数,用于输出数据普通成员函数,用于输出数据 57C+语言程序设计private:double real;double imag;Complex operator+(Complex c1,Complex c2)/定义重载

43、运算符定义重载运算符+的函数的函数 return Complex(c1.real+c2.real,c1.imag+c2.imag);void Complex:display()cout(real,imagi)endl;58C+语言程序设计int main()Complex c1(3,4),c2(5,-10),c3,c4,c5,c6;c3=c1+c2;/运算符运算符+用于复数运算用于复数运算 coutc1=;c1.display();coutc2=;c2.display();coutc3=c1+c2=;c3.display();59C+语言程序设计c3=Complex(1.0)+c3;/通过显式

44、调用通过显式调用Complex(1.0)/将实数将实数1.0转换成复数,然后就可以实现相加了转换成复数,然后就可以实现相加了 c4=1.0+c1;/隐式调用转换构造函数隐式调用转换构造函数Complex(double r)c5=c2+Complex(1.0);c6=2.0+c2;cout1+c3=;c3.display();cout1+c1=;c4.display();coutc2+1=;c5.display();cout2.0+c2=;c6.display();return 0;60C+语言程序设计总结:总结:使用转换构造函数的方法使用转换构造函数的方法。(1)先声明一个类先声明一个类(如上

45、面的如上面的Complex)(2)在这个类中定义一个只有一个参数的构造函在这个类中定义一个只有一个参数的构造函数,参数的类型是需要转换的类型,在函数数,参数的类型是需要转换的类型,在函数体中指定转换的方法。体中指定转换的方法。(3)在该类的作用域内可以用以下形式进行类型在该类的作用域内可以用以下形式进行类型转换:转换:类名类名(指定类型的数据指定类型的数据)就可以将指定类型的数据转换为此类的对象就可以将指定类型的数据转换为此类的对象 与前述基本数据类型:与前述基本数据类型:类型名类型名(数据数据)的转换格式非常类似的转换格式非常类似61C+语言程序设计4.8.3 类型转换函数类型转换函数 用转

46、换构造函数可以将一个指定类型的用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据,如:个类的对象转换为一个其他类型的数据,如:将一个将一个Complex类对象转换成类对象转换成double类型的类型的数据。数据。C+提供类型转换函数来实现上述问题。提供类型转换函数来实现上述问题。类型转换函数的作用类型转换函数的作用是将一个类的对象转换是将一个类的对象转换成另一个类型的数据成另一个类型的数据。先看例题,然后再来看实现格式。先看例题,然后再来看实现格式。例例4.9 类型转换函数的使用。类型转换函数的使用。

47、62C+语言程序设计#include using namespace std;class Complex public:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;operator double()return real;/类型转换函数类型转换函数 private:double real;double imag;63C+语言程序设计int main()Complex c1(3,4),c2(5,-10),c3;double d,e;d=2.5+c1;/要求将一个要求将一个double数据与数据与Complex类数据

48、相加类数据相加 /因为因为d是一个实型数据,故要先将是一个实型数据,故要先将c1转换成实型数据,转换成实型数据,/然后才能相加,再赋值给然后才能相加,再赋值给d coutdendl;e=3-c2;couteendl;return 0;运行结果为:5.5 -264C+语言程序设计类型转换函数的一般形式为:类型转换函数的一般形式为:operator 类型名类型名()实现转换的语句实现转换的语句如:如:operator double()return real;函数返回函数返回double型变量型变量real的值。的值。它有作用是它有作用是将一个将一个Complex类对象转换为一个类对象转换为一个do

49、uble型型数据,数据,其值是其值是Complex类中的数据成员类中的数据成员real的值。其中的的值。其中的函数名是:函数名是:operator double 在函数名前不能指定函数类型,函数没有参在函数名前不能指定函数类型,函数没有参数,数,其返回值是由函数名中指定的其返回值是由函数名中指定的类型名类型名来来确定的。确定的。65C+语言程序设计 类型转换函数只能作为成员函数,因为转类型转换函数只能作为成员函数,因为转换的主体是本类的对象,不能作为友元函数换的主体是本类的对象,不能作为友元函数或普通函数。或普通函数。例例4.10 (1)此例此例只包含只包含“转换构造函数转换构造函数”和和“运

50、运算符重载函数算符重载函数”。(与上面的补充例与上面的补充例C4-3-3.cpp相似相似)见见C4-10-1.CPP66C+语言程序设计#include 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 c1,Complex c2);/重载运算符重载运算符“+”的友元函数的友元函数 void

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁