【C++】运算符重载——整形类

CInt类

class CInt
{
public:
	CInt(int val)
		:mvalue(val)
	{}
private:
	int mvalue;
};
int main()
{
	int arr[] = { 1, 321, 4, 3, 54, 7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	
	for (CInt i = 0; i < len; i++)
	{
		std::cout << arr[i] << " ";
	}
	std::cout << std::endl;
	return 0;
}

1、写如上的一个代码,用CInt类代替int类型,那么,i 就变成了一个对象,此时

  • i < len是自定义类型和内置类型之间的比较,是无法进行的
  • i++是对象++,也无法进行
  • arr[i]中括号中是一个对象,也无法进行

运算符重载

1、作用:使自定义类型能满足和内置类型相同的逻辑
2、我们现在只考虑对单目运算符和双目运算符的重载。

< 小于运算符重载

bool operator< (int rhs)//thiscall
	{
		return mvalue < rhs;
	}

因为在类中,使用的是thiscall调用约定,此时,i < len,对象为左操作数,所以可以使用this指针接收左操作数设置一个接收右操作数的形参即可。
现在,i < len就相当于i.operator<(len)

++运算符重载

1、++分为前置++和后置++;例如:++i或者i++
前置++:本身先相加,返回本身
后置++:本身生成一个临时量,先使用临时量,表达式结束后,本身++,返回的是临时量
2、运算符重载机制不能改变原有运算符的逻辑
3、前置++

CInt& operator++()//前置++
{
	++mvalue;//内置类型
	return *this;
}

为什么返回值是CInt&而不是CInt,因为返回值如果是CInt,会有临时对象的生成,++后的值会直接赋给临时对象,并不是返回它本身。
4、后置++

	const CInt operator++(int)//后置
	{
		CInt tmp(*this);//用this指针先拷贝构造一个备份
		mvalue++;
		return tmp;
	}

以类类型返回,本身就有临时量的生成,再加上const,就变成了常量返回。

[ ]运算符重载

1、首先,我们要知道arr[i]i[arr]是相同的意思,只不过我们习惯使用arr[i]
2、如果写成i[arr]的运算符重载

	int& operator[](int* parr)
	{
		return parr[mvalue];
	}

此时,隐藏的this指针接收对象i,parr接收数组的首元素地址。
返回值接收的是元素的引用,所以此时对应的调用点应写为i[arr]
3、如果写成arr[i]的运算符重载

	operator int()//类型的重载不需要参数
	{
		return mvalue;
	}
  • 不仅能重载运算符,还能重载类型
  • 此时,编译器在调用点发现[ ]中应该需要的是一个以int类型当下标的数据,但是现在i是一个对象,所以在对象内部找针对于的该类型的重载函数,则调用点实际上进行的操作就是arr[i.operator int()]
  • 不建议大家用类型的重载,是不可控的

整体代码

class CInt
{
public:
	CInt(int val)
		:mvalue(val)
	{}
	bool operator<(int rhs)//thiscall
	{
		return mvalue < rhs;
	}
	
	CInt& operator++()//前置++
	{
		++mvalue;//内置类型
		return *this;
	}
	
	const CInt operator++(int)//后置
	{
		CInt tmp(*this);
		mvalue++;
		return tmp;
	}

	int& operator[](int* parr)
	{
		return parr[mvalue];
	}
	/*operator int()
	{
		return mvalue;
	}*/
private:
	int mvalue;
};
int main()
{
	int arr[] = { 1, 321, 4, 3, 54, 7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	/*
	i < len
	i.operator<(len)
	*/
	for (int i = 0; i < len; i++)
	{
		//std::cout << i[arr] << " ";
		std::cout << arr[i] << " ";
		//std::cout << arr[i.operator int()] << " ";
	}
	std::cout << std::endl;
	return 0;
}

你可能感兴趣的:(C++,运算符重载,CInt类)