C++编程思想 第1卷 第12章 运算符重载 可重载的运算符 不常用的运算符 operator->*

operator->*是一个二元运算符,其行为与所有其他二元运算符类似

operator->*,指向成员的指针间接引用运算符通常同某种代表 灵巧指针 的
对象一起使用

operator()的函数调用必须是成员函数,它是唯一的允许在它里面有任意个
参数的函数

要想创建一个operator->*,必须首先创建带有operator()类,这是operator->*
将返回对象的类

FunctionObject的构造函数得到并储存指向对象的指针和指向成员函数的指针,
然后operator()使用这些指针进行实际指向成员的指针的调用

 

//: C12:PointerToMemberOperator.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include <iostream>
using namespace std;

class Dog {
public:
  int run(int i) const { 
    cout << "run\n";  
    return i; 
  }
  int eat(int i) const { 
     cout << "eat\n";  
     return i; 
  }
  int sleep(int i) const { 
    cout << "ZZZ\n"; 
    return i; 
  }
  typedef int (Dog::*PMF)(int) const;
  // operator->* must return an object 
  // that has an operator():
  class FunctionObject {
    Dog* ptr;
    PMF pmem;
  public:
    // Save the object pointer and member pointer
    FunctionObject(Dog* wp, PMF pmf) 
      : ptr(wp), pmem(pmf) { 
      cout << "FunctionObject constructor\n";
    }
    // Make the call using the object pointer
    // and member pointer
    int operator()(int i) const {
      cout << "FunctionObject::operator()\n";
      return (ptr->*pmem)(i); // Make the call
    }
  };
  FunctionObject operator->*(PMF pmf) { 
    cout << "operator->*" << endl;
    return FunctionObject(this, pmf);
  }
};
 
int main() {
  Dog w;
  Dog::PMF pmf = &Dog::run;
  cout << (w->*pmf)(1) << endl;
  pmf = &Dog::sleep;
  cout << (w->*pmf)(2) << endl;
  pmf = &Dog::eat;
  cout << (w->*pmf)(3) << endl;
  getchar();
} ///:~

 

Dog有三个成员函数,它们的参数和返回类型但是int

operator->*创建并返回一个FunctionObject对象

operator->操作的内容正插入到调用operator->*的中间

执行的operator->*机制仅作用于参数和返回值是int的成员函数

输出
operator->*
FunctionObject constructor
FunctionObject::operator()
run
1
operator->*
FunctionObject constructor
FunctionObject::operator()
ZZZ
2
operator->*
FunctionObject constructor
FunctionObject::operator()
eat
3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值