栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[C++笔记](赋值)运算符重载

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[C++笔记](赋值)运算符重载

#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;

//运算符重载
//C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,
//,也具有其返回值类型、函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
//函数名字为:关键字operator后面接需要重载的运算符符号。
//函数原型:返回值类型 operator操作符(参数列表)
//*注意:
//-不能通过连接其他符号来创建新的操作符:比如operator@
//-重载操作符必须有一个类类型或者枚举类型的操作数
//-用于内置类型的操作符,其含义不能改变,例如:内置的整型 + ,不能改变其含义
//-作为类成员的重载函数时,其形参看起来比操作数数目少1,成员函数的操作符有一个默认的形参this,
//,限定为第一个形参
//-重载操作符大部分情况下是在类里定义成员函数,是为了方便解决访问私有成员变量的问题,
//,因此若在全局与类内都定义了同样的重载,编译器一般会优先调用类里的
// .*  ::  sizeof  ?:  .注意以上5个运算符不能重载。这个知识点经常在笔试选择题中出现。
//注意 *可以重载而.*不行

//赋值运算符重载主要有四点:
//1.参数类型
//2.返回值
//3.检测是否为自我赋值
//4.返回*yhis
//5.一个类若未显式定义赋值运算符重载,编译器也会生成一个
//	编译器默认生成的赋值重载功能与拷贝构造类似:
//	1.对内置类型成员回完成字节序值拷贝,即浅拷贝(比如日期类就可以直接用默认生成的)
//	2.对自定义类型成员,会调用其自身的operator=
//对于栈等浅拷贝不能满足需求的类型,需要自己实现赋值重载
//动态开辟的"基本"都需要深拷贝(智能指针和迭代器不需要)

//总结:
//构造和析构的处理机制基本类似
//拷贝构造和赋值重载的处理机制基本类似

class Date {
public:
	Date(int year = 0, int month = 1, int day = 1) {//构造函数
		_year = year;
		_month = month;
		_day = day;
	}
	//返回值类型 operator操作符(参数)
	//返回值类型取决于操作符运算后返回的值的类型,参数数量取决于操作符的操作数数量
	bool operator>(const Date& d) {
		//成员函数会多一个隐含的参数:this指针,所以参数不能写成(const Date& d1, const Date& d2)
		//这里实际上是(Date* const this,const Date& d),d1传给this,d2传给d
		//然后一般不会写出this,所以if (this->_year > d._year)变成if (_year > d._year)
		if (_year > d._year) {
			return true;
		}
		else if (_year == d._year && _month > d._month) {
			return true;
		}
		else if (_year == d._year && _month == d._month && _day > d._day) {
			return true;
		}
		else {
			return false;
		}
	}

	//实现d1=d3赋值
	Date& operator=(const Date& d) {//d1是this,d是d3的别名,最后返回d1
		if (this != &d) {//优化极端情况下自我赋值的效率:判断左右操作数地址,相等则跳过操作
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;//返回给左操作数,不能直接返回this.
		//另,出作用域*this还在,传引用减少拷贝.
	}

private://回顾:访问限定符限定的是来自类外的访问
	int _year;
	int _month;
	int _day;
};

int main() {
	Date d1(2022,4,9);
	Date d2(2022, 12, 31);
	Date d3(2022, 4, 12);
	//要获取某日期到另一日期的天数,不能直接d2-d1,C++默认不支持自定义对象使用运算符
	cout <<(d1>d2)<< endl;//编译器会检测有无重载运算符,若有则调用,无则报错
	
	//拷贝构造-用已存在的对象初始化马上要实例化的对象
	Date d4(d1);
	Date d5 = d1;
	//赋值重载-两个已经存在的对象之间进行赋值拷贝
	d1 = d3;//d1.operator=(d3);

	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号