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

在这里插入图片描述


个人主页 :阿然成长日记 点击可跳转
个人专栏: 数据结构与算法C语言进阶
不能则学,不知则问,耻于问人,决无长进

文章目录

  • 前言:
  • 一、赋值运算符重载的定义
  • 二、赋值运算符重载的使用
  • 三、使用细节
  • 四、运算符重载的参数问题

前言:

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

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

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

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

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

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

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

#include
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;
}

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

注意点:

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

三、使用细节

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

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

1.重载操作符必须有一个类类型参数。
2.函数如果在类中,那么它的参数中才有会有隐藏的this指针(它会抢占最左边位置)。但是,函数如果定义在类外,就成一个全局函数,就没有this指针了。
3.一般的运算符写成成员函数。但是流运算符函数要写在类外,在类中有声明,这样就要自己给参数,没有this指针,就可以写成cou< 例如:
下面的代码是写在类外的,所以两个参数都是自己手动传的。

bool operator==(const Date& x1,const Date& x2)
	{
		return x1._year == x2._year
			&& x1._month == x2._month
			&& x1._day == x2._day;
	}

将代码写进类中。

bool operator==(const Date& x2)
	{
		return _year == x2._year
			&& _month == x2._month
			&& _day == x2._day;
	}

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

你可能感兴趣的:(C++基础,c++,java,数据库)