#include <iostream>
class A
{
public:
A(int i) : m_i(i) { }
public:
int operator()(int i = 0) const { return m_i + i; }
operator int () const { return m_i; }
private:
int m_i;
friend int g(const A&);
};
int f(char c)
{
return c;
}
int g(const A& a)
{
return a.m_i;
}
int main()
{
A f(2), g(3);
std::cout << f(1) << g(f) << std::endl;
return 0;
}
答案:35
1. scope里面的函数会hide scope外面带有相同函数名和参数列表的的函数, 这里在main内部,当我们看到f(1), 会发现对象名为f的类接受一个int参数,所以就hide了 外面
int f(char c)
2. conversion operator: operator type () const {} 定义在类里面,允许将该类转化为type类型的变量。
几点注意:
1. 不能带参数列表
2. 不能带返回类型
3. 必须是类的member function
在这里, g(f) 又将外面的 int g(const A& a) hide掉了,虽然这个看起来是一个exact match,但是根据scope的原则,它还是被hide掉了。
A 重载了一个call operator (), 接受一个int参数,而A 又有一个A转int的conversion operator,所以先f调用自己的conversion operator将自己转换成一个int,然后g再调用自 己的call operator,接受一个由 f 转换而来的int参数。