教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

第13章 运算符重载

来源:网络收集 时间:2026-08-25
导读: c++运算符重载 Visual C++程序设计 第13章 运算符重载 c++运算符重载 第13章 运算符重载 13.1 运算符重载 13.2 几个特殊运算符的重载 13.3 字符串类 c++运算符重载 13.1 运算符重载13.1.1 运算符重载的概念 通常情况下,对象除了赋值外,不能进行其他运算。

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字,全部文档内容请下载后查看。喜欢就下载吧 ……

第13章 运算符重载.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1443607.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)