【C++】赋值运算符重载

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤

📃个人主页 :阿然成长日记 👈点击可跳转

📆 个人专栏: 🔹数据结构与算法🔹C语言进阶

🚩 不能则学,不知则问,耻于问人,决无长进

🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

前言:

C++为了增强代码的可读性引入了运算符重载。运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以像内置类型一样可以直接使用运算符进行操作。运算符重载,就是对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象。

例如:两个日期的比较,肯定不能单纯的使用==去比较,==只能运算两个标准类型的值。所以这时我们可以写一个函数来实现日期的比较。并使用运算符重载的方式给这个函数,名命名为'-'.这样我们就可以使用 ==实现像是标准类型那般使用。

一、赋值运算符重载的定义

函数名字:关键字operator后面接需要重载的运算符符号

函数格式:

cpp 复制代码
<返回类型说明符> operator <运算符符号>(参数列表)
{
     函数体
}

二、赋值运算符重载的使用

如下,比较两个日期函数。

cpp 复制代码
#include<iostream>
using namespace std;

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
public:
//private:
	int _year;
	int _month;
	int _day;
};

bool operator==(const Date& x1,const Date& x2)
	{
		return x1._year == x2._year
			&& x1._month == x2._month
			&& x1._day == x2._day;
	}
int main()
{
	//创建两个对象,并赋初始值
	Date d1(1919, 9,9);
	Date d2(1919,9,9);
	if (d1 == d2) {
		cout << "true" << endl;
	}
	else {
		cout << "false" << endl;
	}
	return 0;
}


注意点:

  • 由于是自定义类型传参,我们若是使用传值传参,会额外调用一次拷贝构造函数,所以函数的参数最好使用引用传参
  • 上述代码中类的成员变量访问限定符是public。否则下面的函数无法访问到。可以使用友元函数就可以访问到函类中的private型变量了。
  • 对于参数,在函数体内不会对其进行修改,所以最好加上const进行修饰。
  • bool operator==(const Date& x1,const Date& x2)定义在类外,是全局函数,参数中不存在this指针。

三、使用细节

  • 不能通过连接其他符号来创建新的操作符:比如operator@,只能是运算符
  • 重载操作符必须有一个类类型参数。
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐
    藏的this
  • .* :: sizeof ?: . 注意以上5个运算符不能重载。

四、运算符重载的参数问题

1.重载操作符必须有一个类类型参数。

2.函数如果在类中,那么它的参数中才有会有隐藏的this指针(它会抢占最左边位置)。但是,函数如果定义在类外,就成一个全局函数,就没有this指针了。

3.一般的运算符写成成员函数。但是流运算符函数要写在类外,在类中有声明,这样就要自己给参数,没有this指针,就可以写成cou<<d1;在传参时,有一个默认的隐藏的this指针参数。会影响顺序。

例如:

下面的代码是写在类外的,所以两个参数都是自己手动传的。

cpp 复制代码
bool operator==(const Date& x1,const Date& x2)
	{
		return x1._year == x2._year
			&& x1._month == x2._month
			&& x1._day == x2._day;
	}

将代码写进类中。

cpp 复制代码
bool operator==(const Date& x2)
	{
		return _year == x2._year
			&& _month == x2._month
			&& _day == x2._day;
	}

参数传入

相关推荐
郝学胜-神的一滴6 分钟前
中级OpenGL教程 026:Assimp库从编译到实战全攻略
c++·unity·游戏引擎·图形渲染·unreal engine·opengl
爱喝水的鱼丶10 分钟前
SAP-ABAP:SELECT查询性能优化基础——索引匹配、条件顺序与缓冲机制利用技巧
数据库·性能优化·select·sap·abap·开发交流·交流学习
程序员天天困11 分钟前
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
java·jvm·后端
今夜有雨.12 分钟前
C++JSON 解析器
c++·笔记·后端·学习·json
zhoupenghui16820 分钟前
ClickHouse merge引擎详解以及应用
数据库·clickhouse·merge·mergetree
用户31268748772021 分钟前
@Autowired 注入的是代理对象?Spring AOP 代理选择原理一次讲透
java·spring
@insist12325 分钟前
信息系统管理工程师-任务、标准、EDM 过程与关键域
java·大数据·数据库
程序喵大人30 分钟前
【C++进阶】STL容器与迭代器 - 04 list 和 forward_list 用节点换稳定位置
开发语言·c++·list
木子杳衫36 分钟前
Java高级进阶 | 单元测试JUnit + 反射机制实战详解
java·junit·单元测试
qq_3660862241 分钟前
关于接口路径中中文值解码问题
java·开发语言·数据库