operator bool()和 bool operator()(const A& a) 有什么区别吗?
1 TypeCast 重载:
C++ 知道如何在内置类型之间进行转换,但是并不知道如何在我们自定义类型之间进行转换。例如下面的例子:
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents=0)
{
m_nCents = nCents;
}
int GetCents() { return m_nCents; }
void SetCents(int nCents) { m_nCents = nCents; }
};
上面给出了一个类Cents, 如果我们想要得到这个Cent的面值,我们需要调用Cents::GetCents函数来得到:
void PrintInt(int nValue)
{
cout << nValue;
}
int main()
{
Cents cCents(7);
PrintInt(cCents.GetCents()); // print 7
return 0;
}
如果有很多地方需要使用Cents的面值,我们有什么办法能够简化这个调用呢?这个时候我们就需要用到TypeCast 重载了。
就是在上面的类中加入重载操作符函数:
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents=0)
{
m_nCents = nCents;
}
// Overloaded int cast
operator int() { return m_nCents; }
int GetCents() { return m_nCents; }
void SetCents(int nCents) { m_nCents = nCents; }
};
在调用的过程中我们可以用下面的语句:
int main()
{
Cents cCents(7);
PrintInt(cCents); // print 7
return 0;
}
2 Function Object:
Function object是一个对象,不过它的行为表现像函数。一般而言,它是由一个重载了operator()的类所实例化得来的对象。
如果再上面的类中,我们将他们存入一个vector中
int main()
{
Cents cCents(7);
PrintInt(cCents); // print 7
vector<Cents> v;
Cents c1(1);
Cents c2(2);
Cents c3(3);
Cents c4(4);
v.push_back(cCents);
v.push_back(c1);
v.push_back(c2);
v.push_back(c3);
v.push_back(c4);
return 0;
}
在Vector中并且找到Cents为3的对象。
这里我们可以用find_if 函数。find_if(begin, end, unarypredict);
这里我们可以将Cents定义为一个函数对象,在这里Cents可以加入下面的函数:
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents=0)
{
m_nCents = nCents;
}
// Overloaded int cast
operator int() { return m_nCents; }
//overload operator ()
bool operator()(const Cents& c) { return c.GetCents == m_nCents;}
int GetCents() { return m_nCents; }
void SetCents(int nCents) { m_nCents = nCents; }
};
这样我们就可以在调用时用find_if找到Cents为3的对象了。
int main()
{
Cents cCents(7);
PrintInt(cCents); // print 7
vector<Cents> v;
Cents c1(1);
Cents c2(2);
Cents c3(3);
Cents c4(4);
v.push_back(cCents);
v.push_back(c1);
v.push_back(c2);
v.push_back(c3);
v.push_back(c4);
vector<Cents>::iterator pos = find_if(v.begine(), v.end(), Cents(3));
return 0;
}
参考文献:
1 http://blog.youkuaiyun.com/xy365/article/details/3645894
2 http://www.learncpp.com/cpp-tutorial/910-overloading-typecasts/
3 http://blog.chinaunix.net/uid-14358420-id-3040740.html
4 http://stackoverflow.com/questions/4421706/operator-overloading