第13章 运算符重载
c++运算符重载
Visual C++程序设计
第13章
运算符重载
c++运算符重载
第13章 运算符重载
13.1 运算符重载 13.2 几个特殊运算符的重载 13.3 字符串类
c++运算符重载
13.1 运算符重载13.1.1 运算符重载的概念 通常情况下,对象除了赋值外,不能进行其他运算。例13-1 对象的运算。 class A{ int a,b; public: A(int x=0,int y=0) { a=x ;b=y;} A plus ( A t) { A t1; t1.a=a+t.a; t1.b=b+t.b; return t1; } void show(){ cout<<a<<'\t'<<b<<'\n'; } }; void main( ) { A a1(1,2),a2(3,4),a3; a3=a1.plus(a2); //A a3.show() ; } 运行结果: 4
6
能否把A行改为:a3=a1+a2;
c++运算符重载
13.1 运算符重载 运算符的重载就是定义一个函数,实现运算符的功能。该
函数(运算符重载函数)以重载运算符的关键字operator 和要重载的运算符为函数名,在函数体中通过对象数据成 员的运算实现类体外对象的运算。 由于要在类体外调用重载函数,并使用私有数据成员,所
以重载函数应该为类的公有成员函数或友元函数。 重载后的运算符操作规则(函数重载):如果操作数是基
本类型数据,仍执行原来的运算;如果操作数是一个对象, 则根据所定义的规则进行新的运算。 定义了运算符重载函数之后,就可以像操作普通类型的数
据一样操作对象——对象表达式。
c++运算符重载
13.1 运算符重载13.1.2 运算符重载的方法1. 通过成员函数重载(成员重载)
类中定义的格式 函数类型 operator 运算符(形参列表) { ... } //运算数据成员 类中定义的格式 friend 函数类型 operator 运算符(形参列表) { ... } //运算数据成员 成员重载和友元重载都可以在类中说明,类外定义,其 方法与其他成员函数、友元函数相似。
2. 通过友元函数重载(友元重载)
c++运算符重载
13.1 运算符重载例13-2 分别用成员函数和友元函数重载+、-,实现复数对 象的运算。 class Complex{ float real,image; public: Complex(float r=0,float i=0){ real=r; image=i; } Complex operator+(Complex &c) { Complex t; t.real=real+c.real; t.image=image+c.image; return t; } friend Complex operator-(Complex c1, Complex c2) { Complex t; t.real=c1.real-c2.real; t.image=c1.image-c2.image; return t; } void show(){ cout<<real<< \t <<image<< \n ; } }; void main() {Complex c1(5,10),c2(20,30),c3; c3=c2+c1; c3.show(); c3=c2-c1; c3.show(); }
c++运算符重载
13.1 运算符重载(1) 成员函数重载和友元函数重载的异同: 定义方法、格式不同; 参数个数不同,友元重载通常比成员重载多一个对象参数; 函数体中使用数据成员的方法不同; 对象表达式使用形式相同,但含义不同。 (2) 对象表达式的含义: 成员函数重载:第一个对象为当前对象,其他为参数,即a+b 等同于a.operator+(b); 友元函数重载:直接调用,对象都是参数,即a+b等同于 operator+(a,b)。 (3) 函数类型:
通常是对象或对象的引用,复合赋值运算符可以为void。 (4) 函数参数: 成员函数重载:参数通常比操作数少1个; 友元函数重载:参数通常等于操作数个数; 若要带回结果,应为引用。
c++运算符重载
13.1 运算符重载3. 运算符重载时注意 (1)大多数运算符都可以重载,但以下运算符不可以重载: 成员运算符“ ”; 指针取值运算符“*” ; 作用域运算符“::” ; 三目运算符“?:”; 求字节数运算符“sizeof()” 。 (2)大多数运算符既可以成员重载,也可以友元重载,但: “=”、“[ ]”、“()”和“->”只能成员重载; “<<”和“>>”只能友元重载。 (3)可以扩充运算符的应用范围、改变操作规则,但不能改 变基本性质(优先级、目数和结合性)。 (4)只能重载已有运算符,不能创造运算符。
c++运算符重载
13.2 几个特殊运算符的重载13.2.1 自增和自减运算符 ++、--是一元运算符,其重载与二元运算符没有本质的区 别,不同之处主要体现在两个方面: (1)运算符的操作数不同,即重载函数的参数个数不同。
成员重载:操作对象只涉及调用对象本身,可通过this指 针传入,重载函数无参; 友元重载:通过一个引用类型的对象参数传递操作对象。
(2)有前置、后置之分,通过重载函数的重载实现 。
前置:缺省为前置;后置:增加一个无名称的形参“int” 。
c++运算符重载
13.2 几个特殊运算符的重载例13-3 一元运算符的重载(++、--前置与后置)。class A{ int m,n; public: A(int x=0,int y=0) { m=x; n=y; } A operator++( ) //成员重载前置++ { ++m; ++n; return *this; } A operator++(int); friend A operator--(A &t) { --t.m; --t.n; return t; } //成员重载后置++ //友元重载前置--
friend A operator--(A&t,int); //友元重载后置--
void print( ){ cout<<"m="<<m<<"\tn="<<n<<'\n'; }}; A A::operator++(int) { A t=*this; ++(*this); return t; }
A operator--(A &t,int) { A temp=t; --t.m; --t.n; return temp; }
c++运算符重载
13.2 几个特殊运算符的重载void main( ) { A a1(1,2),a2(10,20),a3,a4; a3=++a1; //A a4=a2++; //B cout<<"a1:\t";a1.print( ); cout<<"a3:\t";a3.print( ); cout<<"a2:\t";a2.print( ); cout<<"a4:\t";a4.print( ); a3=--a1; //C a4=a2--; //D cout<<"a1:\t";a1.print( ); cout<<"a3:\t";a3.print( ); cout<<"a2:\t";a2.print( ); cout<<"a4:\t";a4.print( ); }
运行结果: a1: m=2 a3: m=2 a2: m=11 a4: m=10 a1: m=1 a3: m=1 a2: m=10 a4: m=11
n=3 n=3 n=21 n=20 n=2 n=2 n=20 n=21
c++运算符重载
13.2 几个特殊运算符的重载13.2.2 赋值运算符 C++系统预先重载了赋值运算符,以实现对象数据成员 之间的简单赋值,通常可以直接使用。但当数据成员使 用了动态内存时,可能会导致内存空间混乱。此时应重 载赋值运算符。 a1.s abc 如: class A{char*s;…}; void main() { A a1(“abc”); a1.s A a2(“12345”);
a1=a2; a2.s } a1.s=a2.s a2.sabc 12345 12345
12345
×
1 释放原有空间 2 重新分配空间 3 strcpy(a1.s,a2.s)
c++运算符重载
13.2 几个特殊运算符的重载例13-4 赋值运算符的重载。 class A{ char *s; public: A(){ s=0;} A(char *); (1)能否把A行改为: void print() { cout<<s<< \n ; } s=t.s; A &operator=(A &t); (2)为什么重载函数的类型及 ~A(){if(s) delete [ ]s;} 参数都是对象的引用? }; A::A(char *str){ s=new char[strlen(str)+1]; strcpy(s , str) ;} A& A::operator=(A&t) { if(s) delete [ ]s; // 释放s的原有空间 if(t.s) { s=new char[strlen(t.s)+1]; //给s分配新空间 strcp …… 此处隐藏:3601字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [政务民生]2013年公共基础知识热点问题(七)
- [政务民生]检验检测机构资质认定评审准则及释义20
- [政务民生]关于印发重庆市房屋建筑和市政基础设施
- [政务民生]1、隧道洞身开挖支护施工技术交底书
- [政务民生]2015年山东省17地市中考语文试题分类汇
- [政务民生]2-高级会计师资格考试和评审流程图
- [政务民生]2018版中国清分机行业发展分析及前景策
- [政务民生]新课改高中政治探究
- [政务民生]2018-2024年中国新型组合房屋行业投资
- [政务民生]2015年上海市春季高考数学模拟试卷五
- [政务民生]灌砂法及环刀法测压实度(带计算过程)
- [政务民生]运筹学实验2求解非线性规划
- [政务民生]劝学、逍遥游默写(教师卷)
- [政务民生]《运筹学》 - 期末考试 - 试卷A - 答案
- [政务民生]八年级英语下册 Module 6 Hobbies测试
- [政务民生]2019年宪法知识竞赛试题库100题(含答
- [政务民生]自动化英文文献翻译
- [政务民生]公文格式实施细则
- [政务民生]高一地理上册课堂跟踪练习题6
- [政务民生]会计继续教育习题及答案
- 第三章 无约束最优化方法
- 泛读教程第三册答案
- 魏晋南北朝文学
- 幂的运算复习题
- 城市环境问题的成因与治理策略_以社会
- 钢结构行业产业链及竞争分析研究
- 新型热塑性弹性体增韧聚丙烯的研究
- 中国旅游地理B卷试题及答案
- (苏教版)五年级数学上册第三单元测试卷
- 不稳定性心绞痛诊断与治疗
- 俞氏国际后勤职能部门绩效考核办法
- GB7258-2017新标准考试题含答案
- 小学生汉字听写比赛活动方案
- 1.3《平抛运动》学案 教科版必修2
- 2011香港特别行政区公务员考试复习资料
- 考虑水力条件变化的城市给水管网可靠性
- 表面活性剂在油田开发和生产中的应用
- ITT内部培训资料-FI端吸泵的介绍
- 文明守纪,从我做起学生发言稿
- 初中读《聊斋志异》心得体会800字范文




