第14讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类的成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数.

Slides:



Advertisements
Similar presentations
第三章 仓储技术作业过程.
Advertisements

第九讲 类与对象 (I)面向对象基础.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
第14章 c++中的代码重用.
C++程序设计 王希 图书馆三楼办公室.
第10讲 Java面向对象编程基础(4) 教学目标 主要内容.
Object-Oriented Programming in C++ 第四章 运算符重载
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
授课老师:龚涛 信息科学与技术学院 2018年4月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第12讲 多继承与虚基类 多继承 虚基类.
辅导课程六.
第八章 类与对象 本章要求: 掌握类的含义与定义格式。 掌握类的无参构造函数、带参构造函数、拷贝构造函数和赋值重载函数的定义格式及作用。
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
类类型 C++支持的内置类型和操作,如 int i=10; i=i%6; i=i+4;
第九章 多态性 丘志杰 电子科技大学 计算机学院 软件学院.
第二章 Java语言基础.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
第十一讲 运算符重载 与类型转换.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第七章 操作符重载 胡昊 南京大学计算机系软件所.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 QQ: 学习网站:
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
第12讲 多继承与虚基类 多继承 虚基类.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
$9 泛型基础.
C#面向对象程序设计 $6 深入理解类.
第2章 数据类型及表达式 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
第13讲 多态 友员函数 多态性与虚函数 纯虚函数和抽象类.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
补课.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言程序设计 李祥 QQ:
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
C++大学基础教程 第10章 运算符重载 北京科技大学 2019/5/7 北京科技大学.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第九节 赋值运算符和赋值表达式.
第2章 数据类型、运算符与表达式 本章要点: 基本数据类型 常量和变量 算术运算符和算术表达式 关系运算符和关系表达式
THE C PROGRAMMING LANGUAGE
第二章 类型、对象、运算符和表达式.
C++程序设计基础 主讲人:谢昕 华东交通大学信息工程学院 第十~十二讲 多态性和虚函数 2005年春季学期.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
#include <iostream.h>
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第17章 运算符重载 一、运算符重载的概念 二、禁止重载的运算符 三、运算符重载的规则 四、单目运算符函数 五、双目运算符函数.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第三章 高级函数特性.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Presentation transcript:

第14讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类的成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数

学习目标 理解运算符重载的含义和规则; 掌握运算符重载作为类成员函数和友元函数的 方法; 掌握常用运算符的重载,了解++和--等特殊运 算符的重载; 理解不同类型数据间转换的概念和方法。

第14讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类的成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数

同一运算符作用于不同类型的数据具有不同实现 什么是运算符重载 (一)什么是重载( Overloading )? 1、重载——重新赋予新的含义 2、函数重载 3、运算符重载——为已有的运算符赋予多重含义。 int a,b,c; c=a+b; cout<<c; double x,y,z; z=x+y; cout<<z; 同一运算符作用于不同类型的数据具有不同实现

什么是运算符重载 int sum,a=3,b=2; (int)=(int) + (int) sum=a+b; 系统自动识别数据类型 sum=a+b; float add, x=3.2, y=2.5; (float)=(float) + (float) add=x+y; char str[4], c1[2]="a", c2[2]="b"; (char *)=(char *) + (char *) str=c1+c2; 编译系统中的运算符“+”本身不能做这种运算,若使上式可以运算,必须重新定义“+”运算符,这种重新定义的过程成为运算符的重载。

运算符重载的作用 class A { float x,y; public: A(float a=0, float b=0){ x=a; y=b; } } void main(void) { A a(2,3), b(3,4), c; c=a+b; 两对象不能使用+,必须重新定义+ 通过重载可使该运算符能像操作基本数据类型一样,来操作用户自定义的数据类型。

运算符重载的作用 运算符的重载从另一个方面体现了面向对象编程技术的多态性,即同一运算符根据不同的运算对象可以完成不同的操作。 为了重载运算符,必须定义一个函数,并告诉编译器,遇到这个重载运算符时就调用该函数,由这个函数来完成该运算符应该完成的操作。这种函数称为运算符重载函数。

运算符重载的方法 { 运算符的重载处理 } 1、通过定义一个重载运算符函数来实现。 2、重载运算符函数的一般格式 3、举例 函数类型 operator 运算符 ( 形参列表 ) { 运算符的重载处理 } 3、举例 重载“+”,实现复数加法运算

. .* :: sizeof ? : 运算符重载的规则 只能对已有的运算符进行重载。 大部分运算符都可以重载,以下五个除外: 运算符重载后,“三不变”。 即原运算符的操作数的个数、优先级和结合性 都不变。 其他规则。P219

第14讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数

重载为类的成员函数 A opeator + (A &); 格式如下: <类名> operator<运算符>(<参数表>) { 函数体 } 运算的对象 关键字 返回类型 函数名 运算的对象 A opeator + (A &); //重载了类A的“+”运算符 其中:operator是定义运算符重载函数的关键字,它与其后的运算符一起构成函数名。

利用函数完成了加法运算 用和作对象调用函数 class A 没有重载运算符的例子 { int i; public:A(int a=0) { i=a; } void Show(void){ cout<<"i="<<i<<endl; } void AddA(A &a, A &b) //利用函数进行类之间的运算 { i=a.i+b.i; } }; void main(void) { A a1(10),a2(20),a3; a1.Show (); a2.Show (); // a3=a1+a2; //不可直接运算 a3.AddA(a1,a2); //调用专门的功能函数 a3.Show (); } 没有重载运算符的例子 利用函数完成了加法运算 用和作对象调用函数

class A { int i; public:A(int a=0){ i=a; } void Show(void){ cout<<"i="<<i<<endl; } void AddA(A &a, A &b) //利用函数进行类之间的运算 { i=a.i+b.i; } A operator +(A &a) //重载运算符+ { A t; t.i=this->i+a.i; return t; } }; void main(void) { A a1(10),a2(20),a3; a1.Show (); a2.Show (); a3=a1+a2; //重新解释了加法,可以直接进行类的运算 a3.AddA(a1,a2); //调用专门的功能函数 a3.Show (); } 运用重载运算符的例子 相当于a3=a1.operator+(a2)

重载运算符与一般函数的比较: void AddA(A &a, A &b) { i=a.i+b.i; } A operator +(A &a) 相同:1)均为类的成员函数;2)实现同一功能 返回值 函数名 返回值 函数名 形参列表 void AddA(A &a, A &b) { i=a.i+b.i; } A operator +(A &a) { A t; t.i=this->i+a.i; return t; } 形参 函数调用: a3.AddA(a1,a2); 函数调用: 由对象a1调用 由对象a3调用 a3=a1+a2; a3=a1.operator+(a2);

重载为类的成员函数 重新定义运算符,由左操作符调用右操作符。最后将函数返回值赋给运算结果的对象。 A operator +(A &a) 函数名 重新定义运算符,由左操作符调用右操作符。最后将函数返回值赋给运算结果的对象。 返回值 A operator +(A &a) { A t; t.i=this->i+a.i; return t; } 形参 函数调用: 由对象a1调用 a3=a1+a2; a3=a1.operator+(a2);

重载为类的成员函数 当用成员函数实现运算符的重载时,运算符重载函数的参数只能有二种情况:没有参数或带有一个参数。 对于只有一个操作数的运算符(如++),在重载这种运算符时,通常不能有参数; 而对于有二个操作数的运算符,只能带有一个参数。 这时参数可以是对象,对象的引用,或其它类型的参数。在C++中不允许重载有三个操作数的运算符。

重载为类的成员函数 用成员函数实现运算符的重载时,运算符的左操作数为当前对象,并且要用到隐含的this指针。

静态成员变量 静态成员变量 类的静态成员变量是直接与类联系,属于类的成员 而不是对象,供所有对象共享,存放于全局区,因 而不计入类的内存计算。 静态成员不属于类的任何对象,所以并不是对象建 立时被定义的,所以它不能由类的构造函数初始化 ,一般也不能在类内初始化。 关键字static只出现类的内部。 可以声明为const。

静态成员函数 静态成员函数类似于静态成员变量都属于类而 不是对象。 静态成员函数仅可以调用类的静态成员变量, 不可以调用普通成员变量。 静态成员函数类似于静态成员变量都属于类而 不是对象。 静态成员函数仅可以调用类的静态成员变量, 不可以调用普通成员变量。 不具有this指针。 不能声明为const。

静态成员变量与静态成员函数 int A::ac=1; int A::dc=1; int A::stval() { // nn=10; dc=20; return dc;} int A::val() { dc=ac; return dc; } int main() { A a; cout<<a.ac; cout<<a.val(); cout<<A::bc; cout<<A::stval(); cout<<a.stval(); return 0; } 类外定义且初始化 #include <iostream> using namespace std; class A { public: A(){} int val(); static int stval(); static int ac; const static int bc=2; private: static int dc; int nn; }; 错误,静态成员函数不能调用非静态成员 静态成员函数 静态成员变量 使用类的对象访问 类作用域运算符直接访问 常量静态成员可以在类内初始化

第14讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类的成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数

运算符重载作为类的友元函数 友元函数是在类外的普通函数,与一般 函数的区别是可以调用类中的私有或保 护数据。 友元函数是在类外的普通函数,与一般 函数的区别是可以调用类中的私有或保 护数据。 将运算符的重载函数定义为友元函数, 参与运算的对象全部成为函数参数。

运算符重载作为类的友元函数 对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。有些运算符不能重载为友元函数,它们是:=,(),[ ],->等。格式为: friend <函数类型> operator<运算符>(<参数表>) {......} 例如:c=a+b; // c=operator+( a, b) friend A operator + (A &a, A &b) {.....}

例如: A a, b, c; c=a+b; 实际上是 c=operator+(a, b); c=++a; 实际上是 operator+=( c, a );

void Show(void) {cout<<"i="<<i<<endl;} class A { int i; public: A(int a=0) { i=a; } void Show(void) {cout<<"i="<<i<<endl;} friend A operator + (A &,A &);//友元函数,两个参数,为引用 }; A operator + (A &a , A &b) {A t; t.i=a.i+b.i; return t; } void main(void) { A a1(10),a2(20),a3; a1.Show (); a2.Show (); a3=a1+a2; //重新解释了加法,可以直接进行类的运算 a3.Show (); } 相当于a3=operator+(a1,a2)

运算符重载作为类的友元函数 class Complex { double real, imag; public: Complex(double x=0,double y=0) { real=x; imag=y; } friend Complex operator+(Complex &c1,Complex &c2); void Display() { cout<<real<<"+"<<imag<<"i"<<endl;} };

运算符重载作为类的友元函数 Complex operator +(Complex &c1,Complex &c2) { Complex c; c.real =c1.real +c2.real ; c.imag =c1.imag +c2.imag ; return c; }

运算符重载作为类的友元函数 等价于 c3=operator+(c1,c2); void main() { Complex c1(1,3),c2(4,-5),c3; cout<<"c1="; c1.Display (); cout<<"c2="; c2.Display (); c3=c1+c2; cout<<"c1+c2="; c3.Display (); } 等价于 c3=operator+(c1,c2);

第13讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类的成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数

重载++与--运算符 A a; ++a; a++; A a, b; b=++a; b=a++; 重载为类的成员函数

重载++与--运算符 A a, b; b=++a; b=a++; A operator ++(void){ .... } ++为前置运算时,它的运算符重载函数的一般格式为: <type> operator ++(void) { ......;} ++为后置运算时,它的运算符重载函数的一般格式为: <type> operator ++(int) A a, b; b=++a; b=a++; A operator ++(void){ .... } A operator ++(int){ .... }

例程: class A { float x, y; public: A(float a=0, float b=0){ x=a; y=b; } A operator ++(void){A t; t.x=++ x; t.y=++y; return t;} A operator ++(int) {A t; t.x=x++; t.y=y++; return t;} }; void main(void) { A a(2,3), b; b=++a; b=a++; }

重载++与--运算符 重载为类的友元函数 ++为前置运算时,它的运算符重载函数的一般格式为: A operator ++(A &a) { ......;} ++为后置运算时,它的运算符重载函数的一般格式为: A operator ++(A &a, int)

例如 A a, b; b=++a; b=a++; friend A operator ++( A &a ){ .... } friend A operator ++(A &a, int){ .... }

例程 class A { int i; void main(void) public: { A a1(10),a2,a3; A(int a=0) { i=a; } void Show(void) {cout<<"i="<<i<<endl;} friend A operator++(A &a) { a.i++; retrurn a;} friend A operator++(A &a, int n) { A t; t.i=a.i; a.i++; return t; } }; void main(void) { A a1(10),a2,a3; a2=++a1; a3=a1++; a2.Show(); a3.Show (); }

第14讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类的成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数

类型转换函数 A float 类型转换函数就是在类中定义一个成员函数,其作用是将类转换为某种数据类型。 class A { float x, y; public: A(float a, float b){ x=a; y=b;} }; void main(void) { A a(2,3); cout<<a<<endl; } 利用转换函数将类A的对象a转换成某种数据类型 A float 错误!类的对象不能直接输出

A float 1.转换函数必须是类的成员函数。 在类外定义的格式为: ClassName :: operator <type>( ) {.........} 关键字 欲转换类型 类名 具体的转换算法 2.转换函数的调用是隐含的,没有参数。 A :: operator float ( ) { return x+y; } 转换算法自己定义

例程 void main(void) class A { A a1(10),a2(20); { int i; public:public: A(int a=0) { i=a; } void Show(void) { cout<<"i="<<i<<endl;} operator int( ){return i;} }; void main(void) { A a1(10),a2(20); cout<<a1<<endl; cout<<a2<<endl; }

class Complex{ float Real, Image; public: Complex(float real=0,float image=0) { Real=real; Image=image; } void Show(void) {cout<<"Real="<<Real<<'\t'<<"Image="<<Image<<endl; } operator float(); //成员函数,定义类转换 Complex->float }; Complex::operator float () { return Real*Real+Image*Image;} void main(void) { Complex c(10,20); c.Show (); cout<<c<<endl;//可以直接输出c,因为已经进行类型转换 }

第14讲 运算符重载 运算符重载的概念、方法和规则 运算符重载作为类的成员函数 运算符重载作为类的友元函数 特殊运算符的重载 类型转换函数