第 11 章 运算符重载_C++课件
11章运算符重载

考虑用普通函数实现两个复数相加
Complex complex_add(Complex &c1, Complex &c2) { Complex c; c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; return c; }
将其声明为Complex 类的友元函数
int operator + (int a, int b) {return (a-b);}
(8)用于类对象的运算符一般必须重载,但有两个例外,运算 符“=”和“&”不必用户重载。 ① 赋值运算符(=)可以用于每一个类对象,可以利用它在 同类对象之间相互赋值(系统已经为每一个新声明的类重载 了一个赋值运算符,他的作用是逐个复制类的数据成员)。 ② 地址运算符&也不必重载,它能返回类对象在内存中 的起始地址。 (9)应当使重载运算符的功能类似于该运算符作用于标准类型 数据时所实现的功能。 (10)运算符重载函数可以是类的成员函数,也可以是类的友 元函数,还可以是既非类的成员函数也不是友元函数的普通 函数。
后自增
在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自 增(自减)运算符函数。
#include <iostream> Complex Complex::operator ++ (int) using namespace std; { //对象复制,保存修改前对象状态 class Complex Complex temp(*this); {public: real++; imag++; //对象自增 Complex( ) return temp; //返回的是自加前的对象 {real=0; imag=0;} } Complex(double r,double i) {real=r; imag=i;} void Complex∷display( ) //重载后自增++函数 cout<<″(″<<real<<″,″<<imag<<″i) Complex operator + { +(int); void display( ); ″<<endl;} private: int main( ) double real; { Complex c1(3,4),c2; double imag; c2=c1++; // c1. operator ++ (0) }; cout<<″c1=″; c1.display( ); cout<<″c2=″; c2.display( ); }
面向对象程序设计-运算符重载PPT课件

real++;
//原对象值+1
imag++;
return temp; //返回原对象的值
}
21
第21页/共29页
int main() {
Complex c1(5,4); cout<<"c1:"; c1.display(); cout<<"++c1:"; (++c1).display(); cout<<"c1:"; c1.display(); cout<<"c1++:"; (c1++).display(); cout<<"c1:"; c1.display(); } 运行结果:c1:(5,4)
实现时间增加1秒钟.
14
第14页/共29页
class Clock //复数类 {public:
Clock(int newH=0,int newM=0,int newS=0) {Hour=newH; Minute=newM; Second=newS;}
void operator ++(); //运算符重载
Complex& operator ++(); Complex operator ++(int); void Display() //显示复数的值 { cout<<“(”<<real<<“,”<<imag<<“)”<<endl; } private: double real; double imag; };
C运算符重载PPT课件

//如果参数
index超出规定的范围,则输出越界信息
{ cout<<"\nError:下标"<<index<<"出界!"<<'\n';
exit(2);
//stdlib.h
}
return arp[index]; //如果不越界,则返回 相应的数据
}
第28页/共35页
void main(void)
{
CArray m1(10),m2(3);
int len;
int *arp;
public:
CArray(int n=0);
~CArray() {if (arp) delete[]arp;}
int & operator[] (int index);
义重载的下标运算符
};
// 定
第26页/共35页
CArray::CArray(int n)
{
if(n>0){
第14页/共35页
3. 复合运算符+= (利用成员函数重载) C C:: operator+=(C m ) { x+=m.x; return *this; }
C a,b; a+=b;
a.operator+=(b)
第15页/共35页
3. 复合运算符+= (利用友元函数重载) 先在类中声明: friend C operator+=(C & ,C); 再在类外定义: C operator+=(C &m1, C m2 ) { m1.x+=m2.x; return m1; }
9.6.2 运算符重载[共11页]
![9.6.2 运算符重载[共11页]](https://img.taocdn.com/s3/m/6d98a6f80066f5335b812112.png)
答案 C
面试例题 34:重载和覆写有什么区别?
考点:重载和覆写之间区别的理解。 出现频率:★★★★ 解析 重载(overriding)是指子类改写父类的方法;覆写(overloading)是指同一个函数的不同 版本之间参数不同。 重载是编写一个与已有函数同名但是参数表不同(参数数量或参数类型不同)的方法,它 具有如下所示的特征。 方法名必须相同。 参数列表必须不相同,与参数列表的顺序无关。 返回值类型可以不相同。 覆写是派生类重写基类的虚函数,它具有如下所示的特征。 只有虚方法和抽象方法才能够被覆写。 具有相同的函数名。 具有相同的参数列表。 具有相同的返回值类型。 重载是一种语法规则,由编译器在编译阶段完成,不属于面向对象的编程;而覆写是由运 行阶段决定的,是面向对象编程的重要特征。
面试例题 35:编程题—MyString 类的编写。
考点:重载=和+运算符。
出现频率:★★★
对于下面的类 MyString,要求重载运算符后可以计算表达式 a=b+c(a、b、c 都是类 MyString
的对象)。请重载相应的运算符并编写程序测试。
1 class MyString
2{
3 public:
218 第 9 章 C++面向对象
在少数情况下重载 new、delete 运算符。 运算符重载需要遵循以下所示的规则; 重载的运算符不能违反语言的语法规则。 如果一个运算符可以放在两个操作数之间,就可以重载它来满足类操作的需要,哪怕
这种用法原本为编译器所不能接受。 不能创造 C++语言中没有的运算符。 重载时不能改变运算符的优先级。
个是“=”运算符,用于对象 a 的赋值。程序代码如下:
运算符重载

1、多态性的基本概念2、派生类对象替换基类对象3、虚函数的定义4、抽象类的定义5、宠物类的设计6、运算符重载7、日期类对象判断大小8、分数类对象运算符重载☐运算符重载指赋予运算符新的操作功能,主要用于对类的对象的操作☐运算符+意味着多少对象类型的加法呢?☐还可以定义新的对象类型加法☐运算符重载定义形式:<类型><类名>::operator<操作符>(<参数表>){函数体}☐首先定义虚数类☐虚数可以描述为:a+bi☐a与b看成实数,定义成double类型☐成员函数除了构造与析构外,还有:☐输出虚数、修改虚数、得到实部a、得到虚部b ☐相加+、判相等==#include <iostream>using namespace std;class Complex{private:double real, imag;public:Complex(double r = 0, double i = 0): real(r), imag(i){ }double Real(){return real;}double Imag(){return imag;}Complex operator +(Complex&);Complex operator +(double);bool operator ==(Complex);~Complex(){ };Complex Complex::operator +(Complex &c)// 重载运算符+,两边是虚数对象{Complex temp;temp.real = real+c.real;temp.imag = imag+c.imag;return temp;}Complex Complex::operator +(double d)// 重载运算符+,左边是虚数对象,右边是双精度数{Complex temp;temp.real = real+d;temp.imag=imag;return temp;}bool Complex::operator ==(Complex c)// 重载运算符=={if (real == c.real && imag == c.imag)return true;elseint main(){Complex c1(3,4),c2(5,6),c3;cout << "C1 = " << c1.Real() << "+j" << c1.Imag() << endl;cout << "C2 = " << c2.Real() << "+j" << c2.Imag() << endl;c3 = c1+c2;cout << "C3 = " << c3.Real() << "+j" << c3.Imag() << endl;c3 = c3+6.5;cout << "C3 + 6.5 = " << c3.Real() << "+j" << c3.Imag() << endl;if ( c1==c2 )cout<<“两个复数相等”;elsecout<<“两个复数不相等”;return 0;☐运算符++分前置运算符和后置运算符☐例如: ++Y与Y++☐前置运算符定义Complex Complex::operator ++ () {real+=1;return *this;}☐后置运算符定义Complex Complex::operator ++ (int) {real+=1;return *this;}。
C++程序设计教程PPT-C++程序运算符重载教学PPT

· 运算符重载地语法· 运算符重载地规则· 运算符重载地方式· 常用运算符重载· 类型转换函数· 仿函数与智能指针在C++中,运算符重载格式是固定写法,使用operator关键字定义运算符重载,重载格式如下。
返回值类型 operator 运算符名称 (参数列表){...//函数体}//例3-1 operator.cppclass A{private:int _x; int _y;public:A(int x=0,int y=0):_x(x),_y(y){}void show() const;A operator+(const A& a) const; A operator- (const A& a) const; }; void A::show() const{cout<<"(_x,_y)="<<"("<<_x<<",“<<_y<<")"<<endl;}A A::operator+(const A& a) const{ return A(_x+a._x,_y+a._y); }A A::operator-(const A& a) const{ return A(_x-a._x,_y-a._y);}int main(){A a1(1,2); A a2(4,5); A a; cout<<"a1: "; a1.show();cout<<"a2: "; a2.show();a=a1+a2;cout<<"a: "; a.show();a=a1-a2;cout<<"a: "; a.show();return 0;}重载运算符并没有改变其原来地功能,只是增加了针注 意对自定义数据类型地运算功能,具有了更广泛地多态特征。
C++语言PPT: 运算符重载
temp.imag = imag + c.imag; int main()
return temp;
{Complex a(1, 2), b(3.0, 4.0), c;
}
c =a+b;
cout << "c = ";
程序运行结果为: c=(4,6)
c.Print(); }
运算符重载的格式
运算符重载为类的成员函数 运算符重载为类的友元函数
这个整型参数没有其他用途,只是用于区分前置运 算与后置运算。 (附加例):定义一个CInt类,类中只有一个数据成 员i,两个运算符“++”的重载函数,一个没有参数, 实现的是前置运算符重载,另一个有一个整型参数, 实现后置运算符重载。
class CInt {private:
int i; public:
பைடு நூலகம்
Complex operator+(Complex &c);
};
该语句相当于调用函数
operator +(Complex &c)
Complex Complex:: operator +(Complex &c) c=a.operator+(b),
{Complex temp;
实现两个复数的加法运算。
temp.real = real + c.real;
CInt(int a=0); void Print(); CInt operator ++(); CInt operator ++(int); };
运算符“=”和“&”不必用户重载。
运算符重载为类的成员函数
C_运算符重载_各类详细介绍
▪ 说明
运算符重载函数 operator@()可以返回任何类型,甚至可 以是 void类型,但通常返回类型与它所操作的类的类型 相同,这样可使重载运算符用在复杂的表达式中。例如, 在例7-2中,可以将几个复数连续进行加、减、乘、除的 运算。
用友元函数重载单目运算符时,需要一个显式的操作数, 例7-3中,用友元函数重载单目运算符“-”
#include<iostream.h> class nclass{ int a,b; public:
nclass(int x=0,int y=0) { a=x;b=y;} friend nclass operator -(nclass obj); void show(); };
▪ complex operator+(complex com1,complex com2) { return complex(com1.real+com2.real,com1.imag+com2.imag;}
▪ 这种方法是直接将一个无名临时对象创建到主调函数中,那么 运行效率高于前一种。
▪ 单目运算符重载
nclass operator-(nclass obj) { obj.a=-obj.a;
obj.b=-obj.b; return obj;} void nclass::show() { cout<<"a="<<a<<" b"<<b;} ▪ main() ▪{ ▪ nclass ob1(10,20),ob2; ▪ ob1.show(); ▪ ob2=-ob1; ▪ ob2.show(); ▪ return 0; ▪}
第11章77 运算符重载
bool operator<=(const Rational &r1) const;
bool operator>=(const Rational &r1) const;
bool operator!=(const Rational &r1) const;
void display() { cout << num << '/' << den; }
5
不能重载的运算符
. .* :: ?: sizeof
第11章77 运算符重载
6
第11章 运算符重载
什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例
第11章77 运算符重载
7
运算符重载的方法
运算符重载就是写一个函数解释某个运算符在 某个类中的含义
运算符的重载不能改变运算符的运算对象数。因此,重载函 数的形式参数个数(包括成员函数的隐式指针this)与运算 符的运算对象数相同
运算符重载可以重载成成员函数也可以重载成全局函数实现。 重载成全局函数时,最好把此函数设为友员函数
如果作为类的成员函数,它的形式参数个数比运算符的运算 对象数少1。这是因为成员函数有一个隐含的参数this。在 C++中,把隐含参数this作为运算符的第一个参数。
第11章77 运算符重载
4
可以重载的运算符
+ - * / % ^ &| ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete new[] delete[]
清华大学Overload_Operator-C++运算符重载课件
运算符重载运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。
也就是说,运算符重载是通过定义函数实现的。
1 运算符重载为成员函数 AX++运算符重载实质上是函数的重载,重载运算符的函数一般格式如下:函数类型 operator运算符名称(形参表列){对运算符的重载处理}例如,想将“+”用于Complex(复数)的加法运算,函数的原型可以是这样的:Complex operator + (Complex & c1,Complex &c2);其中,operator是关键字,是专门用于定义重载运算符的函数的,运算符名称就是C++提供给用户的预定运算符。
注意:函数名是由operator和运算符组成。
上面的operator+就是函数名,意思是“对运算符+重载“。
只要掌握这点,这可以发现,这类函数和其他函数在形式上没有什么区别。
两个形参是Complex类对象的引用,要求实参为Complex类对象。
在定义了重载运算符后,可以说:函数operator+重载了运算符+。
在执行复数相加的表达式c1+c2时(假设c1+c2都已被定义为Complex),系统就会调用operator+函数,把c1+c2作为实参,与形参进行虚实结合。
为了说明把运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想象称为调用下面的函数:代码如下:int operator + (int a, int b) { return (a+b); }如果有表达式5+8,就调用此函数,将5和8作为调用函数时的形参,函数的返回值为13,这就是通过函数的方法理解运算符。
例1:运算符重载实现两个坐标点的加运算class Point {int x, y;public:Point() {}Point (int I, int j) { x=i; y=j;}v oid disp() {cout << “(“ << x <<”,”<<y<<”)”<<endl;}Point operator+ (Point &p) {return Point(x+p.x, y+p.y);}};void main() {Point p1(3,4), p2(2,9), p3;p3=p1+p2;p3.disp();}例2:运算符重载实现复数的加、减、乘、除和赋值运算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
×
× ×
√?
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计 11.1 运算符重载 规则和限制
第十一章 运算符重载
可以重载C++中除下列运算符外的所有运算符: 中除下列运算符外的所有运算符: 可以重载 中除下列运算符外的所有运算符 类属关系运算符:“.” 类属关系运算符: 成员指针运算符: 成员指针运算符:“.*” 作用域分辨符: 作用域分辨符:“::” sizeof运算符:sizeof 运算符: 运算符 三目运算符: 三目运算符:“? :” 只能重载C++语言中已有的运算符,不可臆造新的。 语言中已有的运算符, 只能重载 语言中已有的运算符 不可臆造新的。 不能改变原运算符的优先级和结合性。 不能改变原运算符的优先级和结合性。 不能改变操作数个数。 不能改变操作数个数。 经重载的运算符,至少应有一个自定义类型操作数。 经重载的运算符,至少应有一个自定义类型操作数。
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计
第十一章 运算符重载
11.1 运算符重载 11.1.1 重载二元运算符为类运算符(运算符重载为成员函数) 重载二元运算符为类运算符 运算符重载为成员函数) 运算符为类运算符( 若某运算符重载函数被定义为类的成员, 若某运算符重载函数被定义为类的成员,则称该运算符为 该类的运算符,简称类运算符 类运算符。 该类的运算符,简称类运算符。 声明形式: 函数类型 operator 运算符(形参表) 声明形式: 运算符(形参表) { } 函数体 注意: 注意: 参数个数=原操作数个数 。第一操作数为当前对象。 参数个数 原操作数个数 -1。第一操作数为当前对象。 类对象, 若有表达式 oprd1 B oprd2,其中 oprd1 为 A 类对象,则 B , 类的成员函数, 应被重载为 A 类的成员函数,形参类型应该是 oprd2 所属的 类型。 类型。 经重载后, oprd1 B oprd2 经重载后,表达式 oprd1.operator B(oprd2) 相当于
C/C++语言程序设: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计
第十一章 运算符重载
教
学
内
容
运算符重载 特殊运算符的重载 字符串类
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计
第十一章 运算符重载
运算符重载
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计 11.1 运算符重载
第十一章 运算符重载
函数重载: 函数重载:指一组功能类似但函数参数 类型、个数)不同的函数可以共用一个函数名。 (类型、个数)不同的函数可以共用一个函数名。 对同一个函数名赋予多重含义, 即:对同一个函数名赋予多重含义,使其作用于不同类 型或不同个数的参数时导致不同的行为。 型或不同个数的参数时导致不同的行为。 运算符重载: 对已有的运算符赋予多重含义, 运算符重载:指对已有的运算符赋予多重含义,使同一个运算 符作用于不同类型的数据时导致不同的行为。 符作用于不同类型的数据时导致不同的行为。 例:4 + 5 3.2 + 0.6 //用于 int 类型数据 用于 //用于 float 类型数据 用于
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计 11.1 运算符重载
第十一章 运算符重载
11.1.2 重载一元运算符为类运算符(运算符重载为成员函数) 重载一元运算符为类运算符 运算符重载为成员函数) 运算符为类运算符( --: 后置单目运算符 ++ 和 --: 为类成员函数, 若要重载 ++ 或 -- 为类成员函数,实现表达式 oprd ++ --, 类对象, 或 oprd --,其中 oprd 为 A 类对象,则 ++ 或 -- 应被重载为 A 类的成员函数,且具有一个 int 类型形参。 类的成员函数, 类型形参 形参。 经重载后, 经重载后,表达式 相当于 oprd ++ oprd.operator ++(0)
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计
第十一章 运算符重载
11.1 运算符重载 11.1.1 重载二元运算符为类运算符(运算符重载为成员函数) 重载二元运算符为类运算符 运算符重载为成员函数) 运算符为类运算符( void main() { complex c1(25, 50), c2, c3(100, 200), c4(200, 400), c; 25 +50i c1.show(); c2=c1; 25 +50i c2.show(); c=c1+c3; c.show(); 125 +250i c+=c1; c.show(); 150 +300i c4+=c1+c2; c4.show(); 250 +500i c4=c4+200; c4.show(); 450 +500i }
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计
第十一章 运算符重载
complex complex::operator+(complex& c) 11.1 运算符重载 { complex t; t.real=real+c.real; 11.1.1 重载二元运算符为类运算符(运算符重载为成员函数) 重载二元运算符为类运算符 运算符重载为成员函数) 运算符为类运算符( t.image=image+c.image; return t; } 运算符实现复数的加法运算。 例11.1:定义复数类,重载“+”运算符实现复数的加法运算。 :定义复数类,重载“ 运算符实现复数的加法运算 #include<iostream> complex complex::operator+(float s)
回顾
中已经被重载, 只能用于基本类型数据。 + 在 C/C++ 中已经被重载,但只能用于基本类型数据。
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计 第十一章 运算符重载 11.1 运算符重载 complex complex::add(complex c) complex::operator+(complex c) 运算符重载通 {问题:类的对象如何进行加法运算? } return complex(c.real+real, c.image+image); 问题:类的对象如何进行加法运算? 过定义运算符 重载函数实现 例:复数的加法 void main( )
制作: 制作:山东经济学院计算机科学与技术学院 徐振中
C/C++语言程序设计 语言程序设计 第十一章 运算符重载 重载为成员函数。 例:将单目运算符前置 ++ 重载为成员函数。
#include<iostream> using namespace std; class Clock //时钟类声明 时钟类声明 { int hour, minute, second; public: Clock(int H=0, int M=0, int S=0); void ShowTime( ); void operator ++( ); }; void Clock::operator ++( ) { second++; if (second>=60) { second=second-60; minute ++; if (minute>=60) { minute=minute-60; hour ++; hour=hour%24; } } cout<<"++ Clock:"; : } //其它成员函数的实现略 其它成员函数的实现略 void main( ) { Clock myClock(23, 59, 59); cout<<"First time output: "; myClock.ShowTime( ); ++myClock; myClock.ShowTime( ); } 运行结果: 运行结果: First time output: 23:59:59 ++ Clock: 0:0:0
class complex 运算符重载函数 { complex c1(5,4), c2(2,10), c3; { 为类的成员函数 c3=c1+c2; 亦可为友元函数 float real; c3.real=c1.real+c2.real; float image; 或普通函数 c3.image=c1.image+c2.image; public: c3=c1.operator+(c2); c3=c1.add(c2); 不直观 c3=c1+c2; complex(float r=0.0, float i=0.0) (7,14) c3.display( ); { real=r; image=i; } } operator +(complex); complex add(complex); add(complex); void display( ); 问题:c3=c1+c2 问题:将指定的运算表达式 }; 方法:成员函数使用特殊 方法:转化为运算符函数的 调用, 调用,运算对象转化 void complex::display( ) 的名字 operator+。 。 为运算符函数的实参 {cout<<"("<<real<<","<<image<<")"<<endl;}