nullnull二0一二年三月第6章 运算符重载 第6章 运算符重载 运算符重载是C++的一项强大功能。通过重载,可以扩展C++运算符的功能,使它们能够操作用户自定义的数据类型,增加程序代码的直观性和可读性。6.1 运算符重载基础6.1 运算符重载基础1、运算符重载的概念
C++的运算 符对语言预定义类型是重载的
int i= 2+3;
double j=2+4.8;
float f=float(3.1)+float(2.0);
对于上面的3个加法
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式,C++系统提供了类似于下面形式的运算符重载函数:
int operator+(int, int);
double operator+(int,double);
float operator+(float,float);6.1 运算符重载基础6.1 运算符重载基础C++允许程序员通过重载扩展运算符的功能,使重载后的运算符能够对用户自定义的数据类型进行运算。
比如,设有复数类Complex,其形式如下:
class Complex{
double real,image;
public:
......
};
假设定义了下面的复数对象,并且要实现两个复数相加的运算。
Complex c1,c2,c3;
……
c1=c2+c3;6.1 运算符重载基础6.1 运算符重载基础why?
使程序便于编写和阅读
使程序定义类型与语言内建类型更一致
how?
1.使用特殊的成员函数
2.使用自由函数,一般为友元函数6.1.3 运算符重载的语法6.1.3 运算符重载的语法运算符的计算结果是值,因此运算符函数是要返回值的函数。其重载的语法形式如下:
返回类型 operator@(参数表)
其中,operator是C++的保留关键字,表示运算符函数。@代表要重载的运算符,它可以是前面列举的可重载运算符中的任何一个。6.1.4 类运算符的重载 6.1.4 类运算符的重载 1、C++为类默认的重载运算符
① 赋值运算(=);
② 取类对象地址的运算函符(&);
③ 成员访问运算(如“.”和“->”)。
这些运算符不需要重载就可以使用,但要在类中使用其他运算符,就必须明确地重载它们。6.1.4 类运算符的重载 6.1.4 类运算符的重载 2、类运算符重载形式
(1)作为类成员函数的运算符重载
以类成员形式重载的运算符参数比实际参数少一个,第1个参数是以this指针隐式传递的。
class Complex{
double real,image;
public:
Complex operator+ (Complex b)
{……}
......
};
6.1.4 类运算符的重载 6.1.4 类运算符的重载 (2)作为友元函数的运算符重载
如果将运算符函数作为类的友元重载,它需要的参数个数就与运算符实际需要的参数个数相同。比如,若用友元函数重载Complex类的加法运算符,则形式如下:
class Complex{
……
friend Complex operator+(Complex a,Complex b);//声明
//......
};
Complex operator+(Complex a,Complex b){……} //定义
6.2 重载二元运算符6.2 重载二元运算符1、二元运算符的调用形式与解析
a@b 可解释成 a.operator@(b)
或解释成 operator@(a, b)
6.2.1 作为成员函数重载
class X{
……
T1 operator@(T2 b){ ……};
}
其中,T1是运算符函数的返回类型,T2是参数的类型,原则上T1、T2可以是任何数据类型,但事实上它们常与X相同。
6.1.4 类运算符的重载 6.1.4 类运算符的重载 【例6-1】 有复数类Complex,利用运算符重载实现复数的加、减、乘、除等复数运算。
//Eg6-1.cpp
#include
using namespace std;
class Complex {
private:
double r, i;
public:
Complex (double R=0, double I=0):r(R), i(I){ };
Complex operator+(Complex b);
Complex operator-(Complex b);
Complex operator*(Complex b);
Complex operator/(Complex b);
void display();
};nullComplex Complex::operator +(Complex b){return Complex(r+b.r,i+b.i);}
Complex Complex::operator -(Complex b){return Complex(r-b.r,i-b.i);}
Complex Complex::operator *(Complex b){
Complex t;
t.r=r*b.r-i*b.i;
t.i=r*b.i+i*b.r;
return t;
}
Complex Complex::operator /(Complex b) {
Complex t;
double x;
x=1/(b.r*b.r+b.i*b.i);
t.r=x*(r*b.r+i*b.i);
t.i=x*(i*b.r-r*b.i);
return t;
}
void Complex::display(){
cout<0) cout<<"+";
if (i!=0) cout<
class Complex {
private:
double r, i;
public:
Complex (double R=0, double I=0) : r(R), i(I){ };
friend Complex operator+(Complex a,Complex b);
friend Complex operator-(Complex a,Complex b);
friend Complex operator*(Complex a,Complex b);
friend Complex operator/(Complex a,Complex b);
void display();
};nullComplex operator+(Complex a,Complex b){return Complex(a.r+b.r,a.i+b.i);}
Complex operator-(Complex a,Complex b){return Complex(a.r-b.r,a.i-b.i);}
Complex operator*(Complex a,Complex b){
Complex t;
t.r=a.r*b.r-a.i*b.i;
t.i=a.r*b.i+a.i*b.r;
return t;
}
Complex operator/(Complex a,Complex b) {
Complex t;
double x;
x=1/(b.r*b.r+b.i*b.i);
t.r=x*(a.r*b.r+a.i*b.i);
t.i=x*(a.i*b.r-a.r*b.i);
return t;
}
void Complex::display(){
cout<0) cout<<"+";
if (i!=0) cout<
class Complex {
private:
double r, i;
public:
Complex (double R=0,double I=0):r(R),i(I){};
friend Complex operator+(Complex a,double b){
return Complex(a.r+b,a.i);
}
friend Complex operator+(double a,Complex b) {
return Complex(a+b.r,b.i);
}
void display();
};nullvoid Complex::display(){
cout<0) cout<<"+";
if(i!=0) cout<
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
一个时间类Time,它能够完成秒钟的自增运算。
//Eg6-4.cpp
#include
using namespace std;
class Time{
private:
int hour,minute,second;
public:
Time(int h,int m,int s);
Time operator++();
void display();
};
Time::Time(int h,int m,int s) {
hour=h;
minute=m;
second=s;
if(hour>=24) hour=0; //若初始小时超过24,重置为0
if(minute>=60) minute=0; //若初始分钟超过60,重置为0
if(second>=60) second=0; //若初始秒钟超过60,重置为0
}nullTime Time::operator ++(){
++second;
if(second>=60) {
second=0;
++minute;
if(minute>=60){ minute=0; ++hour;
if(hour>=24) hour=0;
}
}
return *this;
}
void Time::display(){
cout<=60){
t.second=0;
++t.minute;
if(t.minute>=60){
t.minute=0;
++t.hour;
if(t.hour>=24) t.hour=0;
}
}
return t;
}
void main(){
Time t1(23,59,59);
t1.display();
++ t1; //隐式调用方式
t1.display();
operator++(t1); //显式调用方式
t1.display();
}6.5 输入/输出运算符重载6.5 输入/输出运算符重载6.5.1 重载输出运算符<<
输出运算符<<也称为插入运算符,通过输出运算符<<的重载可以实现用户自定义数据类型的输出。
重载运算符<<的常见格式如下:
ostream &operator<<(ostream &os, classType object)
{
……
os<< … //输出对象的实际成员数据
return os; //返回ostream对象
}6.5 输入/输出运算符重载6.5 输入/输出运算符重载6.5.2 重载输入运算符>>
输入运算符>>也称为提取运算符,用于输入数据。通过输入运算符>>的重载,就能够用它输 入用户自定义的数据类型
其重载形式如下:
istream &operator>>(istream &is,class_name &object) {
……
is>> … //输入对象object的实际成员数据
return is; //返回istream对象
}null【例6-13】 有一销售人员类Sales,其数据成员有姓名name,身份证号id,年龄age。重载输入/输出运算符实现对Sales类数据成员的输入和输出。
//Eg6-13.cpp
#include
#include
class Sales{
private:
char name[10];
char id[18];
int age;
public:
Sales(char *Name,char *ID,int Age);
friend ostream &operator<<(ostream &os,Sales &s); //重载输出运算符
friend ostream &operator>>(istream &is,Sales &s); //重载输入运算符
};
Sales::Sales(char *Name,char *ID,int Age) {
strcpy(name,Name);
strcpy(id,ID);
age=Age;
}
null ostream& operator<<(ostream &os,Sales &s) {
os<>(istream &is,Sales &s) {
cout<<"输入雇员的姓名,身份证号,年龄"<>s.name>>s.id>>s.age;
return is;
}
void main(){
Sales s1("杜康","214198012111711",40); //L1
cout<>s1; //L4
cout<
void main(){
comFinal com("刘科学",78,76,89);
Account a1("张三星",98,78,97,67,87);
Chemistry c1("光红顺",89,76,34,56,78);
cout<
本文档为【第6章 运算符重载】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。