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