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

文章目录

  • 赋值运算符重载
    • 1. 运算符重载
    • 2. 赋值运算符重载

赋值运算符重载

默认情况下C++不支持自定义对象类型使用运算符

1. 运算符重载

函数名:operator + 运算符号

返回值:根据函数具体分析,如果是>/<,可能是bool,如果是-/+,可能是int

参数:操作符有几个操作数,参数就有几个

例子:比较年月日

bool operator>(const Date& d1, const Date& d2)
{
	if (d1._year > d2._year)
	{
		return true;
	}
	else if (d1._year == d2._year && d1._month > d2._month)
	{
		return true;
	}
	else if (d1._month == d2._month && d1._day > d2._day)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	Date d1;
	Date d2(d1);
    d1 > d2;//d1.operator(d2);
	cout << (d1 > d2) << endl;//这里<<优先级比<大

	return 0;
}

这里可以使用的话要将,内置类型设置为public

但这样影响了整个类的封装

所以将其放在类里面,不放在全局变量里面,但类里面成员函数都有一个默认的参数,this

bool operator>(const Date& d)

包含 Date* const this,const Date& d

最终修改结果是

bool operator>(const Date& d)
{
	if (this->_year > d._year)
	{
		return true;
	}
	else if (this->_year == d._year && this->_month > d._month)
	{
		return true;
	}
	else if (this->_month == d._month && this->_day > d._day)
	{
		return true;
	}
	else
	{
		return false;
	}
}

但我们一般默认this的话不用写

直接使用其成员变量就代表this->_year = _year

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

规定:

  • 必须是运算符,不能是其他符号
  • 这里参数必须含有类类型,不能都是内置类型
  • 函数要符合运算符的逻辑
  • 操作数有几个形参就有几个
  • :: sizeof ?: . .* 不能重载
  • 作为类成员的重载函数时,操作符有一个默认的形参this,第一个输入的参数
  • 全局和类同时存在运算符函数,优先调用类里面的成员函数

2. 赋值运算符重载

实现 = 赋值运算

注意这里的返回值,因为最后是赋值给一个类,所以返回值也是类

Date operator=(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
    
    return *this;//返回需要赋值的对象本身
}

int main()
{
    Date d1;
    Date d2 = d1;
    return 0;
}

但这样会使用一次拷贝构造

所以改为用引用,返回值从Date,改为Date&


场景分析:

【C++】赋值运算符重载_第1张图片

都使用引用,运行代码【C++】赋值运算符重载_第2张图片结果是 打印调用操作符函数,说明引用的话不会调用拷贝构造函数


**下一个场景:**将参数中引用改成传值

【C++】赋值运算符重载_第3张图片


注意区分:

【C++】赋值运算符重载_第4张图片

拷贝构造针对一个需要初始化的对象的实例化,所需要已经存在的对象

赋值运算符重载是已经创建好的两个对象之间进行赋值


为了防止自己给自己赋值

加一个条件判断

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

你可能感兴趣的:(C++,programing,langua,c++,开发语言,后端)