《C++程序设计简明教程2Eppt第6章运算符重载.ppt》由会员分享,可在线阅读,更多相关《C++程序设计简明教程2Eppt第6章运算符重载.ppt(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6章章 C+运算符的重载运算符的重载v 运算符是一些系统预定义的函数名称v 即用一些特定的符号表示各种运算v 每个运算符对运算数据都有一定要求。例如:“+”运算符只能对int、double等类型进行加法运算。运算符重载是让运算符能够对新定义的数据类型进行运算。1 运算符重载含义运算符重载含义例如:dt是date类对象,语句dt+错误。因为date类是新数据类型,其中没有定义“+”运算符。class date int mo,da,yr;public:date(int m,int d,int y)mo=m;da=d;yr=y;void main()date dt(1,2,99);dt+;/错误
2、语句2C+运算符重载注意事项运算符重载注意事项 (1)一般来说,不改变运算符原有含义,只让它能够对新的数据类型进行计算。例如,重载“+”运算符后,它的功能还是进行加法运算。(2)重载运算符时,不能改变运算符原有的优先级别,也不能改变运算符需要的操作数的数目。(3)有些运算符不能进行重载。如“.”类成员运算符、“*”类指向运算符、“:”类作用域分解运算符、“?:”条件运算运算符。(4)不能人为定义新的运算符,只能使用系统提供的原有运算符。3二元算术运算符重载为类的成员函数二元算术运算符重载为类的成员函数v可以将运算符重载为类的成员函数。可以将运算符重载为类的成员函数。v实现运算符功能的成员函数称
3、成员运算符函数或运算符函数。实现运算符功能的成员函数称成员运算符函数或运算符函数。v在类中定义运算符函数时应注意以下问题:在类中定义运算符函数时应注意以下问题:(1)(1)对于一元运算符函数,用友元函数重载运算符时,需对于一元运算符函数,用友元函数重载运算符时,需要声明一个形式参数。若用成员函数重载运算符时,则不能再要声明一个形式参数。若用成员函数重载运算符时,则不能再声明形式参数,这个形式参数由成员函数的声明形式参数,这个形式参数由成员函数的thisthis指针提供。指针提供。(2)(2)对于二元运算符函数,用友元函数重载运算符时,需对于二元运算符函数,用友元函数重载运算符时,需要声明二个形
4、式参数。若用成员函数重载运算符时,则需要声要声明二个形式参数。若用成员函数重载运算符时,则需要声明一个形式参数,这个形式参数表示运算符的右操作数,左操明一个形式参数,这个形式参数表示运算符的右操作数,左操作数由成员函数的作数由成员函数的thisthis指针提供。指针提供。4程序程序6.1 成员运算符函数举例成员运算符函数举例日期类日期类datedate重载重载“+”运算符,实现日期加上一个天数,得到新日期。运算符,实现日期加上一个天数,得到新日期。static int dys=31,28,31,30,31,30,31,31,30,31,30,31;class date int mo,da,yr
5、;public:date(int m,int d,int y)mo=m;da=d;yr=y;void display()cout mo/da/dysdt.mo-1)day-=dysdt.mo-1;if(+dt.mo=13)dt.mo=1;dt.yr+;dt.da=day;return dt;void main()date olddate(2,20,99);date newdate;newdate=olddate+21;newdate.display();程序输出结果程序输出结果:3/13/995重载为类的友元函数重载为类的友元函数程序程序6.2 6.2 用友元函数重载运算符举例。用友元函数重载
6、运算符举例。static int dys=31,28,31,30,31,30,31,31,30,31,30,31;class date int mo,da,yr;public:date(int m,int d,int y)mo=m;da=d;yr=y;void display()cout mo/da/dysdt.mo-1)day-=dysdt.mo-1;if(+dt.mo=13)dt.mo=1;dt.yr+;dt.da=day;return dt;date operator+(int day,date&dt)dt=dt+day;return dt;void main()date olddate
7、(2,20,99);date newdate;newdate=21+olddate;newdate.display();程序输出结果:程序输出结果:3/13/996关系运算符重载关系运算符重载程序程序 重载关系运算符重载关系运算符“”举例。举例。class dateint mo,da,yr;public:date(int m,int d,int y)mo=m;da=d;yr=y;void display()cout mo/da/yr;friend int operator(date&dt1,date&dt2)return dt1.yrdt2.yr?1:dt1.modt2.mo?1:dt1.da
8、dt2.da?1:0;;void main()date date1(12,7,90),date2(11,22,99);if(date1date2)date1.display();coutis less than;date2.display();程序输出结果:程序输出结果:12/7/90 is less than 11/22/997重载重载=运算符运算符 赋值运算符“=”可以被重载,但不能被继承 类中重载赋值运算符依旧延续赋值运算符原有含义 即将赋值号右边对象的私有数据依次拷贝到赋值号左边对象的私有数据域中。8程序程序6.8 重载重载=运算符举例运算符举例1const max=20;class
9、studentchar*name;int age;float score;public:student(int age1,float score1)age=age1;score=score1;name=new charmax;strcpy(name,name1);student()delete name;void main()student s1(Peter,18,84.5),s2(Mary,17,90.0);s1=s2;9数据类型转换数据类型转换v 程序中,当给出的数据类型与要求的数据类型不一致时,要进行类型转换。v 类型转换有自动转换和强制转换。v 本节介绍基本数据类型与类之间转换。10通
10、过构造函数进行类型转换通过构造函数进行类型转换程序程序6.13 6.13 通过构造函数进行类型转换举例通过构造函数进行类型转换举例class base int x;public:base()x=0;base(int arg)x=arg;void display()coutxendl;void f(base a)a.display();void main()base a;f(10);a.display();程序输出结果:程序输出结果:100程序说明:语句f(10)中参数10是整型数据,因此执行语句f(10)时,首先调用构造函数base(int arg),将整数10强制转换为base类型.语句f(
11、10)与语句f(base(10)等价。11通过类成员函数进行类型转换通过类成员函数进行类型转换程序程序6.14 6.14 实现三种转换实现三种转换一是从一是从base1base1类型到类型到intint 类型转换类型转换二是从二是从base2base2类型到类型到intint 类型转换类型转换三是从三是从base2base2类型到类型到base1base1类型转换类型转换class base1int x;public:base1(int arg=0)x=arg;operator int()return x;class base2int x;public:base2(int arg=0)x=ar
12、g;operator int()return x;operator base1()base1 temp=x;return temp;void main()base1 exam1=5;base2 exam2=10;int number;number=(int)exam1;coutnumberendl;exam1=(base1)exam2;number=(int)exam1;coutnumberendl;程序输出结果:程序输出结果:51012作数据类型转换的运算符函数具有的特点作数据类型转换的运算符函数具有的特点(1)不能是类的友元函数,也不能是静态成员函数。(2)不能指定返回值类型,返回对象的类型就是转换的目标类型。(3)不需要参数。(4)具有*this指针。(5)可以被继承。(6)类对象只能隐式调用强制转换运算符函数一次,不能嵌套隐式调用。13