程序设计基础(C++)运算符重载.ppt

上传人:laozhun 文档编号:2974459 上传时间:2023-03-06 格式:PPT 页数:120 大小:1.03MB
返回 下载 相关 举报
程序设计基础(C++)运算符重载.ppt_第1页
第1页 / 共120页
程序设计基础(C++)运算符重载.ppt_第2页
第2页 / 共120页
程序设计基础(C++)运算符重载.ppt_第3页
第3页 / 共120页
程序设计基础(C++)运算符重载.ppt_第4页
第4页 / 共120页
程序设计基础(C++)运算符重载.ppt_第5页
第5页 / 共120页
点击查看更多>>
资源描述

《程序设计基础(C++)运算符重载.ppt》由会员分享,可在线阅读,更多相关《程序设计基础(C++)运算符重载.ppt(120页珍藏版)》请在三一办公上搜索。

1、程序设计基础(C+),运算符重载,学习内容,类之间的关系类的对象成员类的嵌套运算符重载,一个类的对象作为另一个类的数据成员,一个类中的数据成员可以是某一个类的一个对象在C+中,当把一个类的对象作为新类的数据员时,则新类的定义格式可表示为:class X 类名1 成员名1;类名2 成员名2;类名n 成员名n;/其它成员;,一个类的对象作为另一个类的数据成员,构造函数:如果一个类A的对象作为另一个类B的数据成员,则在类B的对象创建过程中,调用其构造函数的过程中,数据成员(类A的对象)会自动调用类A的构造函数。但应注意:如果类A的构造函数为有参函数时,则在程序中必须在类B的构造函数的括号后面加一“:

2、”和被调用的类A的构造函数,且调用类A的构造函数时的实参值必须来自类B的形参表中的形参这种方法称为初始化表的方式调用构造函数。,一个类的对象作为另一个类的数据成员,例子(以上面定义的类X为例):在对类X的对象进行初始化时,必须首先初始化其中的子对象,即必须首先调用这些子对象的构造函数类X的构造函数的定义格式应为:X:X(参数表0):成员1(参数表1),成员2(参数表2),成员n(参数表n)说明:其中,参数表1提供初始化成员1所需的参数,参数表2提供初始化成员2所需的参数,依此类推。并且这几个参数表的中的参数均来自参数表0,另外,初始化X的非对象成员所需的参数,也由参数表0提供。,class D

3、ateprivate:int year;int month;int day;public:Date(int fyear,int fmonth,int fday)cout构造日期endl;year=fyear;month=fmonth;day=fday;void print()coutyear=year month=month day=dayendl;,class Timeprivate:int hour;int minute;int second;public:Time()cout构造时间endl;hour=0;minute=0;second=0;void print()couthour=ho

4、ur minute=minute second=secondendl;,例子1,class Scheduleprivate:Date mdate;Time mtime;int num;public:Schedule(int x,int y,int z,int k):mdate(x,y,z)cout构造时间安排endl;num=k;void print()coutnumber=num endl;mdate.print();mtime.print();,int main()Schedule sche1(2009,9,10,1);sche1.print();Schedule sche2(2010,1

5、0,20,2);sche2.print();return 0;,结果:构造日期构造时间构造时间安排number=1year=2009 month=9 day=10hour=0 minute=0 second=0构造日期构造时间构造时间安排number=2year=2010 month=10 day=20hour=0 minute=0 second=0,例子2,class Dateprivate:int year;int month;int day;public:Date(int fyear,int fmonth,int fday)cout构造日期endl;year=fyear;month=fm

6、onth;day=fday;void print()coutyear=year month=month day=dayendl;,class Timeprivate:int hour;int minute;int second;public:Time(int a,int b,int c)cout构造时间endl;hour=a;minute=b;second=c;void print()couthour=hour minute=minute second=secondendl;,class Scheduleprivate:Date mdate;Time mtime;int num;public:

7、Schedule(int x,int y,int z,int a,int b,int c,int k):mdate(x,y,z),mtime(a,b,c)cout构造时间安排endl;num=k;void print()coutnumber=numendl;mdate.print();mtime.print();,int main()Schedule sche1(2005,9,10,3,10,0,1);sche1.print();Schedule sche2(2004,8,3,4,5,7,2);sche2.print();return 0;,结果:构造日期构造时间构造时间安排number=1y

8、ear=2005 month=9 day=10hour=3 minute=10 second=0 构造日期构造时间构造时间安排number=2year=2004 month=8 day=3hour=4 minute=5 second=7,一个类的对象作为另一个类的数据成员,调用构造函数的顺序:在构造新类的对象过程中,系统首先调用其子对象的构造函数,初始化子对象然后才执行类X自己的构造函数,初始化类中的非对象成员。对于同一类中的不同子对象,系统按照它们在类中的说明顺序调用相应的构造函数进行初始化,而不是按照初始化表的顺序。例子:以下定义了三个Student、Teacher和Tourpair,其中

9、Student类的对象和Teacher类的对象作为了Tourpair的数据成员观察对象的构造过程和构造函数被执行的顺序。,例子,class Studentpublic:Student()coutconstruct student.n;semesHours=100;gpa=3.5;protected:int semesHours;float gpa;,class Teacherpublic:Teacher()coutconstruct Teacher.n;class Tutorpairpublic:Tutorpair()coutconstruct tutorpair.n;protected:St

10、udent student;Teacher teacher;,例子,int main()Tutorpair tp;coutback in main.n;return 0;,运行结果:construct student.construct Teacher.construct tutorpair.back in main.,另外一个例子,class Studentpublic:Student(char*pName=No name)cout构造新同学:pNameendl;strncpy(name,pName,sizeof(name);namesizeof(name)-1=0;Student(Stud

11、ent,另外一个例子,class Tutorpublic:/此为初始化表,调用/Student的拷贝构造函数 Tutor(Student,int main()/此处调用Student的构造函数/Student(char*pName=No name)Student st1;Student st2(zhang);/同上/此处调用Tutor的构造函数Tutor(Student,构造新同学:No name构造新同学:zhang构造copy of zhang构造指导教师析构 copy of zhang析构 zhang析构 No name,类的嵌套,在类中可以定义用户定义的数据类型在类说明中也可以定义类类

12、的嵌套:一个类的说明包含在另一个类的说明中,#include using namespace std;class CC class C1 private:.public:.;public:class C2 private:.public:.;C1 f1(C2);,C1是类CC的私有嵌套类,类CC外的函数中不能使用它类C2是类CC的共有嵌套类,可以在CC类外使用,但类名应该为CC:C2,如在main()中定义:C1 a,b;C2 a,b;CC:C1 a,b CC:C2 a,b,嵌套类的使用并不方便,不宜多用!,运算符重载,C+语言中预定义的运算符的操作对象只能是基本的数据类型但是,在实际应用中,

13、对于很多用户自定义的数据类型(如类)也需要类似的功能需要对已有的运算符赋予多种含义,使同一个运算符作用于不同类型的数据时导致不同类型的行为运算符重载优点允许改变使用系统内部的运算的操作方式,以适应用户新定义类型的类似运算,运算符重载,运算符重载的实质是函数重载C+语言中每个运算符对应着一个运算符函数,在实现过程中把指定的运算表达式中的运算符转化为对运算符函数的调用表达式中的运算对象转化为运算符函数的实参,这个过程是在编译阶段完成的例如:int a=1,b=2;a+b;表达式a+b在编译时,将被解释成为函数调用的形式 operator+(a,b);operator是一个关键字,它与后面的+共同组

14、成了该运算符函数的函数名,运算符重载使得用户自定义的数据以一种更简洁的方式工作,例如int x,y;y=x+y;,matrix m1,m2;/矩阵类对象m1=Madd(m1,m2);/调用函数计算两个矩阵的和,complex c1,c2;/复数类对象c1=Cadd(c1,c2);/调用函数计算两个复数的和,能表示为c1=c1+c2;?,能表示为m1=m1+m2;?,定义运算符重载函数,运算符重载,运算符重载,可以重载的运算符+-*/%&|!=+=-=*=/=%=&=|=&|+-*-()newdeletenewdelete、不能重载的算符.:.*?:sizeof,运算符重载,运算符重载是对已有的

15、运算符赋予多重含义,使同一运算符作用于不同的对象导致不同的行为。运算符重载的实质就是函数重载。运算符的重载与函数重载的方法一致运算符重载的一般格式为:类型名 operator(形参表)说明:operator是关键字,是运算符在C+中几乎所有的运算符(除“.”、“.*”、“:”、“?:”外)都可以被重载运算符的重载既不会改变原运算符的优先级和结合性,也不会改变使用运算符的语法和参数个数不可臆造新的运算符,必须是C+中的已有的可以重载的运算符,运算符重载的两种形式,由于重载后的运算符函数经常需要访问类的私有成员,因此运算符函数operator()通常被声明为类的成员函数或友元函数。类运算符:将运算

16、符重载为类的成员函数,则该运算符称为类运算符。一般性形式如下:返回类型类名:operator运算符(形参表)/*函数体重新定义运算符在指定类中的功能*/当重载为类的成员函数时,运算符重载函数的形参个数要比运算符操作数个数少一个,运算符重载的两种形式,2.友元运算符:将运算重载为类的友元函数,则该运算符称为友元运算符。一般形式如下:friend 返回类型operator运算符(形参表)/*函数体*/若重载为友元函数,则参数个数与操作数个数相同。,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,运算符函数是一种特殊

17、的成员函数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,函数返回类型,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,重载该运算符的类,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,被重载的运算符,关键字,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,函数名,运算符函数是一种特殊的成员函

18、数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,运算符要求的操作数,一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为:类型 类名:operator op(参数表)/相对于该类定义的操作,#include#includeusing namespace std;class Calculator public:Calculat

19、or()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overf

20、low!endl;exit(0);unsigned int Calculator:operator()()return value;,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n

21、Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,重载了3个算符,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void opera

22、tor+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsig

23、ned int Calculator:operator()()return value;,重载了3个算符,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counte

24、r();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,void Calculator:operator+()if(value 65535)value+;else cout nData overflow!endl;exit(0);,#include#includeusing na

25、mespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operato

26、r+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,void Calculator:operator+()if(value 65535)value+;else cout nData overflow!endl;exit(0);,使用系统预定义版本,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operat

27、or+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsign

28、ed int Calculator:operator()()return value;,void Calculator:operator-()if(value 0)value-;else cout n Data overflow!endl;exit(0);,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int

29、main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,void Calculator:operator-()if(value

30、0)value-;else cout n Data overflow!endl;exit(0);,使用系统预定义版本,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=

31、Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,+Counter;,调用重载版本,void operator+();,#include#includeusing namespace std;class Calculator public:Calculator(

32、)value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow

33、!endl;exit(0);unsigned int Calculator:operator()()return value;,调用重载版本,+Counter;,void operator+();,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i

34、;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,调用重载版本,Counter.operator+();,void operator+();,#include#includeusin

35、g namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:ope

36、rator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,-Counter;,调用重载版本,void operator-();,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:un

37、signed int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,调用重载版本,-Counter

38、;,void operator-();,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout

39、n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,调用重载版本,Counter.operator-();,void operator-();,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();vo

40、id operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int C

41、alculator:operator()()return value;,Counter();,调用重载版本,void operator()();,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;c

42、out n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,Counter();,void operator()();,被重载的运算符,#include#includeusing namespace std;class Calculator p

43、ublic:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cou

44、t n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,Counter();,Counter.operator()();,void operator()();,函数参数表,#include#includeusing namespace std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int

45、value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,#include#includeusing name

46、space std;class Calculator public:Calculator()value=0;void operator+();void operator-();unsigned int operator()();private:unsigned int value;int main()Calculator Counter;int i;for(i=0;i 5;i+)+Counter;cout n Counter=Counter();for(i=0;i=5;i+)-Counter;cout n Counter=Counter();,void Calculator:operator+

47、()if(value 0)value-;else cout n Data overflow!endl;exit(0);unsigned int Calculator:operator()()return value;,运算符重载,“=”“()”“”“-”不能重载为友元函数当运算符重载为类的成员函数时,函数参数的个数比原来运算对象数少一个(右+和右除外)当重载为类的友元函数时,参数个数与原运算符的运算数个数相同单目运算符最好重载为类的成员函数,而双目运算符最好重载为类的友元函数,类运算符,对于双目元算符如果要重载为类X的运算符,使之实现表达式oprd1oprd2其中orpd1是类X的对象,则 把

48、重载为类X的成员函数该函数只有一个形参,形参的类型是oprd2所属的类型编译器把表达式oprd1oprd2解释为函数调用:oprd1.operator(oprd2),类运算符,对于前置单目元算符如果要重载为类X的运算符,用来实现表达式oprd,其中orpd是类X的对象,则把重载为类X的成员函数该函数没有形式参数编译器把表达式oprd解释为函数调用oprd.operator(),类运算符的例子,class Sampleprivate:int x;public:Sample()Sample(int a)x=a;void disp()coutx=xendl;Sample operator+(Samp

49、le,Sample Sample:operator+(Sample,int main()Sample obj1(10);Sample obj2(20);Sample obj3;Sample obj4;obj3=obj1+obj2;obj4=obj1+obj2+obj3;obj3.disp();obj4=-obj1;obj4.disp();,运行结果:x=30 x=-10,友元运算符,对于双目元算符如果它的一个操作数为类X的对象,当把它重载为类X的友元运算符时,使之能够实现表达式oprd1oprd2,其中oprd1是类X的对象,则把重载为类X的友元函数;该函数有两个形参,其中一个形参的类型是X类

50、编译器把表达式oprd1oprd2解释为函数调用:operator(oprd1,oprd2),友元运算符,对于前置单目元算符如果要实现表达式oprd,其中oprd是类X的对象,则 可以把重载为类X的友元函数该函数的形式参数为类X的对象oprd编译器把表达式oprd解释为函数调用operator(oprd),友元运算符例子,class Sampleprivate:int x;public:Sample()Sample(int a)x=a;void disp()coutx=xendl;friend Sample operator+(Sample,Sample operator+(Sample,另一

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号