运算符重载----赋值运算符重载

运算符重载

是否要重载运算符,考虑这个运算符对这个类是否有意义

本质是函数调用,内置类型编译器直接比,自定义就去找对应类内重载的函数
如果定义在类外,需要访问私有的成员函数,只能将成员函数权限变为Public或者友元(非必须不用)
,所以一般重载函数都写在类内

底层看到都是一样的函数调用在这里插入图片描述

定义
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
注意:
不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型参数
用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this

.在这里插入图片描述

操作符是几个操作数,重载函数就有几个参数
一般除了三目运算符都是2个

隐含this指针访问私有成员变量

显示写出this指针,但其实不需要写,编译器自动
在这里插入图片描述

bool operator<(const Date& x2)
	{
		if (_year < x2._year)
		{
			return true;
		}
		else if (_year == x2._year && _month < x2._month)
		{
			return true;
		}
		else if (_year == x2._year && _month == x2._month && _day < x2._day)
		{
			return true;
		}
		return false;
	}

运算符覆写函数设置在类内解决访问私有成员变量

运算符覆写函数设置在类外,要访问私有成员变量需要公有成员变量权限,或者友元
在这里插入图片描述

运算符重载函数设置在类内,就解决了访问权限问题
在这里插入图片描述

在这里插入图片描述
底层同样都是调用类内重载函数,实际上用肯定用d1 < d2
在这里插入图片描述

运算符重载函数如果设置在类外,也不是必须设置到类内,只是类内比较方便
在这里插入图片描述

赋值运算符重载

  1. 赋值运算符重载格式
    参数类型:const T&,传递引用可以提高传参效率
    返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
    检测是否自己给自己赋值
    返回*this :要复合连续赋值的含义

  2. 赋值运算符只能重载成类的成员函数不能重载成全局函数

  3. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝
    注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。
    在这里插入图片描述
    首先搞清楚 d1 = d2; 并不是拷贝构造,而是去调用运算符重载函数

其次就是 d1 = d2 = d3这种连等的情况

i = 1; 返回值是1—为赋值后的结果

>此写法不支持连续赋值,没有返回值
void operator=(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}

返回值的结果应该是如图所示
在这里插入图片描述
正确写法
在这里插入图片描述
精华的点就是 return *this 为什么能返回,是*this因为出了函数作用域还在,在main函数里是个实例化对象

还有一种情况是 d1 = d1 ;
自己给自己赋值,可以允许,也可以不允许

Date& operator=(const Date& d)
{
	if (this != &d)
	{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	}
	return *this;
}

还要注意默认生成的会和类外自己写的冲突,所以只能定义在类内
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值