运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
1.全局函数实现重载
class Myclass
{
public:
Myclass(int num) {m_num = num;};//有参构造
Myclass() {}; //无参构造
int m_num;
};
//重载函数
Myclass operator+ (const Myclass& data1,const Myclass& data2)
{
Myclass temp;
temp.m_num = data1.m_num + data2.m_num;
return temp; //返回匿名对象
}
int main()
{
Myclass first(10);
Myclass second(20);
Myclass test1 = first + second; //隐式调用
Myclass test2 = operator+(first, second); //显示调用
cout << test1.m_num << endl;
cout << test2.m_num << endl;
return 0;
}
几个注意点:
- 隐式调用是一般使用的形式,显示调用可以看到其本质,方便理解。编译器编译时,也是将隐式解析成显示调用这种形式。
- 函数使用引用传参,可以取消拷贝本,提高性能。
- 一般规范而言,要使用const,毕竟这个函数的功能是不会去修改传进来的参数的。
2.类内函数实现重载
class Myclass
{
public:
Myclass(int num) {m_num = num;};
Myclass() {};
Myclass operator+(const Myclass& data)
{
Myclass temp = this->m_num + data.m_num;
return temp;
}
int m_num;
};
int main()
{
Myclass first(10);
Myclass second(20);
Myclass test = first + second; //隐式调用
Myclass test2 = first.operator+(second);//显示调用
return 0;
}
几个注意点:
- 隐式调用没有变化,显示调用是它本来的样子,由其中一个对象调用这个重载,并将另一个对象作为参数传进来。
- 重载函数写在类内,那就能省略当前对象这个参数(因为是由当前对象调用的,定义函数是这个类的成员函数,可以使用当前对象的数据)。
3.其它符号的重载
1.=、()、->、[]
只能采用成员函数的方式重载
2.习惯性的,单目运算符采用成员函数的方式重载
3.双目运算符用友元函数
4.三目运算符不能被重载