C++操作符重载
C++操作符重载
下面举个简单的例子介绍重载操作符
#include <iostream>
class A
{
friend std::istream &operator>>(std::istream &, A &);
friend std::ostream &operator<<(std::ostream &, const A &);
public:
A() : num(0) {}
A(int n) : num(n) {}
A &operator+=(const A &);
A operator+(const A&);
private:
int num;
};
这里定义了一个A类,构造函数有两个
重载操作符需要定义重载函数,与一般函数相似,
重载函数需要有返回值,形参列表。
一般而言,重载操作符的操作元素个数应该与形参列表一致,
本例中因为存在隐含的this
参数,所以少一个。
这里给出+
和+=
的重载函数定义
A A::operator+(const A&a)
{
return A(num+a.num);
}
A &A::operator+=(const A &other)
{
num += other.num;
return *this;
}
当友元需要通过操作符来操作对象时,也可以重载
std::istream &operator>>(std::istream &in, A &a)
{
in >> a.num;
if (!in)
a.num = 0;
return in;
}
std::ostream &operator<<(std::ostream &out, const A &a)
{
out << a.num;
return out;
}
通过下面代码测试功能
#include "A.hpp"
int main()
{
A a1;
A a2;
std::cin >> a1 >> a2;
a1 += a2;
a1.operator+=(a2);
std::cout << a1 << std::endl;
std::cout << a1 + a2 << std::endl;
return 0;
}
重载操作符有几点需要注意的
- 重载操作符至少有一个类类型或者枚举类型操作数
- 重载操作符不保证操作数的求值顺序,例如 重载
&&
和||
就没有短路特性 - 重载操作符与原操作符的优先级,结合性,操作数目均相同