第11章运算符重载ppt课件

合集下载

11章运算符重载

11章运算符重载

考虑用普通函数实现两个复数相加
Complex complex_add(Complex &c1, Complex &c2) { Complex c; c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; return c; }
将其声明为Complex 类的友元函数
int operator + (int a, int b) {return (a-b);}
(8)用于类对象的运算符一般必须重载,但有两个例外,运算 符“=”和“&”不必用户重载。 ① 赋值运算符(=)可以用于每一个类对象,可以利用它在 同类对象之间相互赋值(系统已经为每一个新声明的类重载 了一个赋值运算符,他的作用是逐个复制类的数据成员)。 ② 地址运算符&也不必重载,它能返回类对象在内存中 的起始地址。 (9)应当使重载运算符的功能类似于该运算符作用于标准类型 数据时所实现的功能。 (10)运算符重载函数可以是类的成员函数,也可以是类的友 元函数,还可以是既非类的成员函数也不是友元函数的普通 函数。
后自增
在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自 增(自减)运算符函数。
#include <iostream> Complex Complex::operator ++ (int) using namespace std; { //对象复制,保存修改前对象状态 class Complex Complex temp(*this); {public: real++; imag++; //对象自增 Complex( ) return temp; //返回的是自加前的对象 {real=0; imag=0;} } Complex(double r,double i) {real=r; imag=i;} void Complex∷display( ) //重载后自增++函数 cout<<″(″<<real<<″,″<<imag<<″i) Complex operator + { +(int); void display( ); ″<<endl;} private: int main( ) double real; { Complex c1(3,4),c2; double imag; c2=c1++; // c1. operator ++ (0) }; cout<<″c1=″; c1.display( ); cout<<″c2=″; c2.display( ); }

面向对象程序设计-运算符重载PPT课件

面向对象程序设计-运算符重载PPT课件

real++;
//原对象值+1
imag++;
return temp; //返回原对象的值
}
21
第21页/共29页
int main() {
Complex c1(5,4); cout<<"c1:"; c1.display(); cout<<"++c1:"; (++c1).display(); cout<<"c1:"; c1.display(); cout<<"c1++:"; (c1++).display(); cout<<"c1:"; c1.display(); } 运行结果:c1:(5,4)
实现时间增加1秒钟.
14
第14页/共29页
class Clock //复数类 {public:
Clock(int newH=0,int newM=0,int newS=0) {Hour=newH; Minute=newM; Second=newS;}
void operator ++(); //运算符重载
Complex& operator ++(); Complex operator ++(int); void Display() //显示复数的值 { cout<<“(”<<real<<“,”<<imag<<“)”<<endl; } private: double real; double imag; };

C运算符重载PPT课件

C运算符重载PPT课件

//如果参数
index超出规定的范围,则输出越界信息
{ cout<<"\nError:下标"<<index<<"出界!"<<'\n';
exit(2);
//stdlib.h
}
return arp[index]; //如果不越界,则返回 相应的数据
}
第28页/共35页
void main(void)
{
CArray m1(10),m2(3);
int len;
int *arp;
public:
CArray(int n=0);
~CArray() {if (arp) delete[]arp;}
int & operator[] (int index);
义重载的下标运算符
};
// 定
第26页/共35页
CArray::CArray(int n)
{
if(n>0){
第14页/共35页
3. 复合运算符+= (利用成员函数重载) C C:: operator+=(C m ) { x+=m.x; return *this; }
C a,b; a+=b;
a.operator+=(b)
第15页/共35页
3. 复合运算符+= (利用友元函数重载) 先在类中声明: friend C operator+=(C & ,C); 再在类外定义: C operator+=(C &m1, C m2 ) { m1.x+=m2.x; return m1; }

C++程序设计教程PPT-C++程序运算符重载教学PPT

C++程序设计教程PPT-C++程序运算符重载教学PPT

· 运算符重载地语法· 运算符重载地规则· 运算符重载地方式· 常用运算符重载· 类型转换函数· 仿函数与智能指针在C++中,运算符重载格式是固定写法,使用operator关键字定义运算符重载,重载格式如下。

返回值类型 operator 运算符名称 (参数列表){...//函数体}//例3-1 operator.cppclass A{private:int _x; int _y;public:A(int x=0,int y=0):_x(x),_y(y){}void show() const;A operator+(const A& a) const; A operator- (const A& a) const; }; void A::show() const{cout<<"(_x,_y)="<<"("<<_x<<",“<<_y<<")"<<endl;}A A::operator+(const A& a) const{ return A(_x+a._x,_y+a._y); }A A::operator-(const A& a) const{ return A(_x-a._x,_y-a._y);}int main(){A a1(1,2); A a2(4,5); A a; cout<<"a1: "; a1.show();cout<<"a2: "; a2.show();a=a1+a2;cout<<"a: "; a.show();a=a1-a2;cout<<"a: "; a.show();return 0;}重载运算符并没有改变其原来地功能,只是增加了针注 意对自定义数据类型地运算功能,具有了更广泛地多态特征。

C++语言PPT: 运算符重载

C++语言PPT: 运算符重载

temp.imag = imag + c.imag; int main()
return temp;
{Complex a(1, 2), b(3.0, 4.0), c;
}
c =a+b;
cout << "c = ";
程序运行结果为: c=(4,6)
c.Print(); }
运算符重载的格式
运算符重载为类的成员函数 运算符重载为类的友元函数
这个整型参数没有其他用途,只是用于区分前置运 算与后置运算。 (附加例):定义一个CInt类,类中只有一个数据成 员i,两个运算符“++”的重载函数,一个没有参数, 实现的是前置运算符重载,另一个有一个整型参数, 实现后置运算符重载。
class CInt {private:
int i; public:
பைடு நூலகம்
Complex operator+(Complex &c);
};
该语句相当于调用函数
operator +(Complex &c)
Complex Complex:: operator +(Complex &c) c=a.operator+(b),
{Complex temp;
实现两个复数的加法运算。
temp.real = real + c.real;
CInt(int a=0); void Print(); CInt operator ++(); CInt operator ++(int); };
运算符“=”和“&”不必用户重载。
运算符重载为类的成员函数

第11章77 运算符重载

第11章77 运算符重载

bool operator<=(const Rational &r1) const;
bool operator>=(const Rational &r1) const;
bool operator!=(const Rational &r1) const;
void display() { cout << num << '/' << den; }
5
不能重载的运算符
. .* :: ?: sizeof
第11章77 运算符重载
6
第11章 运算符重载
什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例
第11章77 运算符重载
7
运算符重载的方法
运算符重载就是写一个函数解释某个运算符在 某个类中的含义
运算符的重载不能改变运算符的运算对象数。因此,重载函 数的形式参数个数(包括成员函数的隐式指针this)与运算 符的运算对象数相同
运算符重载可以重载成成员函数也可以重载成全局函数实现。 重载成全局函数时,最好把此函数设为友员函数
如果作为类的成员函数,它的形式参数个数比运算符的运算 对象数少1。这是因为成员函数有一个隐含的参数this。在 C++中,把隐含参数this作为运算符的第一个参数。
第11章77 运算符重载
4
可以重载的运算符
+ - * / % ^ &| ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete new[] delete[]

清华大学Overload_Operator-C++运算符重载课件

清华大学Overload_Operator-C++运算符重载课件

运算符重载运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。

也就是说,运算符重载是通过定义函数实现的。

1 运算符重载为成员函数 AX++运算符重载实质上是函数的重载,重载运算符的函数一般格式如下:函数类型 operator运算符名称(形参表列){对运算符的重载处理}例如,想将“+”用于Complex(复数)的加法运算,函数的原型可以是这样的:Complex operator + (Complex & c1,Complex &c2);其中,operator是关键字,是专门用于定义重载运算符的函数的,运算符名称就是C++提供给用户的预定运算符。

注意:函数名是由operator和运算符组成。

上面的operator+就是函数名,意思是“对运算符+重载“。

只要掌握这点,这可以发现,这类函数和其他函数在形式上没有什么区别。

两个形参是Complex类对象的引用,要求实参为Complex类对象。

在定义了重载运算符后,可以说:函数operator+重载了运算符+。

在执行复数相加的表达式c1+c2时(假设c1+c2都已被定义为Complex),系统就会调用operator+函数,把c1+c2作为实参,与形参进行虚实结合。

为了说明把运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想象称为调用下面的函数:代码如下:int operator + (int a, int b) { return (a+b); }如果有表达式5+8,就调用此函数,将5和8作为调用函数时的形参,函数的返回值为13,这就是通过函数的方法理解运算符。

例1:运算符重载实现两个坐标点的加运算class Point {int x, y;public:Point() {}Point (int I, int j) { x=i; y=j;}v oid disp() {cout << “(“ << x <<”,”<<y<<”)”<<endl;}Point operator+ (Point &p) {return Point(x+p.x, y+p.y);}};void main() {Point p1(3,4), p2(2,9), p3;p3=p1+p2;p3.disp();}例2:运算符重载实现复数的加、减、乘、除和赋值运算。

C程序设计运算符重载资料

C程序设计运算符重载资料


{
目的对象与源对象不是同一个对象

……
复制被被赋值对象

}

*;
返回目的对象
•}
*重载赋值运算符“=”
• 如用户没有为一个类重载赋值运算符,编译程序将生成一个默认赋值运算符函数。赋值运算 把源对象的数据成员逐个地复制到目的对象的相应数据成员
0;
返回值0, 返回操作系统
}
程序运行时屏幕输出如下: 6 -6 请按任意键继续. . .
用类的友元函数重载双目运算符
• 将双目运算符重载为类的友元函数时,友元函数形参表中包含有两个参数,这两个参数分别 作为运算符的左、右操作数。
例4.6 双目运算符重载为类的友元函数示例。
<>
编译预处理命令
;
使用命名空间
例4.8 双目运算符重载为普通函数示例。 声明整型类
{
:
数据成员
;
数据值
:
公有函数
( n = 0): (n){ }
构造函数
( n) { = n; }
设置数据值
() { ; } 返回数据值
};
( , ) 重载运算符"+"
{ (() + ()); }
()
主函数()
{
i(6), j(9), k;
定义整型对象
例4.5 单目运算符重载为类的友元函数示例。
<>
编译预处理命令
;
使用命名空间
声明整型类
{
: 数据成员
在 6.0下会出现的编译时错语,是 6.0的一个,在
<> ;;
编译预处理:
:
改为:

2015-2016PPT-10_运算符重载

2015-2016PPT-10_运算符重载
} void show( ) const
{ cout<<num<<”/”<<den<<endl; } private:
int num;//分子
int den;//分母
};
int main( ) {
A a(1,3); a.show( );
// 1/3
A b(a); b.show(); // 1/3
b = ++a; a.show(); // 4/3 b.show(); // 4/3
public: A(int a,int b):x(a),y(b) { }
private: int x; int y;
};
//自由函数形式重载 operator+
A operator+(const A& lhs, const A& rhs) {
A result(0,0);
result.x = lhs.x+rhs.x;
3. 便于更改数据成员
若需要增加 int z数据成员时:
};
只需要更改棕色部分
//自由函数形式重载 operator+
A operator+(const A& lhs, const A& rhs) {
return A(lhs)+rhs;
}
吉林大学计算机科学与技术学院
一元运算符重载(例 ++ )
内置类型的前置++和后置++ int a = 10; ++a
A result(0,0);
result.x = lhs.x+rhs.x;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计 - 8
函数原型
《程序设计》 cs.sjtu 2011.9
❖ 运算符的重载不能改变运算符的运算对象数。因此,重载 函数的形式参数个数(包括成员函数的隐式指针this)与运 算符的运算对象数相同
❖ 运算符重载可以重载成成员函数也可以重载成全局函数实 现。重载成全局函数时,最好把此函数设为友员函数
int num; int den; void ReductFraction(); public: Rational(int n = 0, int d = 1) { num = n; den = d;} Rational operator+(const Rational &r1) const; Rational operator*(const Rational &r1) const; bool operator<(const Rational &r1) const; bool operator==(const Rational &r1) const; bool operator>(const Rational &r1) const; bool operator<=(const Rational &r1) const; bool operator>=(const Rational &r1) const; bool operator!=(const Rational &r1) const; void display() { cout << num << '/' << den; } }
《程序设计》 cs.sjtu 2011.9
bool Rational::operator<(const Rational &r1) const { return num * r1.den < den * r1.num; }
bool Rational::operator==(const Rational &r1) const { return num == r1.num && den == r1.den;}
《程序设计》 cs.sjtu 2011.9
第11章 运算符重载
❖ 什么是运算符重载 ❖ 运算符重载的方法 ❖ 几个特殊的运算符的重载 ❖ 自定义类型转换运算符 ❖ 运算符重载实例
程序设计 - 1
《程序设计》 cs.sjtu 2011.9
什么是运算符重载
❖ 使系统内置的运算符可以用于类类型 ❖ 例如:+ 运算符能够实现2个对象间的
程序设计 - 5
《程序设计》 cs.sjtu 2011.9
不能重载的运算符
. .* :: ?: sizeof
程序设计 - 6
《程序设计》 cs.sj 什么是运算符重载 ❖ 运算符重载的方法 ❖ 几个特殊的运算符的重载 ❖ 自定义类型转换运算符 ❖ 运算符重载实例
程序设计 - 11
函数实现
《程序设计》 cs.sjtu 2011.9
Rational Rational::operator+(const Rational &r1) const { Rational tmp;
tmp.num = num * r1.den + r1.num * den; tmp.den = den * r1.den; tmp.ReductFraction(); return tmp; }
程序设计 - 3
《程序设计》 cs.sjtu 2011.9
运算符重载的限制
❖ 不是所有的运算符都能重载 ❖ 重载不能改变运算符的优先级和结合性 ❖ 重载不能改变运算符的操作数个数 ❖ 不能创建新的运算符
程序设计 - 4
《程序设计》 cs.sjtu 2011.9
可以重载的运算符
+ - * / % ^ &| ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete new[] delete[]
程序设计 - 9
重载实例
《程序设计》 cs.sjtu 2011.9
❖ 为rational类增加“+”和“*”以及比较 的重载函数,用以替换现有的add和 multi函数
程序设计 - 10
方案一:重载成成员函数 《程序设计》 cs.sjtu 2011.9
class Rational { private:
❖ 如果作为类的成员函数,它的形式参数个数比运算符的运 算对象数少1。这是因为成员函数有一个隐含的参数this。 在C++中,把隐含参数this作为运算符的第一个参数。
❖ 当把一个一元运算符重载成成员函数时,该函数没有形式 参数。
❖ 把一个二元运算符重载成成员函数时,该函数只有一个形 式参数,就是右操作数,当前对象是左操作数。
bool Rational::operator>(const Rational &r1) const { return num * r1.den > den * r1.num; }
程序设计 - 7
《程序设计》 cs.sjtu 2011.9
运算符重载的方法
❖ 运算符重载就是写一个函数解释某个运算符 在某个类中的含义
❖ 要使得系统能自动找到重载的这个函数,函 数名必须要体现出和某个被重载的运算符的 联系。
❖ C++中规定,重载函数名为
operator@ 其中,@为要重载的运算符。如要重载“+”运 算符,该重载函数名为operator+。要重载赋 值运算符,函数名为operator=。
加。例如:类A的对象a1、a2、a3,希 望: a3 = a1 + a2; 即:分别把对象a1和a2的各个数据成员 值对应相加,然后赋给对象a3。
程序设计 - 2
问题的提出
《程序设计》 cs.sjtu 2011.9
❖把某些事交给系统去做,用户只要知道 相加就可
❖扩充运算符的功能 ❖增强了C++ 语言的可扩充性 ❖使用户定义的类更像系统的内置类型
Rational Rational::operator*(const Rational &r1) const
{ Rational tmp;
tmp.num = num * r1.num;
tmp.den = den * r1.den;
tmp.ReductFraction();
return tmp;
}
程序设计 - 12
相关文档
最新文档