c++操作符重载

一、运算符重载:

1、定义:

重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的 操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参 数目与操作符的操作数目相同,使用运算符重载可以提高代码的可读性   返回值 operator 操作符(参数列表)

(1)可以重载的运算符(除了不可重载的运算符,其余的操作符都是可以重载的操作符)

(2)不可以重载的运算符

2、赋值运算符:

(1)编译器把运算符合成了,编译器可以识别两个对象,d2=d1把d1中的内容拷贝到d2,类似于拷贝构造函数,把一个对象的内容原封不动的拷贝到另一个对象。有的情况会产生问题:若是两个对象公用同一块内存空间,一个空间销毁,会使另外一个空间成为野指针。还存在内存泄漏

(2)显式的重载赋值运算符

1‘、使用类的成员函数来写,有一个隐藏的this指针,看起来只有一个参数,实际上有两个参数。不论是返回值还是参数的位置,若是给定一个类类型的对象,最好给成引用,引用的方式不用创造临时对象。赋值操作符右操作数不发生改变,所以参数最好用const修饰

class Date
{
public:
	Date(int year=290,int month=11,int day=1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int):" << this << endl;
	}
	Date(const Date &d)
		:_year(d._year)
		,_month(d._month)
		, _day(d._day)
	{
		cout << "Date(const Date &):" << this << endl;
	}
	void operator=(const Date&d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
private:
	int _year;
	int _month;
	int _day;
 };
 
int main()
{
	Date d1(122, 3, 4);
	Date d2;
//Date d3(1223,4,5);
//d1=d2=d3;
	d2 = d1; //d2.operator=(d1);//Date::operator=(&d2,&d1)d1:通过参数压栈传入,d2通过ecx寄存器传入
   	return 0;
}
 

缺陷不能连续赋值:如:d1=d2=d3:d3赋值给d2,d2赋值给d1:d1.operator=(d2.operator=(d3))

方式2:返回左操作数

Date& operator=(const Date&d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		return *this;//d外部实参的引用,this是当前对象,
		//this和d的生命周期都比函数的生命周期长,但是我们返回this指针,因为
		//需要返回左操作数
	}

缺陷:不能自己给自己赋值,如:d1=d1和Date d4=&d1;……d1=d4;

方式三:判断自己给自己赋值,即this与当前的地址是否相同

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

3、注意

(1)不能通过连接其他符号来创建新的操作符:比如operator@

(2)重载操作符必须有一个类类型或者枚举类型的操作数

构造一个加法的函数位于全局范围(普通的成员函数)内,这个加法函数有几个参数,给出几个参数,没有隐式的this指针)

1‘直接返回左操作数加右操作数不成立,需要给定一个自定义类型

class Date
{
public:
	Date(int year=290,int month=11,int day=1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int):" << this << endl;
	}
	Date(const Date &d)
		:_year(d._year)
		,_month(d._month)
		, _day(d._day)
	{
		cout << "Date(const Date &):" << this << endl;
	}
private:
	int _year;
	int _month;
	int _day;
 };
int operator + (int left, int right)
{
	return left + right;
}
因为+可以直接处理整形的加号,应该给一个自定义的类型:枚举就是自定义类型
enum DATA{ ONE, TWO, THREE };
int operator + (int left, DATA right)
{
	return left + right;
}

猜你喜欢

转载自blog.csdn.net/xuruhua/article/details/80668257