C++重载操作符

久未见 提交于 2019-12-02 12:14:54

1.重载操作符的必要性

C++的数据类型分为基础数据类型构造数据类型,基础数据类型客户直接完成算数运算,但是比如类这样的新构造的数据类型是无法通过基本运算符进行算数运算的。此时,便需要重载操作符。

2.形式和规则

大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

Box operator+(const Box&);

如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数,如下所示:

Box operator+(const Box&, const Box&);

2.1一元运算符

只对一个操作数进行操作,这里包括:
一元减运算符,即负号( - );递增运算符( ++ )和递减运算符( – )
递增运算符包括前置和后置两种情况,区别如下:
前置++:即++运算符位于操作数的前面,例如:++i;
后置++:即++运算符位于操作数后面,例如:i++;
1、前置++重载时没有参数,而后置++重载时有参数。不会使用其参数,仅仅是区分用。
2、前置++需要返回引用,因为重载自加运算符后可以返回对象的引用, 以方便在表达式中连续使用。而后置++返回的不是引用,所以不能进行连续使用。返回自增后的值,且返回的是一个左值
3.后置运算符返回的值是temp,需要注意。因为是后加。返回自增前的值,且返回的是一个右值

#include <iostream>
using namespace std;

class Point
{
private:
	int x;              
	int y;            
public:
	
	Point() { // 所需的构造函数
		x = 0;
		y = 0;
	}
	Point(int f, int i) {
		x = f;
		y = i;
	}
	
	void display() // 显示的方法
	{
		cout << "x: " << x << " y:" << y << endl;
	}
	
	Point operator- () // 重载负运算符( - )
	{
		x = -x;
		y = -y;
		return Point(x, y);
	}
	Point& operator++ () //前置
	{
		x = ++x;
		y = ++y;
		return *this;
	}
	Point operator++ (int) //后置
	{
		Point temp = *this;
		++*this;   //这个会调用上面的函数,可以换成上面函数的内容
		return temp;
	}
};
int main()
{
	cout << "原数据:" << endl;
	Point D1(11, 10);
	D1.display();
	
	cout << "取相反数:" << endl;
	-D1;                     // 取相反数
	D1.display();     

	cout << "自加,前置运算:" << endl;
	(++D1).display();    // 前置运算,左值
	cout << "自加,后置运算:" << endl;
	(D1++).display();    // 后置运算,右值
	D1.display();
	return 0;
}

结果:
在这里插入图片描述

2.2二元运算符

加( + )、减( - )、乘( * )和除( / )都属于二元运算符
这里写出重载加法运算符的使用方法:

//声明
Point operator+(const Point&b) {//对象加法
	Point tmp;
	tmp.x = this->x + b.x;
	tmp.y = this->y + b.y;
	return tmp;
}

//调用
Point D2(10, 10);
Point D3(1, 1);
Point D4=D2+D3;
D4.display();

结果:
在这里插入图片描述

2.3输入输出运算符“>>”和“<<”

流提取运算符 >> 和流插入运算符 << 能够用于输入和输出内置的数据类型。而用户自定义的数据类型需要重载流提取运算符和流插入运算符来操作对象来实现。

注意:需要把运算符重载函数声明为类的友元函数,这样我们就能不用创建对象而直接调用函数,可以直接访问当前类的私有成员。

//声明输入/输出运算符重载
friend istream &operator >> (istream &input, Point &D) {
	input >> D.x >> D.y;
	return input;
}

friend ostream &operator << (ostream &output, Point &D) {
	output <<"X:"<< D.x <<" "<< "Y:" << D.y;
	return output;
}

//调用
cout << "请输入x,y" << endl;
Point D4;
cin >> D4;
cout << "D4的成员" << D4<<endl;

结果:
在这里插入图片描述
如果使用成员函数来重载需要使用 D4 << cout的方式调用,与常见的cout<<写法不一致。

//使用成员函数重载输出运算符
ostream& operator<<(ostream & os)
{
	os << "X:" << x << "\nY:" << y;
	return os;
}

//调用
D4 << cout;
cout << endl;

结果:
在这里插入图片描述

2.4函数调用运算符()

相当于定义了一个函数

//函数调用运算符()重载
Point operator()(int a, int b) {
	Point tmp;
	tmp.x = a;
	tmp.y = b;
	return tmp;
}

//调用
Point D5;
D5=D4(2, 3);
cout << D5<< endl;

结果:
在这里插入图片描述

2.5下标运算符 [] 重载

下标操作符 [] 通常用于访问数组元素。重载该运算符用于增强操作 C++ 数组的功能。比如是否越界等问题的检查。

#include <iostream>
using namespace std;
const int SIZE = 10;

class safearay
{
private:
	int arr[SIZE];
public:
	safearay()
	{
		int i;
		for (i = 0; i < SIZE; i++)
		{
			arr[i] = i;
		}
	}
	int& operator[](int i)
	{
		if (i > SIZE)
		{
			cout << "索引超过最大值, 返回第一个元素" << endl;

			return arr[0];
		}
		return arr[i];
	}
};
int main()
{
	safearay A;

	cout << "A[2] 的值为 : " << A[2] << endl;
	cout << "A[5] 的值为 : " << A[5] << endl;
	cout << "A[12] 的值为 : " << A[12] << endl;

	return 0;
}

参考资料:C++ 重载运算符和重载函数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!