第9章 运算符重载

更新时间:2023-09-03 17:42:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第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; }

void main() { complex c1(3,4),c2(4,3); bool b; b=c1!=c2; 程序运行结果为: c1.display(); (3+4*i ) != (4+3*i ) is True cout<<" != "; c2.display(); b?cout<<" is True."<<endl:cout<<" is False."<<endl;; cout<<endl; } 注意:当运算符重载为类的成员函数时,函数的参数个数比原来的 操作数个数要少一个(后置“++”、“--”除外);当重载为类的友元函数时, 参数个数与原操作数的个数相同。原因是重载为类的成员函数时,如果 某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要 再放在参数表中进行传递,缺少的操作数就是该对象本身。

9.4 几个常用运算符的重载9.4.1 单目运算符重载 9.4.2 双目运算符重载

return

9.4.1 单目运算符重载单目运算符只有一个操作数。例如:增量运算符++、减量运算符--和 单目负运算符(-)。增量运算符和减量运算符可以用于前缀或后缀运算。 1.重载为类的成员函数 【例9.4】重载运算符++。 #include "iostream.h" class Point { private: int xcoord; int ycoord; public: Point (){xcoord =0; ycoord =0;} void operator++(){ ++xcoord; ++ ycoord;} };

本文来源:https://www.bwwdw.com/article/rjpi.html

Top