面向对象程序设计(C++)课件 第5章 运算符重载_第1页
面向对象程序设计(C++)课件 第5章 运算符重载_第2页
面向对象程序设计(C++)课件 第5章 运算符重载_第3页
面向对象程序设计(C++)课件 第5章 运算符重载_第4页
面向对象程序设计(C++)课件 第5章 运算符重载_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大学计算机基础教学系列教材第五章运算符重载2026年5月11日目录运算符重载概述第5.1节重载双目运算符第5.2节重载单目运算符第5.3节010203CONTENTS运算符重载的实现第5.4节特殊运算符的重载第5.5节0405本章小结第5.6节062学习目标

理解运算符重载核心:不改变优先级/结合性,仅重定义类对象操作逻辑。掌握双目运算符(+、-、==等)重载,实现类对象算术、比较运算。掌握单目运算符(++、--、!等)重载,区分前置/后置自增自减差异。熟悉成员/友元/全局函数三种重载方式及适用场景。学会<<、>>、[]、类型转换运算符重载,实现对象输入输出、数组式访问。运算符重载概述013第5.1节4运算符重载概述运算符重载允许程序员为自定义类重新定义运算符(如+、-、*等)的行为,让类对象能像内置数据类型(int、float等)一样直接使用运算符进行操作。//重载operator+,直接返回一个新的Point对象Pointoperator+(constPoint&p)const{

returnPoint(x+p.x,y+p.y);}函数名固定为“operator+运算符”(如operator+);不改变运算符优先级、结合性及操作数数量,仅重定义其对类对象的操作逻辑;编译器会依操作对象类型自动匹配调用对应重载函数。重载双目运算符025第5.2节6重载双目运算符双目运算符是需要两个操作数的运算符。最常见的双目运算符包括加法(+)、减法(-)、乘法(*)、除法(/)等。通过运算符重载为自定义的类实现这些运算符的行为,使得自定义对象可以像内建类型一样进行运算。运算符类别运算符常见用途算术运算符+,-,*,/,%数学计算(加减乘除取模等)关系运算符==,!=,<,>,<=,>=比较两个对象是否相等或大小关系逻辑运算符&&,||

位运算符&^,<<,>>赋值运算符=,+=,-=,*=,/=实现对象赋值或复合运算加法运算符的重载ClassNameoperator+(constClassName&other);重载operator+

来定义加法运算的具体行为,语法格式为:下面为在类A中重载加法运算符+的用法:classA{public:

intnn;A(intn=0):nn(n){}//加法运算符重载

Aoperator+(constA&other){

returnA(this->nn+other.nn);}};7intmain(){Aa(5),b(10);Ac=a+b;//重载加法运算符

cout<<"Sum:"<<c.nn<<endl;

return0;}程序输出如下:Sum:15减法运算符的重载ClassNameoperator-(constClassName&other);重载operator-,可以自定义减法运算符的行为。语法格式为:下面为在类A中重载减法运算符-的用法:classA{public:

intnn;A(intn=0):nn(n){}//加法运算符重载

Aoperator-(constA&other){

returnA(this->nn-other.nn);

}};intmain(){Aa(10),b(5);Ac=a-b;//重载加法运算符

cout<<"Difference:"<<c.nn<<endl;

return0;}程序输出如下:Difference:589赋值运算符的重载ClassName&operator=(constClassName&other);赋值运算符=将一个对象的值赋给另一个对象,语法格式为:下面为通过重载赋值运算符operator=

来实现类的深拷贝逻辑:classA{public:

int*ptr;A(intvalue):ptr(newint(value)){}//构造函数

//赋值运算符重载

A&operator=(constA&other){if(this==&other)//检查是否自赋值

return*this;

deleteptr;//释放当前对象的内存赋值运算符的重载ptr=newint(*(other.ptr));//复制数据

return*this;}~A(){deleteptr;}//析构函数};intmain(){Aa(Aa(10);Ab(20);b=a;//使用赋值运算符

cout<<"Valueinb:"<<*(b.ptr)<<endl;return0;}程序输出如下:Valueinb:1010乘法和除法运算符的重载ClassNameoperator*(constClassName&other);ClassNameoperator/(constClassName&other);乘法和除法运算符语法格式为:下面为在C++中对自定义类A实现乘法(*)和除法(/)运算符的重载:classA{public:

intnn;A(intn=0):nn(n){}Aoperator*(constA&other){//乘法运算符重载

returnA(this->nn*other.nn);//返回两个对象的乘积

}Aoperator/(constA&other){//除法运算符重载

if(other.nn==0){11乘法和除法运算符的重载cerr<<"Error:Divisionbyzero!"<<endl;

returnA();//返回一个默认的A对象

}

returnA(this->nn/other.nn);//返回两个对象的商

}};intmain(){Aa(10),b(2);Ac=a*b;//重载乘法运算符

Ad=a/b;//重载除法运算符

cout<<“Product:”<<c.nn<<endl;//输出:Product:20cout<<“Quotient:”<<d.nn<<endl;//输出:Quotient:5

return0;}12比较运算符的重载booloperator==(constClassName&other);相等运算符语法格式为:不等运算符语法格式为:classA{public:

intnn;A(intn=0):nn(n){}

booloperator==(constA&other){//等于运算符重载

returnthis->nn==other.nn;}13booloperator!=(constClassName&other);下面为在C++中对自定义类A实现了等于和不等于运算符的重载:比较运算符的重载booloperator!=(constA&other){//不等于运算符重载

return!(*this==other);//通过==运算符来实现!=}};intmain(){Aa(5),b(5),c(10);cout<<"a==b:"<<(a==b)<<endl;cout<<"a!=c:"<<(a!=c)<<endl;return0;}14程序输出如下:a==b:1a!=c:1重载单目运算符0315第5.3节16重载双目运算符单目运算符是只需要一个操作数的运算符,常见的包括自增(++)、自减(--)、逻辑非(!)、取反(~)、正负号(+和-)等。运算符用途常见应用+正号维持正值-负号取相反数++自增数值、计数器增量操作--自减数值、计数器减量操作!逻辑非状态检查~按位取反位运算操作前置递增和后置递增递增运算符++是最常见的单目运算符之一,可以重载为前置递增和后置递增。前置递增:前置递增意味着先执行递增操作,然后返回递增后的对象。下面为对自定义类A实现前置递增运算符++的重载:classA{public:

intnn;A(intn=0):nn(n){}

Aoperator++(){//前置递增++nn;//执行递增操作

return*this;

}};intmain(){Aa(5);++a;//前置递增

cout<<"Afterprefixincrement:"<<a.nn<<endl;return0;}程序输出如下:Afterprefixincrement:617前置递增和后置递增后置递增:后置递增意味着先返回当前对象的值,再执行递增操作。下面为在C++中重载后置递增运算符++:classA{public:

intnn;A(intn=0):nn(n){}

Aoperator++(int){//前置递增Atemp=*this;//保存当前对象

nn++;//执行递增操作

returntemp;//返回递增前的对象}};18前置递增和后置递增intmain(){Aa(5);Ab=a++;//后置递增

cout<<"Afterpostfixincrement:"<<a.nn<<endl;cout<<"Valueofb:"<<b.nn<<endl;return0;}19程序输出如下:Afterpostfixincrement:6Valueofb:5前置和后置递减前置递减:前置递减意味着先执行递减操作,然后返回递减后的对象。下面为在C++中重载前置递减运算符--:classA{public:

intnn;A(intn=0):nn(n){}//前置递减

Aoperator--(){--nn;//执行递减操作

return*this;//返回递减后的对象

}};20前置和后置递减intmain(){Aa(5);--a;//前置递减

cout<<"Afterprefixdecrement:"<<a.nn<<endl;//输出:4

return0;}21程序输出如下:Afterprefixdecrement:4前置和后置递减后置递减:后置递减意味着先返回当前对象的值,再执行递减操作。下面为在C++中重载后置递减运算符--:classA{public:

intnn;A(intn=0):nn(n){}

Aoperator--(int){//后置递减Atemp=*this;//保存当前对象

nn--;//执行递减操作

returntemp;//返回递减前的对象

}};22前置和后置递减intmain(){Aa(5);Ab=a--;//后置递减

cout<<"Afterpostfixdecrement:"<<a.nn<<endl;cout<<"Valueofb:"<<b.nn<<endl;return0;}23程序输出如下:Afterpostfixdecrement:4Valueofb:5逻辑非和取反运算符的重载逻辑非运算符通常用于判断对象的布尔值,逻辑非运算符!的重载可以通过重载operator!来定义对象的“否定”操作。classA{public:

intnn;A(intn=0):nn(n){}//逻辑非运算符重载

booloperator!(){returnnn==0;//如果nn为0,则返回true,否则返回false}};24逻辑非和取反运算符的重载intmain(){Aa(0);

if(!a){cout<<"Objectaisfalse"<<endl;//输出:Objectaisfalse}

return0;}25程序输出如下:Objectaisfalse逻辑非和取反运算符的重载按位取反运算符~的重载:按位取反运算符用于对对象的二进制位进行反转。可以通过重载operator~

来定义此行为。classA{public:

intnn;A(intn=0):nn(n){}//按位取反运算符重载

Aoperator~(){

returnA(~nn);//对nn执行按位取反

}};26逻辑非和取反运算符的重载intmain(){Aa(5);//二进制:101Ab=~a;//按位取反:010cout<<"AfterbitwiseNOT:"<<b.nn<<endl;return0;}27程序输出如下:AfterbitwiseNOT:-6正负号运算符的重载正号运算符+和负号运算符-:这两个单目运算符用于表示对象的正值或负值。可以通过重载这两个运算符来定义其行为,通常用于返回类对象的相反值或原值。classA{public:

intnn;A(intn=0):nn(n){}

Aoperator-(){//负号运算符重载

returnA(-nn);//返回负值

}

Aoperator+(){//正号运算符重载

returnA(+nn);//返回原值

}};28正负号运算符的重载intmain(){Aa(5);Ab=-a;//负号操作

cout<<"Negativevalue:"<<b.nn<<endl;//输出:-5

return0;}29程序输出如下:Negativevalue:-5运算符重载的实现0430第5.4节31作为成员函数的运算符重载运算符重载作为成员函数时,左操作数是当前对象,右操作数通过参数传入。对于双目运算符(例如:+、-),成员函数只需要一个参数,表示右操作数。classA{public:

intnn;A(intn=0):nn(n){}//加法运算符重载(成员函数)

Aoperator+(constA&other){

returnA(this->nn+other.nn);}};32作为成员函数的运算符重载intmain(){Aa(5),b(10);Ac=a+b;//通过成员函数重载加法运算符

cout<<"Sum:"<<c.nn<<endl;//输出:15

return0;}程序输出如下:Sum:15作为友元函数的运算符重载运算符重载也可以作为友元函数来实现,尤其是当操作数不是类的成员时。友元函数并不是类的一部分,但它可以访问类的私有成员。通常用于需要访问类的私有成员并且操作数不是当前对象的情况。classA{private:

intnn;public:A(intn=0):nn(n){}

intgetValue()const{returnnn;}//公有访问器

friendAoperator+(constA&lhs,constA&rhs){//友元函数重载加法运算符

returnA(lhs.nn+rhs.nn);}};3334作为友元函数的运算符重载intmain(){Aa(5),b(10);Ac=a+b;//通过友元函数重载加法运算符

cout<<"Sum:"<<c.getValue()<<endl;//使用getter获取nn

return0;}程序输出如下:Sum:15作为全局函数的运算符重载全局函数的优势在于它不需要访问类的成员,并且适用于操作数不是类对象的情况。全局函数的参数通常是两个操作数。classA{public:

intnn;A(intn=0):nn(n){}};//全局函数重载加法运算符Aoperator+(constA&lhs,constA&rhs){

returnA(lhs.nn+rhs.nn);}3536作为全局函数的运算符重载intmain(){Aa(5),b(10);Ac=operator+(a,b);//使用全局函数重载加法运算符

cout<<"Sum:"<<c.nn<<endl;//输出:15

return0;}程序输出如下:Sum:15三种方法的对比成员函数:当运算符的左操作数是当前对象时,通常使用成员函数实现。成员函数允许直接访问类的成员数据。友元函数:当两个操作数都需要操作并且它们不是类的成员时,使用友元函数实现。友元函数可以访问类的私有成员,但它本身并不属于类的一部分。全局函数:当操作数是不同类型的对象时,且不需要访问类的私有成员时,使用全局函数。全局函数通常两个操作数都不是类对象的情况。37特殊运算符的重载0538第5.5节39特殊运算符的重载除了常见的算术运算符(如+、-、*等),特殊运算符通常涉及对象输入输出、类型转换、数组访问等功能。以下是几种常见的特殊运算符重载。运算符常见用途<<和>>流运算符,用于自定义类型的输入输出[]下标运算符,用于数组或容器类的访问类型转换运算符类型转换,用于自定义对象类型转换()函数调用运算符,用于模拟函数对象->指针访问运算符,用于智能指针的实现new和delete动态内存分配和释放输入输出运算符的重载<<

和>>

运算符用于输出和输入数据。通过重载这两个运算符,可以自定义对象的输入输出方式。输入运算符语法格式为:istream&operator>>(istream&in,ClassName&obj);输入运算符>>的重载通常作为友元函数进行重载:classA{private:intx,y;public:A(intx=0,inty=0):x(x),y(y){}friendistream&operator>>(istream&is,A&a){//友元函数重载输入运算符>>is>>a.x>>a.y;returnis;}};4041输入输出运算符的重载intmain(){Aa;cout<<"Entervaluesforxandy:";cin>>a;//使用重载的输入运算符

return0;}程序输出如下:x=5,y=10类型转换运算符的重载类型转换运算符允许我们将一个类的对象隐式或显式地转换为另一种类,语法格式为:operatorTypeName()const;下面是使用类型转换运算符重载将自定义类对象转换为基本数据类型:classA{public:

intx;A(intx=0):x(x){}//类型转换运算符重载

operatorint(){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论