考试题型:主要在选择题、填空题、程序填充题、,比分占7%左右。
第一节 运算符重载的概念
1、运算符重载就是给已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据时产生不同的行为。运算符重载的目的是使得运算符也能够用来操作对象。
2、C++允许重载大多数运算符,不允许重载的有:
(1)成员访问运算符 .
(2)成员指针访问运算符 .*,->*
(3)域运算符 ::
(4)长度运算符 sizeof
(5)条件运算符 ?:
(6)预处理符 #
用于类运算符的运算符通常都要重载
= 默认重载为成员变量的复制,& 默认重载为返回任何类对象的地址。
3、运算符重载的实质是编写运算符为名称的函数,使用运算符的表达式就被解释为对重载函数的调用。运算符重载函数的格式:
返回值类型 operator 运算符(形参表)
{
函数体
}
4、运算符可以被重载为全局函数(通常是类的友元),参数个数为运算符的操作数个数
也可以重载为类的成员函数(一般倾向于重载为类的成员函数),参数个数为运算符操作个数减1
5、运算符重载的规则
(1)重载后运算符的含义应该符合原有用法习惯
(2)不能改变运算符原有的语义,包括优先级和结合性
(3)运算符重载不能改变运算符操作数的个数及语法结构
(4)不能创建新的运算符
(5)重载“()”、“[ ]”、“->”或者复制运算符“=”时,只能将它们重载为成员函数,不能重载为全局函数
(6)运算符重载不能改变该运算符用于基本数据类型对象的含义
(7)重载运算符为友元函数
运算符重载表示为友元函数时,两个操作数都要列出。
第二节 重载赋值运算符
1、对任一类X,如果用户没有自定义的赋值运算符函数,那么编译系统将自动地为其生成一个默认的赋值运算符函数,默认赋值运算符函数重载形式如下:
X&X :: operator = (const X & source) { 成员间赋值 }
2、重载赋值运算符解决赋值不兼容问题,应该注意两点:
(1)赋值运算符必须重载为成员函数
(2)为了保持与通常意义下的赋值运算符的功能相一致,应该让重载的赋值运算符依然能连续使用,所以operator=函数通常要返回引用
(3)浅拷贝和深拷贝
浅拷贝:同类对象之间可以通过赋值运算符“=”相互赋值,如果没有经过重载,“=”的用作就是讲赋值号右侧对象的值意义赋值给左侧的对象,这相当于值的拷贝,称为浅拷贝。
深拷贝:重载赋值运算符,赋值语句的功能是将一个对象中的 指针成员变量指向的内容复制到另一个对象中指针成员变量指向的地方。
第三节 重载流插入运算符和流提取运算符
1、cout<< 流插入运算符 cin>> 流提取运输符
重载使之用于自定义的类对象,只能重载为类的友元
重载流插入运算符的一般格式:
ostream &operator<<(ostream &output,类名&对象名)
{
···
return output
}
重载流提取运算符的一般格式:
istream &operator>>(istream &input,类名&对象名)
{
···
return input
}
第四节 重载强制类型转换运算符
1、类型转换运算符:在C++中,类型的名字(包括类的名字)本身也是一种运算符,既强制类型转换运算符,是单幕运算符,只能重载为成员函数,经过重载后,“(类型名)对象”,就等价于“对象.operator 类型名()”
2、重载强制类型转换运算符时,不需要指定返回值类型,因为返回值类型是不确定的
第五节 重载自增自减运算符
1、自加++、自减--运算符可以重载,但有前置和后置之分,用于对象也是如此
2、C++规定,在重载“++”、“--”时,允许写一个增加了无用int类型的版本,编译器处理“++”、“--”前置表达式时,调用参数个数正常的重载函数;处理后置的表达式时,调用多出一个参数的重载函数。重载的后置运算符的形参表中有一个int类型的参数,它仅表明重载的是后置运算符,不需要定义形参变量,在函数体重也不必使用它。