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

第9章 运算符重载

来源:网络收集 时间:2026-09-09
导读: 第9章 运算符重载9.1 9.2 9.3 9.4 概述 运算符重载的一般规则 运算符重载的两种形式 几个常用运算符的重载 over 9.1 概述运算符重载就是编写函数来拓展某些运算符所作用的对象范围,使得它们不但能用于标准的数据类型,而且能 应用于用户自定义类的对象或者

第9章 运算符重载9.1 9.2 9.3 9.4 概述 运算符重载的一般规则 运算符重载的两种形式 几个常用运算符的重载

over

9.1 概述运算符重载就是编写函数来拓展某些运算符所作用的对象范围,使得它们不但能用于标准的数据类型,而且能 应用于用户自定义类的对象或者对象与标准数据类型的混

合操作。这一类函数成为运算符重载函数,对这一类函数的重载称为运算符重载。 为什么要重载运算符?运算符重载能带来哪些好处 呢?让我们分析下面的程序。

int sum_i; float sum_f , sum; int i1 = 123 , i2 = 456; float f1 = 3.45 , f2 = 6.78; sum_i = i1 + i2; sum_f = f1 + f2; sum = i1 + f1; 在上面的程序中,为什么同一个运算符“+”可以完成不同类 型的数据的加法运算呢?原因在于C++语言针对基本数据类型已 经对某些运算符做了运算符重载。 当编译程序编译表达式i1+i2时,会自动使用整型数据相加的 算法,编译表达式f1+f2时会自动使用浮点数相加的算法,依次 类推。上述工作都是由编译程序自动完成的,无需程序员进行 任何操作。

但是C++语言在解决各种各样的实际问题时往往需要使用许多自定义的数 据类型。例如,在解决科学计算问题时常要用到复数的运算,下面定义一个简 化的复数类complex: class complex { double real,imag; complex(double r=0,double i=0) { real = r ; imag = i ; } }; 然后定义类complex的两个对象c1和c2,再把c1和c2加在一起,这样的运 算能不能实现呢?答案是否定的。例如: void main() { complex c1(1.1,2.2) , c2(3.3,4.4) , total ; total = c1+c2; //编译错误 …… }

【例9.1】使用成员函数完成复数的加法运算。 #include <iostream.h> class complex // complex类声明 { private: double x,y; //实部为x,虚部为y public: complex(double xx=0,double yy=0) //构造函数 { x=xx; y=yy; } double getx() //得到实部x值 { return x; } double gety() //得到虚部y值 { return y; }

void display() //输出复数 { cout<<"( "<<x; if(y>0) cout<<" + "<<y<<"*i )"; else if(y<0) cout<<y<<"*i )"; else cout<<" )"; } complex add(complex &c1, complex &c2) //定义成员函数实现复数加法运算 { this->x=c1.x+c2.x; this->y=c1.y+c2.y; return *this; }}; void main() { complex c1(3,4),c2(4,-5),c3; c3.add(c1,c2); c1.display(); cout<<" + "; c2.display(); cout<<" = "; c3.display(); cout <<endl; }

程序运行结果: (3+4*i)+(4-5*i)=(7-1*i)

9.2 运算符重载的一般规则运算符重载的一般规则如下: ⑴重载的运算符是C++中已经存在的运算符,不允许用户自己定义新的运 算符。 ⑵运算符重载不能改变运算符的语法结构,即操作数的个数。例如:增 量运算符++和减量运算符--只能重载为单目运算符使用。不能重载为双目 运算符使用。 ⑶运算符重载不能改变C++语言中已

定义的运算符的优先顺序和结合性。 ⑷运算符重载一般不改变运算符功能。 ⑸不能重载的运算符有:sizeof()运算符;成员运算符(.);指向成员的指 针运算符(*);作用域运算符(::);条件运算符(?:)。 ⑹重载的运算符必须和用户自定义的类对象一起使用,其参数至少应有 一个是类的对象或对象的引用。 ⑺重载运算符函数不能含有默认的参数。 ⑻运算符只能被显式重载。return

9.3 运算符重载的两种形式9.3.1 用成员函数重载运算符 9.3.2 用友元函数重载运算符

return

9.3.1 用成员函数重载运算符运算符重载为类的成员函数的语法格式如下: 函数类型 类名::operator 运算符(参数表) { 函数体; } 其中,“函数类型”是成员函数的返回值类型;“类名”是重 载该运 算符 的类;“operator”是关键字,是重载运算符标志;“运算符” 是 要重载的运算符;“参数表”表示该运算符所需要的操作数,二元 运 算符重载为类的成员函数,它们包含一个形参,即运算符右侧的操 作数。 注意:要重载的运算符必须置于关键字operator之后。

【例9.2】用成员函数重载算术运算符“+”。 #include <iostream.h> class complex { private: double x,y; public: complex(double xx=0,double yy=0) { x=xx; y=yy; } double getx() { return x; }

// complex类声明

//实部为x,虚部为y

//构造函数

//得到实部x值

double gety() { return y; } void display() { cout<<"( "<<x; if(y>0) cout<<" + "<<y<<"*i )"; else if(y<0) cout<<y<<"*i )"; else cout<<" )"; } complex operator +(complex &c1); };

//得到虚部y值

//输出复数

//声明重载算术运算符“+”

complex complex::operator +(complex &c1) //定义重载算术运算符函数 { complex c; c.x=this->x+c1.x; c.y=this->y+c1.y; return c; } void main() { complex c1(3,4),c2(4,-5),c3; c3=c1+c2; //使用重载的运算符“+” c1.display(); cout<<" + "; 程序运行结果: c2.display(); ( 3+4*i ) + ( 4-5*i ) = ( 7-1*i ) cout<<" = "; c3.display(); cout <<endl; }

现在可以使用以下语句将对象进行加操作: obj3 = obj1 + obj2; // 类complex 对象

运算符“+”可以访问两个对象:运算符左侧对象obj1是将要调用重载运算符函数的对象,右侧对象obj2作为函数调用的参数,也就是说 编译程序将其解释为obj3 = obj1.operator+(obj2)的形式。因为它是 调用函数的对象,所以可直接访问左侧操作数(即对象obj1),把右 侧操作数作为参数来访问。 由此可见,当重载为成员函数时,双目运算符仅有一个参数。对 于单目运算符,重载为成员函数时,不需要再说明参数。重载为成员

函数时,总是隐含了一个参数,该参数是this指针。this指针是指向调用该成员函数对象的指针。

return

9.3.2 用友元函数重载运算符运算符重载为类的友

元函数的一般语法形式如下: friend 函数类型 operator 运算符 (形参表) {

函数体;} 其中:“friend”是运算符重载为友元函数时,在函数 类 型说明之前使用的关键字。 二元运算符重载作为友元函数,它们含有两个参数。

【例9.3】用友元函数重载关系运算符"!="。 #include <iostream.h> class complex // complex类声明 { private: double x,y; //实部为x,虚部为y public: complex(double xx=0,double yy=0) //构造函数 { x=xx; y=yy; } double getx() //得到实部x值 { return x; }

double gety() //得到虚部y值 { return y; } void display() { cout<<"("<<x; if(y>0) cout<<"+"<<y<<"*i )"; else if(y<0) cout<<y<<"*i )"; else cout<<endl; } friend bool operator !=(complex &c1,complex &c2); }; bool operator != (complex &c1,complex &c2) { bool c; c =(c1.x!=c2.x)||(c1.y!=c2.y); return c; }

…… 此处隐藏:2234字,全部文档内容请下载后查看。喜欢就下载吧 ……
第9章 运算符重载.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1891284.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)