概念:
重载就是赋予新的含义。函数重载可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载也跟函数重载一样,同一个运算符可以有不同的功能。
方法:
运算符重载需要定义一个函数,在函数体内实现想要的功能,当用到该运算符时,编译器会自动调用这个函数。这个说明,运算符重载是通过函数实现的,他本质上是函数重载。
返回值类型 operator 运算符名称(形参列表)
{
……
return……;
}
operator是一个关键字,专门用于定义重载运行符的函数。这个运算符重载函数除了函数名有特定的格式,其他地方和普通函数没有区别。但在访问类中私有成员时,需要将类外运算符重载函数设置为友元函数。
public:
friend 返回值类型 operator 运算符名称(形参列表);
(类外:)
返回值类型 类名::operator 运算符名称(参数列表)
{
……;
}
举例:
1.重载++或--(自增或自减)
#include<iostream>
using namespace std;
class Num
{
private:
int num;
public:
Num();
public:
int operator++(int n); //右++
int operator++(); //左++
};
Num::Num()
{
num=100;
}
int Num::operator++(int n)
{
int Temp=num;
num=num+1;
return Temp;
}
int Num::operator++()
{
num=num+1;
return num;
}
int main()
{
Num a;
cout<<a++<<endl;
cout<<++a<<endl;
return 0;
}
2.重载>>和<<(输入和输出运算符)
#include<iostream>
using namespace std;
class Num
{
private:
int num;
public:
Num();
friend istream& operator>>(istream& is,Num& a);
friend ostream& operator<<(ostream& os,Num& a);
}
Num::Num()
{
num=100;
}
istream& operator>>(istream& is,Num& a)
{
is>>a.num;
return is;
}
ostream& operator<<(ostream& os,Num& a)
{
os<<a.num;
return os;
}
int main()
{
Num c_num;
cout<<c_num<<endl;
cin>>num;
cout<<c_num<<endl;
return 0;
}
3.深拷贝:
#include<iostream>
using namespace std;
class AA
{
public:
int* p;
public:
AA()
{
p = new int(100);
}
~AA()
{
delete p;
}
AA& operator=(AA& aa)
{
if (p == NULL)
{
p = new int;
}
*p = *aa.p;
return aa;
}
};
int main()
{
AA aa;
cout << *aa.p << endl;
AA bb;
bb = aa;
cout << *bb.p << endl;
return 0;
}
注意事项:
1.并不是所有的运算符都可以重载。sizeof、三目运算符、成员选择符. 、::等都不能被重载。
2.重载不改变运算符的优先级和结核性。
3.重载不改变运算符的用法。
4.运算符重载函数不能有默认的参数。
5.运算符重载函数不仅可以用作类成员函数,还可以作为全局函数使用。
6.箭头运算符‘->’、下表运算符'[]'、函数调用运算符'()'、赋值运算符‘='只能以成员函数的形式重载。