几个典型运算符重载C++四.ppt
2023/10/27,1,7.3 几个典型运算符重载,2023/10/27,2,7.3 几个典型运算符重载,数学类中常用的几个运算重载的特点和应用,6.3 几个典型运算符重载,2023/10/27,3,7.3.1 重载+与-,设A Aobject;运算符+和-有两种方式:前置方式:+Aobject-Aobject,后置方式:Aobject+Aobject-,成员函数 重载A:A operator+();解释为:Aobject.operator+();友员函数 重载friend A operator+(A,成员函数 重载A:A operator+(int);解释为:Aobject.operator+(0);友员函数 重载:friend A operator+(A 解释为:operator+(Aobject,0),伪参数,6.3.1 重载+与-,2023/10/27,4,成员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;Increase operator+();/前置 Increase operator+(int);/后置 private:unsigned value;Increase Increase:operator+()value+;return*this;Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;void main()Increase a,b,n;for(int i=0;i 10;i+)a=n+;cout n=;n.display();cout a=;a.display();for(i=0;i 10;i+)b=+n;cout n=;n.display();cout b=;b.display();,6.3.1 重载+与-,2023/10/27,5,成员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;Increase operator+();/前置 Increase operator+(int);/后置 private:unsigned value;Increase Increase:operator+()value+;return*this;Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;void main()Increase a,b,n;for(int i=0;i 10;i+)a=n+;cout n=;n.display();cout a=;a.display();for(i=0;i 10;i+)b=+n;cout n=;n.display();cout b=;b.display();,Increase operator+();,Increase Increase:operator+()value+;return*this;,+n;,预定义版本,6.3.1 重载+与-,2023/10/27,6,成员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;Increase operator+();/前置 Increase operator+(int);/后置 private:unsigned value;Increase Increase:operator+()value+;return*this;Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;void main()Increase a,b,n;for(int i=0;i 10;i+)a=n+;cout n=;n.display();cout a=;a.display();for(i=0;i 10;i+)b=+n;cout n=;n.display();cout b=;b.display();,Increase operator+();,Increase Increase:operator+()value+;return*this;,+n;,重载版本,6.3.1 重载+与-,2023/10/27,7,成员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;Increase operator+();/前置 Increase operator+(int);/后置 private:unsigned value;Increase Increase:operator+()value+;return*this;Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;void main()Increase a,b,n;for(int i=0;i 10;i+)a=n+;cout n=;n.display();cout a=;a.display();for(i=0;i 10;i+)b=+n;cout n=;n.display();cout b=;b.display();,Increase operator+(int);,Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;,n+;,预定义版本,6.3.1 重载+与-,2023/10/27,8,成员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;Increase operator+();/前置 Increase operator+(int);/后置 private:unsigned value;Increase Increase:operator+()value+;return*this;Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;void main()Increase a,b,n;for(int i=0;i 10;i+)a=n+;cout n=;n.display();cout a=;a.display();for(i=0;i 10;i+)b=+n;cout n=;n.display();cout b=;b.display();,Increase operator+(int);,Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;,n+;,重载版本,6.3.1 重载+与-,2023/10/27,9,成员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;Increase operator+();/前置 Increase operator+(int);/后置 private:unsigned value;Increase Increase:operator+()value+;return*this;Increase Increase:operator+(int)Increase temp;temp.value=value+;return temp;void main()Increase a,b,n;for(int i=0;i 10;i+)a=n+;cout n=;n.display();cout a=;a.display();for(i=0;i 10;i+)b=+n;cout n=;n.display();cout b=;b.display();,6.3.1 重载+与-,2023/10/27,10,友员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;friend Increase operator+(Increase,6.3.1 重载+与-,2023/10/27,11,友员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;friend Increase operator+(Increase,friend Increase operator+(Increase,Increase operator+(Increase,+n;,通过引用参数操作对象,6.3.1 重载+与-,2023/10/27,12,友员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;friend Increase operator+(Increase,friend Increase operator+(Increase,Increase operator+(Increase,n+;,复制构造局部对象,6.3.1 重载+与-,2023/10/27,13,友员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;friend Increase operator+(Increase,friend Increase operator+(Increase,Increase operator+(Increase,n+;,伪参数,6.3.1 重载+与-,2023/10/27,14,友员函数重载+,#includeclass Increase public:Increase()value=0;void display()const coutvaluen;friend Increase operator+(Increase,6.3.1 重载+与-,2023/10/27,15,7.3.2 重载赋值运算符,赋值运算符重载用于对象数据的复制 operator=必须重载为成员函数 重载函数原型为:类型,6.3.2 重载赋值运算符,2023/10/27,16,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,6.3.2 重载赋值运算符,2023/10/27,17,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,初始化对象时调用复制构造函数,6.3.2 重载赋值运算符,2023/10/27,18,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,修改对象时调用重载赋值运算符函数,6.3.2 重载赋值运算符,2023/10/27,19,定义Name类的重载赋值函数,Name:Name(char*pN)cout Constructing pN endl;pName=new char strlen(pN)+1;if(pName!=0)strcpy(pName,pN);size=strlen(pN);Name:Name(const Name,Name,6.3.2 重载赋值运算符,2023/10/27,20,Name:Name(char*pN)cout Constructing pN endl;pName=new char strlen(pN)+1;if(pName!=0)strcpy(pName,pN);size=strlen(pN);Name:Name(const Name,定义Name类的重载赋值函数,Name,6.3.2 重载赋值运算符,2023/10/27,21,Name:Name(char*pN)cout Constructing pN endl;pName=new char strlen(pN)+1;if(pName!=0)strcpy(pName,pN);size=strlen(pN);Name:Name(const Name,定义Name类的重载赋值函数,Name,6.3.2 重载赋值运算符,2023/10/27,22,Name:Name(char*pN)cout Constructing pN endl;pName=new char strlen(pN)+1;if(pName!=0)strcpy(pName,pN);size=strlen(pN);Name:Name(const Name,定义Name类的重载赋值函数,Name,LiHai,6.3.2 重载赋值运算符,2023/10/27,23,Name:Name(char*pN)cout Constructing pN endl;pName=new char strlen(pN)+1;if(pName!=0)strcpy(pName,pN);size=strlen(pN);Name:Name(const Name,定义Name类的重载赋值函数,Name,LiHai,6,6.3.2 重载赋值运算符,2023/10/27,24,Name:Name(char*pN)cout Constructing pN endl;pName=new char strlen(pN)+1;if(pName!=0)strcpy(pName,pN);size=strlen(pN);Name:Name(const Name,定义Name类的重载赋值函数,Name,LiHai,6.3.2 重载赋值运算符,2023/10/27,25,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,6.3.2 重载赋值运算符,2023/10/27,26,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,6.3.2 重载赋值运算符,2023/10/27,27,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,6.3.2 重载赋值运算符,2023/10/27,28,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,6.3.2 重载赋值运算符,2023/10/27,29,#include#includeclass Name public:Name(char*pN);Name(const Name/调用重载赋值算符函数,定义Name类的重载赋值函数,6.3.2 重载赋值运算符,2023/10/27,30,7.3.3 重载运算符和(),运算符 和()是二元运算符 和()只能用成员函数重载,不能用友元函数重载,6.3.3 重载运算符和(),2023/10/27,31,1重载下标算符,重载格式类:类型 operator(类型);,运算符用于访问数据对象的元素,6.3.3 重载运算符和(),2023/10/27,32,1重载下标算符,重载格式类:类型 operator(类型);,运算符用于访问数据对象的元素,定义重载函数的类名,6.3.3 重载运算符和(),2023/10/27,33,1重载下标算符,重载格式类:类型 operator 类型;,运算符用于访问数据对象的元素,函数返回类型,6.3.3 重载运算符和(),2023/10/27,34,1重载下标算符,重载格式类:类型 operator(类型);,运算符用于访问数据对象的元素,函数名,6.3.3 重载运算符和(),2023/10/27,35,1重载下标算符,重载格式类:类型 operator(类型);,运算符用于访问数据对象的元素,右操作数为符合原语义,用 int,6.3.3 重载运算符和(),2023/10/27,36,1重载下标算符,重载格式类:类型 operator()类型;,运算符用于访问数据对象的元素,例 设 x 是类 X 的一个对象,则表达式x y 可被解释为x.operator(y),显式声明一个参数,6.3.3 重载运算符和(),2023/10/27,37,2重载函数调用符(),/用重载()算符实现数学函数的抽象#include class F public:double operator()(double x,double y);double F:operator()(double x,double y)return x*x+y*y;void main()F f;cout f(5.2,2.5)endl;,6.3.3 重载运算符和(),2023/10/27,38,2重载函数调用符(),/用重载()算符实现数学函数的抽象#include class F public:double operator()(double x,double y);double F:operator()(double x,double y)return x*x+y*y;void main()F f;cout f(5.2,2.5)endl;,f.operator()(5.2,2.5),6.3.3 重载运算符和(),2023/10/27,39,2重载函数调用符(),/用重载()算符实现数学函数的抽象#include class F public:double operator()(double x,double y);double F:operator()(double x,double y)return x*x+y*y;void main()F f;cout f(5.2,2.5)endl;,memFun,memFun,f.memFun(5.2,2.5),比较定义普通成员函数,6.3.3 重载运算符和(),2023/10/27,40,istream 和 ostream 是 C+的预定义流类cin 是 istream 的对象,cout 是 ostream 的对象运算符 由 istream 重载为提取操作,用于输入基本类型数据程序员重载,用于输出和输入用户自定义的数据类型,7.3.4 重载流插入和流提取运算符,6.3.4 重载流插入和流提取运算符,2023/10/27,41,#include#includeclass vector public:vector(int size=1);vector();int,为vector类重载流插入运算符和提取运算符,6.3.4 重载流插入和流提取运算符,2023/10/27,42,#include#includeclass vector public:vector(int size=1);vector();int,为vector类重载流插入运算符和提取运算符,重载几个运算符,6.3.4 重载流插入和流提取运算符,2023/10/27,43,#include#includeclass vector public:vector(int size=1);vector();int,为vector类重载流插入运算符和提取运算符,标准流类,6.3.4 重载流插入和流提取运算符,2023/10/27,44,#include#includeclass vector public:vector(int size=1);vector();int,为vector类重载流插入运算符和提取运算符,使用预定义版本,6.3.4 重载流插入和流提取运算符,2023/10/27,45,#include#includeclass vector public:vector(int size=1);vector();int,为vector类重载流插入运算符和提取运算符,使用重载版本cin.operator(A),6.3.4 重载流插入和流提取运算符,2023/10/27,46,#include#includeclass vector public:vector(int size=1);vector();int,为vector类重载流插入运算符和提取运算符,使用重载版本cout.operator(A),6.3.4 重载流插入和流提取运算符,2023/10/27,47,vector:vector(int size)if(size 100)cout=0,为vector类重载流插入运算符和提取运算符,6.3.4 重载流插入和流提取运算符,2023/10/27,48,vector:vector(int size)if(size 100)cout=0,为vector类重载流插入运算符和提取运算符,使用重载版本访问对象元素,6.3.4 重载流插入和流提取运算符,2023/10/27,49,vector:vector(int size)if(size 100)cout=0,为vector类重载流插入运算符和提取运算符,cout 的别名,6.3.4 重载流插入和流提取运算符,2023/10/27,50,vector:vector(int size)if(size 100)cout=0,为vector类重载流插入运算符和提取运算符,cin 的别名,6.3.4 重载流插入和流提取运算符,2023/10/27,51,vector:vector(int size)if(size 100)cout=0,为vector类重载流插入运算符和提取运算符,返回流类引用以符合原语义,6.3.4 重载流插入和流提取运算符,2023/10/27,52,vector:vector(int size)if(size 100)cout=0,为vector类重载流插入运算符和提取运算符,6.3.4 重载流插入和流提取运算符,2023/10/27,53,运算符重载可以像基本数据类型一样,用简洁明确的运算符操作自定义的类对象。重载运算符函数可以对运算符作出新的解释,但重原有的基本语义不变。运算符函数既可以重载为成员函数,也可以重载义为友员函数或普通函数。当一元运算符的操作数,或者二元运算符的左操作数是该类的一个对象时,以成员函数重载;当一个运算符的操作需要修改类对象状态时,应该以成员函数重载。如果以成友员函数重载,可以使用引用参数修改对象。当运算符的操作数(尤其是第一个操作数)希望有隐式转换,则重载算符时必须用友员函数。构造函数和类型转换函数可以实现基本类型与类类型,以及类类型之间的类型转换。,小结,2023/10/27,54,7.4 类类型转换 此节不介绍按统一规定进行。有时间可以进行实验讲述。,2023/10/27,55,作业:,7.1 选择题 P282 57.2 阅读程序,写出结果 P283 27.3 思考题 P284 17.4 编程题 P284 4,