1、操作符重载

C++可以通过operator实现重载操作符,格式如下:类型T operator 操作符 (),比如重载+,比如下面这个例子

1
2
3
4
5
6
7
8
9
10
template<typename T> class A
{
public:
const T operator+(const T& a)
{
return this->_m + a;
}
private:
T _m;
};

又比如STL中的函数对象,重载(),比如下面这个例子

1
2
3
4
template<typename T> struct A
{
T operator()(const T& a, const T& b){ return a-b; }
};

2、 操作隐式转换

C++可以通过operator实现重载隐式转换,格式如下: operator T (),其中T是一个类型,比如下面这个例子

1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
operator B*() { return this->_b*; }
operator const B*() { return this->_b; }
operator B&() { return *this->_b; }
private:
B* _b;
};

A a;

if(a),编译时,它转换成if(a.operator B*()),其实也就是相当于 if(a._b)


编译器调用函数顺序

(1)寻找和使用最符合函数名和参数类型(包括返回值)的函数,若找到则调用;

(2)否则,寻找一个函数模板,将其实例化产生一个匹配的重载函数,若找到则调用;

(3)否则,寻找可以通过类型转换进行参数匹配的重载函数,若找到则调用它。

如果以上步骤均未找到匹配函数,则这个调用是错误的;如果这个调用有多于一个的匹配选译,则调用匹配出现二义性,也是错误的。