- 1、本文档共41页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章运算符重载;
4.1 什么是运算符重载
(operator overloading)
;c.real=real+c2.real;
c.imag=imag+c2.imag;;4.2 运算符重载的方法;说明:
重载运算符是由相应函数实现的,何必对运算符重载呢?
答:类的声明和使用是分离的,所以对用户方便。
运算符重载后,其原有的功能仍保留;
C ++允许用户自定义新类型,所以必须允许运算符重载,以扩大C++已有运算符的使用范围,使其能作用于类对象,进行赋值运算、关系运算、逻辑运算和输入输出运算。
C++没有为类对象重新定义一批新运算符,而是,对现有运算符进行重载。;4.3重载运算符的规则;不允许重载的运算符只有5个:
.(成员访问运算符) .*(成员指针访问运算符)
::(域运算符) sizeof(长度运算符)
?:(条件运算符)
⑶重载不能改变运算符运算对象的个数;
⑷重载不能改变运算符的优先级;
⑸重载不能改变运算符的结合性;
⑹重载运算符的函数不能有默认的参数;(否则就可改变参数个数)
⑺重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象;;⑻用于类对象的运算符一般必须重载,但运算符“=”和“”例外;
⑼应当使重载运算符的功能类似于该运算符作用于标准类型数据时实现的功能。
⑽运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也非类的友元函数的普通函数。;例4.3将运算符“+”重载为复数加法,重载函数不作为成员函数,放在类外,作Complex的友元函数。;运算符重载函数可以是:
⑴类的成员函数
可以通过This指针自由地访问本类的数据成员,少写一个函数参数。
成员函数定义:
Complex Complex::operator + (Complex c2)
{return Complex(real+c2.real,imag+c2.imag);}
调用: c3=c1+c2;
要求:第一个参数c1是一个类对象,而且与运算符重载函数的返回类型相同。
将一个复数和一个整数相加,如c1+i;
成员函数定义:
Complex Complex::operator + (int i)
{return Complex(real+i,imag);}
调用: c3=c2+i;
不能写成: c3=i+c2;此时只能将重载函数作为友元函数,不能作为成员函数。;⑵类的友元函数
双目运算符重载为友元函数??,在函数的形参表列中必须有两个参数。
声明:friend Complex operator+ (Complex c1,Complex c2);
友元函数定义:
Complex operator+ (Complex c1,Complex c2)
{return Complex(c1.real+c2.real, c1.imag+c2.imag);}
调用:c3=c1+c2;
形参的顺序任意,不要求第一个参数必须为类对象。要求运算符左侧的操作数与第一个参数对应,运算符右侧的操作数与第二个参数对应。
将一个复数和一个整数相加,如i+c1;
声明:friend Complex operator+ (Complex i,Complex c);
友元函数定义:
Complex operator+ (Complex i,Complex c)
{return Complex(i+c.real, c.imag);}
调用:c3=i+c2;;注意:数学上的交换律不适用
调用形式为:c3=c2+i时,再重载运算符“+”为:
Complex operator+ (Complex c,Complex i)
{return Complex(i+c.real, c.imag);}
这样, c3=c2+i和c3=i+c2都合法,编译系统会根据表达式的形式选择调用与之匹配的运算符重载函数。
一般地,单目运算符重载为成员函数,双目运算符重载为友元函数。
⑶既非类的成员函数也非类的友元函数的普通函数
普通函数不能访问类的私有成员,所以很少使用。;#include iostream
using namespace std;
class String //String 是用户自己指定的类名
{public:
String(){p=NULL;} // 默认构造函数
String(char *str); // 构造函数
void display();
private:
char *p;
};
String::String(char *str)
{p=str;}
void String::display()
{coutp;};#include ios
文档评论(0)