为什么&成员函数指针需要,而不是正常的函数指针?

时间:2016-10-04 14:54:13

标签: c++ pointers

我理解我的第二个声明“为什么& amp不需要正常的函数指针”因为函数名本身就是函数的地址。

我不明白为什么'&'成员函数指针是否严格需要?

实施例: 正常函数指针:

int add(int a, int b) {
  return (a + b);
}

int (*fp)(int, int);

fp = add;

(*fp)(2, 3) // This would give me addition of a and b, i.e. 5

成员函数指针:

class ABC {
  public:
    int i;
    ABC() { i = 0; }
    int addOne(int j) {
      return j + 1;
    }
};

// Member function pointer
int (ABC::*mfp)(int); 
// This is what I am talking about. '&' in below line.
mfp = &ABC::addOne;
ABC abc;
std::cout << (abc.*mfp)(2) << std::endl;

1 个答案:

答案 0 :(得分:-1)

在我看来,成员函数指针必须使用address-of运算符,因为声明的右侧(rhs)是常量而不是变量。

我们不会说

 int (ABC::*mfp)(int); 
 mfp = ABC::addOne();

因为这将调用一个函数。

此外,作用域解析运算符::在C ++运算符优先级表中具有最高优先级:

https://github.com/MicrosoftDocs/cpp-docs/blob/master/docs/cpp/cpp-built-in-operators-precedence-and-associativity.md

::运算符的运算要早于其他运算符的运算。我想编译器会怀疑“嗯...那是什么?那应该是一个函数,但是...”,然后看到操作符的地址并知道开发人员需要什么。