Chapter 9 运算符重载

目的:运用运算符重载

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

10.1 什么是运算符重载

1.重载的定义:就是重新赋予新的定义

2.函数重载:就是对一个已有的函数赋予新的含义,使之实现新的功能,因此,同一个函数名就可以用来代表不同功能的函数,也就是一名多用

3.例如:“<<”是C++的位运算中的位运算符(左移),但在输出操作中又是与流对象cout配合使用的流提取运算符,“>>”也是位运算符(右移),但在输入操作中又是与流对象cin配合使用的流提取运算符,这就是运算符重载

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

10.2 对运算符重载的方法

1.运算符重载的方法是定义一个重载运算符的函数

2.运算符重载实质上是函数重载

3.形式: 函数类型 operator 运算符名称(形参表){对运算符的重载处理}

a:operator是关键词

b:函数名是由operator和运算符组成

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

10.3 重载运算符规则

1.C++不允许用户定义新的运算符,只能对已有的C++运算符进行重载

2.C++允许重载的运算符有很多,但只有5个运算符不能重载:

3.重载不能改变运算符运算对象(即操作数)的个数,例如:“+、-、*、/”都是两个操作数,我们就不可能用重载是他改变为一个操作数或者三个操作数

4.重载符不能改变运算符的优先级别顺序

5.重载不能改变运算符的结合性,例如:赋值运算“=”是自右至左结合,重载后仍然是自右至左

6.重载运算符的函数不能有默认参数

7.重载运算符必须和用户定义类型的对象一起使用,其参数至少有一个类对象(或类对象的引用),也就是说,不能全是C++的标准类型

8.用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载

9.从理论上说,可以将一个运算重载为执行任意的操作,应当使用重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能

10.如果运算符函数重载为成员函数,它的第1个参数必须是本类的对象,当第1个操作数不是类对象时,不能将运算符函数重载为成员函数,如果将运算符“+”函数重载为类的成员函数,交换律不适用,所以因为这些原因,是将双目运算符函数重载为友元函数,单目运算符则多重载为成员函数

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

10.4 运算符重载函数作为类成员函数和友元函数(重大区别在后面的参数个数)

1.对运算符重载的函数有两种处理方式:

a:把运算符重载的函数作为类的成员函数

b:运算符重载的函数不是类的成员函数(可以是一个普通函数),在类中把它声明为友元函数

class T
{
  public:
    int x;
    int y;
    friend T operator +(T & x1,T & x2);//友元函数要有两个参数
    T operator +(T & x1);//若是成员函数只有一个参数

}

2.补充:

a:运算符重载的函数作为类的成员函数:如果将运算符重载函数作为成员函数,他可以通过this指针自由地访问本类的数据成员,因此可以少些一个参数

b:在类中把它声明为友元函数:双目运算符重载为友元函数时,由于友元函数不是该类的成员函数,因此在函数的形参表列中必须有两个参数,不能省略

3.重载单目运算符

class T
{
   T operator ++();//作为成员函数可以没有参数
   friend T operator ++(T&);//作为友元函数
}

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

10.7 重载流插入运算符“<<”和流提取运算符“>>”

1.“<<”和“>>”重载的函数形式

a:形式一:istream & operator >> (istream &, 自定义类 &)

b:形式二: ostream & operator << (ostream &, 自定义类 &)

2.只能将重载“>>”和“<<”的函数作为友元函数,而不能将他们定义为成员函数

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

10.8 不同类型数据间的转换

1.有两种转换类型:显示类型转换+隐式类型转换

a:隐式类型转换:系统自动的,用户可以不管

b:显示类型转换:用户可以进行转换,形式:类型名(数据) 或者 (类型名)数据

2.用转换构造函数将其他类型数据转换为类对象

a.温习一下几种构造函数

(1):默认构造函数,以Complex类为例,函数原型的形式为

Complex();//没有参数

(2):用于初始化的构造函数,函数原型的形式为

Complex(double r,double i);//形参列表中一般有两个以上的参数

(3):用于复制对象时复制构造函数,函数原型的形式为

Complex (Complex & c)//形参是本类对象的引用

b:转换构造函数的作用:将一个其他类型的数据转换成一个类对象

注意⚠️:转换构造函数只能有一个参数,如果有多个参数,他就不是转换构造函数,例如:Complex (double r){real =r;imag=0;}

3.类型转换函数:它的作用是将一个类对象转换成另一类型的数据

a:形式:operator 类型名() {实现转换的语句}

b:类型转换函数只能作为成员函数,因为转换的主体是本类的对象

共同学习,欢迎指正!

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值