函数调用运算符
1示例代码
#include <iostream>
using namespace std;
class add {
public:
add(int x) : _x(x){}
operator int() { return _x; }//类类型转换,将一个类转换为一个int值
add operator() (int y) { return add(_x + y); }//函数调用运算符
friend bool operator==(const int& a, const add& b) { return a == b._x; }
private:
int _x;
};
int main() {
cout << add(8)(8)(24)(65);
}
样例解释:实现一个函数功能为可以在调用的时候进行链式调用,诸如在***main***函数中实现的那样,下面对代码中用到的知识点进行记录,便于以后查询。
2函数调用运算符重载
函数调用运算符的作用是:如果我们创建了一个类,且该类重载了函数调用运算符的话,我们就可以像使用函数一样使用该类的对象,因为这样的类同时也能存储状态,所以与普通函数相比更具灵活性。(摘自C++ primer 5th)。函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或类型上有所区别。
如果类定义了调用运算符,则该类的对象称之为函数对象,因为可以调用这种对象,所以我们说这些对象的行为像函数一样。
类中通常有一些数据成员,这些数据成员用于定制函数调用运算符中的操作。比如上边示例代码中的**_x**
#include <iostream>
using namespace std;
class Distance
{
private:
int feet; // 0 到无穷
int inches; // 0 到 12
public:
// 所需的构造函数
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
// 重载函数调用运算符
Distance operator()(int a, int b, int c)
{
Distance D;
// 进行随机计算
D.feet = a + c + 10;
D.inches = b + c + 100 ;
return D;
}
// 显示距离的方法
void displayDistance()
{
cout << "F: " << feet << " I:" << inches << endl;
}
};
int main()
{
Distance D1(11, 10), D2;
cout << "First Distance : ";
D1.displayDistance();
D2 = D1(10, 10, 10); // invoke operator()
cout << "Second Distance :";
D2.displayDistance();
return 0;
}
在main函数中就对类对象进行了函数式的调用
3类型转换运算符
类型转换运算符是类的一种特殊成员函数,负责将一个类类型的值转换为其他类型,比如示例代码中的:
operator int() { return _x; }//类类型转换,将一个类转换为一个int值
类型转换运算符既没有显式的返回类型,也没有形参,而且必须定义成类的成员函数,类型转换运算符不应该改变成员对象的内容,所以一般定义为const成员。
4链式调用的运行逻辑
首先在生成函数对象的时候会调用构造函数,然后返回到main函数,再接收到下一个参数的时候就会调用函数调用运算符,在函数调用运算符中会进行一次类的构造函数的调用,然后返回函数调用运算符,此函数调用运算符的返回类型为类类型,所以回到main函数的就是一个***add***对象,此对象接收新的参数是会重复刚才的调用过程,最后一次调用过后,即遇见***cout***输出流的时候就会调用一次类型转换运算符,返回数据成员,因为函数调用运算符会保持状态,所以最后的结果就是累加结果。