【C++】基础语法:赋值运算符重载

前言

今天来学习一下 运算符重载

引入

之前我们创建了日期类Date 那么我们如何比较两个日期类的大小呢 以及如何更快捷的比较两个日期类对象

下面是比较两个日期类的代码

bool DateCompare1(const Date& x, const Date& y)
{
	return x._year == y._year
		&& x._month == y._month
		&& x._day == y._day;
}

//bool DateLess(const Date& x, const Date& y)
bool DateCompare2(const Date& x, const Date& y)
{

	if (x._year < y._year)
	{
		return true;
	}
	else if (x._year == y._year)
	{
		if (x._month < y._month)
		{
			return true;
		}
		else if (x._month == y._month)
		{
			return x._day < y._day;
		}
	}

	return false;
}

在比较两个日期类对象的时候还是要写的比较多 并且不易读

	cout << DateCompare1(d1, d2) << endl;
	cout << DateCompare2(d1, d2) << endl;

定义

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

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

函数原型:返回值类型 operator操作符(参数列表)

那么上面的比较就可以简写为

bool operator==(const Date& x, const Date& y)
bool operator<(const Date& x, const Date& y)

d1 < d2;
d1 == d2;

注意:

  • 不能通过连接其他符号来创建新的操作符:比如operator@
  • 重载操作符必须有一个类类型参数
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
  • 注意以下5个运算符不能重载。这个经常在笔试选择题中出现。
    【C++】基础语法:赋值运算符重载_第1张图片
    .* 这个操作符很少用

提示:
此处我们只能把运算符重载函数写在类里面
因为类成员是私有的 在类外无法访问 其他的方法之后再讲

赋值运算符重载

赋值运算符重载格式

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

补充:
对于第三点可以写

Date& operator=(const Date& d)
{
	if(this != &d)
	{
		//...
	}
}
  1. 赋值运算符只能重载成类的成员函数不能重载成全局函数*(只有赋值运算符是特殊唯一的)*
    原因:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。
  2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝。
    注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符
    重载完成赋值。
    与拷贝构造类似

总结与比较

还是最初的那张图
【C++】基础语法:赋值运算符重载_第2张图片

结语

关于赋值运算符重载以及相关知识就介绍到这里了 希望对你有帮助 我们下次见~~

你可能感兴趣的:(C++知识点,c++,java,数据库)