C++操作符重载
重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同。
重载操作符的特点:
- 定义某种重载时定义方式与定义普通函数基本一致,唯一的区别就是在“操作符名”前加上关键字“operator”.
- 虽然定义时基本与定义普通函数差不多,但是在调用时与重载前的调用方式一致。
- 不能改变运算符操作数的个数,不能改变运算符原有的优先级,不能改变运算符原有的结合性,不能改变操作符原有的语法结构
不可被重载的操作符:
类成员访问操作符“.”
类成员指针访问操作符“.*”
域解析操作符“::”
条件操作符“? :”
长度操作符”sizeof”
重载操作符的方式
运算符重载一般采用如下两种方式:成员函数形式和友元函数形式
重载为类的成员函数
定义的格式:
<类型> operator <运算符>(<参数列表>)
当重载为成员函数时,总是隐藏了一个参数,该参数是this指针。所以当重载为成员函数时,双目运算符仅有一个参数,单目运算符不能再显式地说明参数。
class complex{
public:
complex(double r = 0. double i = 0)
{
real = r,imag = i;
}
complex opetator+(const complex &c)
{
return complex(real+c.real, imag+c.imag);
}
private:
double real;
double imag;
};
int main()
{
complex c1(2, 3);
complex c2(c1);
complex c3 = c1 + c2;
return 0;
}
对于程序中出现的表达式:c1 + c2
,编译器将解释为c1.opretor+(c2)
,其中,c1和c2是complex类的对象,operator+()
是运算符+的重载函数
重载为友元函数
当重载为友元函数时,将没有隐含的参数this指针。这样双目运算符就要有两个参数,单目运算符有一个参数。
有些运算符不宜重载为友元函数,它们是:=,(),[],和->
输入操作符>>和输出操作符<<重载时必须重载为友元函数
经验之谈:
1. 一般将算术操作符定义为非成员函数(友元函数),将赋值运算符定义成员函数
2. 操作符定义为非类的成员函数时,一般将其定义为类的友元
3. == 和 != 操作符一般要成对重载
例子:重载 << 和 >>
#include<iostream>
using namespace std;
class Test {
friend ostream & operator<<(ostream &out, Test &obj);
friend istream & operator >> (istream &in, Test &obj);
public:
Test(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
void display()
{
cout << "a:" << a << " b:" << b << endl;
}
private:
int a;
int b;
};
ostream & operator<<(ostream &out, Test &obj)
{
out << obj.a << " " << obj.b;
return out;
}
istream & operator>>(istream &in, Test &obj)
{
in >> obj.a>> obj.b;
if (!in) //当输入的两个值不为int时,in为NULL, !in不为空。
{
obj = Test();
}
return in;
}
int main()
{
Test t1(1, 2);
cout << t1 << endl;
cout << "请输入两个int属性:";
cin >> t1;
cout << t1 << endl;;
cout << "hello world!\n";
return 0;
}