C++运算符重载(一元运算符,二元运算符,流运算符)

我们一直在使用重载的运算符,这些运算符重载在c++语言本身中。例如,c++重载了加运算符(+)和减运算符(-)。这些运算符在整型运算、浮点型运算、指针运算等上下文中,执行的操作是不同的。

大多数c++运算符都可被重载,因此我们只需记住四个不能重载的运算符:. ” , “ .* ” ,“ :: ”, “ ?: ”。

当创建自己的运算符时,应该遵守一定的规则和限制:
一:不能通过重载改变运算符的优先级。如果运算符是左结合,则在重载时也应如此。

二:重载不能改变运算符的结合性。即运算符是按照从右至左还是从左 至右的顺序计算。

三:重载不能改变运算符的元数。即运算符操作个数。

四:不能通过运算符重载改变运算符应用于基本类型对象时的含义。即“-”只能用于两个同类型的数相减或作为负号。

五:相关运算符,例如+和+=,必须分别重载。

六:当重载(),[ ],->或赋值运算符,运算符重载函数必须重载为类的成员。

下面以Clac类演示运算符重载(成员函数和友元函数分别实现),该类有两个private数据成员x和y。

一:一元运算符重载。

以++为例,分为++前置和后置,以参数列表是否有int区分。
(1)作为成员函数。

class Clac
{
public:
	Clac();
	Clac(int, int);
	Clac operator ++(int);//++后置
	Clac operator ++();//++前置
private:
	int x, y;
};
Clac Clac::operator++(int)
{
	Clac temp(*this);
	x++;
	y++;
	return temp;
}
Clac Clac::operator++()
{
	x++;
	y++;
	return *this;
}

(2)作为友元函数

class Clac
{
public:
	Clac();
	Clac(int, int);
	friend Clac operator ++(Clac&, int);//++后置
	friend Clac operator ++(Clac&);//++前置
private:
	int x, y;
};
Clac operator ++(Clac& c, int)
{
	c.x++;
	c.y++;
	return c;
}
Clac operator ++(Clac& c)
{
	c.x++;
	c.y++;
	return c;
}

二:二元运算符重载。
以加法(+)为例。
(1)作为成员函数

class Clac
{
public:
	Clac();
	Clac(int, int);
	Clac operator +(Clac&);
private:
	int x, y;
};
Clac Clac::operator+(Clac& c)
{
	Clac temp;
	temp.x = x + c.x;
	temp.y = y + c.y;
	return temp;
}

(2)作为友元函数

class Clac
{
public:
	Clac();
	Clac(int, int);
	friend Clac operator +(Clac&, Clac&);
private:
	int x, y;
};
Clac operator +(Clac& c1, Clac& c2)
{
	Clac c3;
	c3.x = c1.x + c2.x;
	c3.y = c1.y + c2.y;
	return c3;
}

三:流运算符重载(流插入>>和流读取<<)

class Clac
{
public:
	Clac();
	Clac(int, int);
	friend ostream& operator <<(ostream& output, Clac&);
	friend istream& operator >>(istream& input, Clac&);
private:
	int x, y;
};
ostream& operator <<(ostream& output, Clac& c)
{
	return output << "(" << c.x << "," << c.y << ")" << endl;
}
istream& operator >>(istream& input, Clac& c)
{
	return input >> c.x >> c.y;
}

完整代码如下(由于无论是成员函数重载,还是友元函数重载,其调用方法一样,因此只显示成员函数重载):

#include <iostream>
using namespace std;

class Clac
{
public:
	Clac();
	Clac(int, int);
	Clac operator ++(int);//++后置
	Clac operator ++();//++前置
	Clac operator +(Clac&);
	friend ostream& operator <<(ostream& output, Clac&);
	friend istream& operator >>(istream& input, Clac&);
private:
	int x, y;
};
Clac::Clac()
{
	x = 0;
	y = 0;
}
Clac::Clac(int x1, int y1)
{
	x = x1;
	y = y1;
}
Clac Clac::operator++(int)
{
	Clac temp(*this);
	x++;
	y++;
	return temp;
}
Clac Clac::operator++()
{
	x++;
	y++;
	return *this;
}
Clac Clac::operator+(Clac& c)
{
	Clac temp;
	temp.x = x + c.x;
	temp.y = y + c.y;
	return temp;
}
ostream& operator <<(ostream& output, Clac& c)
{
	return output << "(" << c.x << "," << c.y << ")" << endl;
}
istream& operator >>(istream& input, Clac& c)
{
	return input >> c.x >> c.y;
}
int main()
{
	Clac a1(1, 2), a2(10, 10),a3,a4;
	++a1;
	a1++;
	cout << a1;
	a3 = a1 + a2;
	cout << a3;
	cout << "分别输入x和y的值:";
	cin >> a4;
	cout << a4;
}