函数调用运算符

函数调用运算符

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***输出流的时候就会调用一次类型转换运算符,返回数据成员,因为函数调用运算符会保持状态,所以最后的结果就是累加结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值