c谭浩强清华大学出版社
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
❖ 6、形参不能为指针类型,形参可以为对象或对象的引用。
❖ 7、运算符重载函数可以是:友元函数、成员函数和普通的全局函数, 具体情况具体分析。
❖ 8、下列运算符只能通过成员函数重载。 = 、() 、 [ ] 、 类型转换函数。
❖ 9、>> 、 << 只能重载为友元。
❖ 10、运算符“=”和“&” 系统提供缺省重载。
方法2:成员函数
class complex{
…
Public:
complex operator +(complex &c2);
…
};
complex complex::operator +(complex &c2)
{ complex c;
c.real=real+c2.real;
c.imag=imag+c2.imag;
第10章 运算符重载
本章重点: 有关类的运算符重载 有关类的数据类型转换
Home
10.1什么是运算符重载
❖ 赋予C++运算符多种含义。和函数重载一样。 ❖ C++(包括C语言)系统已经重载了很多运算符。
应用于标准数据类型数据的处理。 ❖ C++给用户也提供了重载标准运算符的权力。允
许将标准C++运算符应用于自定义类型(类)的 对象。 ❖ 根据用户使用被重载的运算符的不同的场合,确 定它的作用是什么。
• c3=4+c2; //不能用于成员函数 • c5=complex(4,0)+c2;
10.3 重载运算符的规则(限制)
❖ 1、大多数系统预定义运算符都能重载,但以下
运算符不允许重载:
sizeof ::
?: . .*
❖ 2、不能定义ຫໍສະໝຸດ Baidu的运算符
❖ 3、功能相似规则:重载后的功能尽量类似于作用 于标准数据类型的功能。提高可读性。即在使用 时应模仿运算符的习惯用法 。但对新功能,只能
方法1:友元 c3 =operator+(c1,c2);
方法2:成员 c3=c1.operator+(c2);
• return complex(real+c2.real , imag+c2.imag); 建立一个无名临时对象
• c4=c1+c2+c3; (c1.operator+(c2) ).operator+( c3);
方法1:
complex operator +(const complex &c1, const complex &c2)
{ complex c;
c.real=c1.real+c2.real;
c.imag=c1.imag+c2.imag; return c; }
?考虑该函数和 复数类的关系
class complex{ friend complex operator +(const complex &c1, const complex &c2); …. };
return c; }
当成员函数的参数为同一类(class) 的对象或它的引用,在函数体内使用参
数对象的私有数据成员时,可用对象名 加成员访问操作符点号进行。
仅在成员函数中可以这样做。
❖ int main() { complex c(3,4),c2(-5,10),c3;
c3=c1+c2; return 0; }
复制构造函数
转换构造函数
编译器生成的成员函数
缺省构造函数、复制构造函数、赋值运算符
将一个类的对象转换成另一类型的数据(预定义类型或其它类对象)。 它只能重载为成员函数
类名 :: operator 目的类型() //也称类型转换运算符重载函数 {实现转换的语句}
参见书上例10.9,10.10
类使用小结
类的几种构造函数
缺省构造函数
默认构造函数
成员初始化列表
用于初始化的构造函数
默认参数构造函数
❖ 见书上例 10.4 (P324)
❖
例 10.5 (P328)
单目:重载++和--
❖ 一、关于++和- ❖ 1、C中的++和- -的两种形式: ❖ 前置:++i, --i; 后置: i++ ,i--; ❖ 2、在C++中的约定 (显式地区分前置和后置缀) ❖ (1)对于前置方式++i: ❖ 成员函数:X X::operator ++ ( ); ❖ 友元函数:X operator ++ (X & ); ❖ (2)对于后置方式i++: ❖ 成员函数:X X::operator ++ (int); ❖ 友元函数:X operator ++(X&, int); ❖ 第二个参数int 一般设置为0,如: ❖ i++ 等价于:i++(0) 或:i++=0
❖ 成员函数重载的运算符第一个参数(左操作数)只能是该 类的对象。
❖ 若为非成员函数,一般应为友元函数,这样可以访问私有 数据成员。
成员函数还是友元函数?
❖ 必须选则其中一种形式。不能同选。避免二义性。 ❖ 哪种好? 一般没太大区别,但有些运算符只能采用特定形
式。
❖ 只能通过成员函数重载的运算符:
10.7 重载流插入和流提取运算符
❖ 了解C++的I/O系统(第13章) ❖ 理解cin、cout输入输出标准数据类型的原理。
cin cout 是两个对象,所在的类以成员函数的形式重载了 >>(提 取,输入) 和<<(插入,输出)运算符。 ❖ 若想以同样的形式输入输出用户自定义类型,需要用户自己重载>>和 << ❖ 只能重载为友元或普通全局函数 ❖ 格式: istream & operator>>(istream &,自定义类 &); ostream & operator<<(ostream &,自定义类 &);
10.4 运算符的成员函数重载与友元函数重载
成员函数重载与友员函数重载的区别
❖ 声明与定义的形式不同 ❖ 参数数目不同
this指针的有无,导致参数个数不同。
❖ 编译器的解释不同 ❖ 对操作数的处理能力不同(体现在双目上) ❖ 用友员重载需要改变操作数自身的运算符时,如
++、--、+=等,参数必须采用传递引用的形式。 若它们重载成成员函数,需要被修改的操作数是 通过this指针传递的,对其修改没有问题。
10.2 运算符重载的方法
❖ 定义一个重载运算符的函数。
❖ 在需要执行被重载运算符时,系统自动调用该函 数,以实现相应的运算。
❖ 函数格式:
函数名
函数类型 operator 运算符名称@(形参列表) { 对运算符的重载处理 }
❖ 调用方法:显示的调用函数; 按运算符的使用方法写成表达式。
例:重载“+”运算符,应用于复数类
可实现连续输出、输入信息。 ❖ 函数的功能是通过调用COUT 和CIN 对标准类型输入输出功能来实现
的。
10.8 不同类型数据间的转换
转换构造函数 将一个其它类型的数据转换成一个指定的类的对象。即创建一个对象。
❖ 只有一个形参。参数的类型是需要转换的类型。 ❖ 格式:构造函数的一般格式,形参类型为要转换的其它类型。 ❖ 使用:类名(指定类型的数据); 类型转换函数
= 、() 、 [ ] 、 类型转换函数。
❖ 只能重载为友元:>> 、 << 。
❖ 一般双目用友元,单目用成员。 ❖ 有时使用友元更好(尤其是为类定义了类型转换时 )。
10.5 ~10.6 几个典型运算符的重载
重载单目、双目运算符
❖ 赋值运算符=的重载(为了实现连续赋值,要返回该对象) ❖ 自增++与自减--运算符的重载 ❖ 重载流插入>>和流提取<<运算符(友元)
借用其它功能的运算符。
❖ 4、不能改变优先级;不能改变结合性;不能改变
运算符所需操作数的个数;运算符重载函数不能 有默认的参数。交换律不适用
❖ 5、重载的运算符的操作数必须有自定义类型。其参数至 少应有一个是类对象(或类对象的引用)。以防止用户为 预定义类型重载运算符。 运算符被重载时,只是相对一特定类被重载,在特定 的环境下作出特定的解释。当离开这个特定环境后,具有 原来的意义(系统定义);
❖ 7、运算符重载函数可以是:友元函数、成员函数和普通的全局函数, 具体情况具体分析。
❖ 8、下列运算符只能通过成员函数重载。 = 、() 、 [ ] 、 类型转换函数。
❖ 9、>> 、 << 只能重载为友元。
❖ 10、运算符“=”和“&” 系统提供缺省重载。
方法2:成员函数
class complex{
…
Public:
complex operator +(complex &c2);
…
};
complex complex::operator +(complex &c2)
{ complex c;
c.real=real+c2.real;
c.imag=imag+c2.imag;
第10章 运算符重载
本章重点: 有关类的运算符重载 有关类的数据类型转换
Home
10.1什么是运算符重载
❖ 赋予C++运算符多种含义。和函数重载一样。 ❖ C++(包括C语言)系统已经重载了很多运算符。
应用于标准数据类型数据的处理。 ❖ C++给用户也提供了重载标准运算符的权力。允
许将标准C++运算符应用于自定义类型(类)的 对象。 ❖ 根据用户使用被重载的运算符的不同的场合,确 定它的作用是什么。
• c3=4+c2; //不能用于成员函数 • c5=complex(4,0)+c2;
10.3 重载运算符的规则(限制)
❖ 1、大多数系统预定义运算符都能重载,但以下
运算符不允许重载:
sizeof ::
?: . .*
❖ 2、不能定义ຫໍສະໝຸດ Baidu的运算符
❖ 3、功能相似规则:重载后的功能尽量类似于作用 于标准数据类型的功能。提高可读性。即在使用 时应模仿运算符的习惯用法 。但对新功能,只能
方法1:友元 c3 =operator+(c1,c2);
方法2:成员 c3=c1.operator+(c2);
• return complex(real+c2.real , imag+c2.imag); 建立一个无名临时对象
• c4=c1+c2+c3; (c1.operator+(c2) ).operator+( c3);
方法1:
complex operator +(const complex &c1, const complex &c2)
{ complex c;
c.real=c1.real+c2.real;
c.imag=c1.imag+c2.imag; return c; }
?考虑该函数和 复数类的关系
class complex{ friend complex operator +(const complex &c1, const complex &c2); …. };
return c; }
当成员函数的参数为同一类(class) 的对象或它的引用,在函数体内使用参
数对象的私有数据成员时,可用对象名 加成员访问操作符点号进行。
仅在成员函数中可以这样做。
❖ int main() { complex c(3,4),c2(-5,10),c3;
c3=c1+c2; return 0; }
复制构造函数
转换构造函数
编译器生成的成员函数
缺省构造函数、复制构造函数、赋值运算符
将一个类的对象转换成另一类型的数据(预定义类型或其它类对象)。 它只能重载为成员函数
类名 :: operator 目的类型() //也称类型转换运算符重载函数 {实现转换的语句}
参见书上例10.9,10.10
类使用小结
类的几种构造函数
缺省构造函数
默认构造函数
成员初始化列表
用于初始化的构造函数
默认参数构造函数
❖ 见书上例 10.4 (P324)
❖
例 10.5 (P328)
单目:重载++和--
❖ 一、关于++和- ❖ 1、C中的++和- -的两种形式: ❖ 前置:++i, --i; 后置: i++ ,i--; ❖ 2、在C++中的约定 (显式地区分前置和后置缀) ❖ (1)对于前置方式++i: ❖ 成员函数:X X::operator ++ ( ); ❖ 友元函数:X operator ++ (X & ); ❖ (2)对于后置方式i++: ❖ 成员函数:X X::operator ++ (int); ❖ 友元函数:X operator ++(X&, int); ❖ 第二个参数int 一般设置为0,如: ❖ i++ 等价于:i++(0) 或:i++=0
❖ 成员函数重载的运算符第一个参数(左操作数)只能是该 类的对象。
❖ 若为非成员函数,一般应为友元函数,这样可以访问私有 数据成员。
成员函数还是友元函数?
❖ 必须选则其中一种形式。不能同选。避免二义性。 ❖ 哪种好? 一般没太大区别,但有些运算符只能采用特定形
式。
❖ 只能通过成员函数重载的运算符:
10.7 重载流插入和流提取运算符
❖ 了解C++的I/O系统(第13章) ❖ 理解cin、cout输入输出标准数据类型的原理。
cin cout 是两个对象,所在的类以成员函数的形式重载了 >>(提 取,输入) 和<<(插入,输出)运算符。 ❖ 若想以同样的形式输入输出用户自定义类型,需要用户自己重载>>和 << ❖ 只能重载为友元或普通全局函数 ❖ 格式: istream & operator>>(istream &,自定义类 &); ostream & operator<<(ostream &,自定义类 &);
10.4 运算符的成员函数重载与友元函数重载
成员函数重载与友员函数重载的区别
❖ 声明与定义的形式不同 ❖ 参数数目不同
this指针的有无,导致参数个数不同。
❖ 编译器的解释不同 ❖ 对操作数的处理能力不同(体现在双目上) ❖ 用友员重载需要改变操作数自身的运算符时,如
++、--、+=等,参数必须采用传递引用的形式。 若它们重载成成员函数,需要被修改的操作数是 通过this指针传递的,对其修改没有问题。
10.2 运算符重载的方法
❖ 定义一个重载运算符的函数。
❖ 在需要执行被重载运算符时,系统自动调用该函 数,以实现相应的运算。
❖ 函数格式:
函数名
函数类型 operator 运算符名称@(形参列表) { 对运算符的重载处理 }
❖ 调用方法:显示的调用函数; 按运算符的使用方法写成表达式。
例:重载“+”运算符,应用于复数类
可实现连续输出、输入信息。 ❖ 函数的功能是通过调用COUT 和CIN 对标准类型输入输出功能来实现
的。
10.8 不同类型数据间的转换
转换构造函数 将一个其它类型的数据转换成一个指定的类的对象。即创建一个对象。
❖ 只有一个形参。参数的类型是需要转换的类型。 ❖ 格式:构造函数的一般格式,形参类型为要转换的其它类型。 ❖ 使用:类名(指定类型的数据); 类型转换函数
= 、() 、 [ ] 、 类型转换函数。
❖ 只能重载为友元:>> 、 << 。
❖ 一般双目用友元,单目用成员。 ❖ 有时使用友元更好(尤其是为类定义了类型转换时 )。
10.5 ~10.6 几个典型运算符的重载
重载单目、双目运算符
❖ 赋值运算符=的重载(为了实现连续赋值,要返回该对象) ❖ 自增++与自减--运算符的重载 ❖ 重载流插入>>和流提取<<运算符(友元)
借用其它功能的运算符。
❖ 4、不能改变优先级;不能改变结合性;不能改变
运算符所需操作数的个数;运算符重载函数不能 有默认的参数。交换律不适用
❖ 5、重载的运算符的操作数必须有自定义类型。其参数至 少应有一个是类对象(或类对象的引用)。以防止用户为 预定义类型重载运算符。 运算符被重载时,只是相对一特定类被重载,在特定 的环境下作出特定的解释。当离开这个特定环境后,具有 原来的意义(系统定义);