c++ - 方法和自由函数之间有哪些细微的区别?

标签 c++ function methods implementation

据我了解,方法实际上只是带有隐式额外参数(this 指针)的函数,而静态方法与自由函数几乎相同。

但是方法和函数之间似乎有些区别;例如,当将函数作为参数传递时,为什么引用运算符 & 必须在方法上使用,而不是在自由函数上?

foobar(&MyClass::method);
goobar(freefunction);

方法和自由函数之间还有哪些其他细微的技术差异?

最佳答案

在:

foobar(&MyClass::method);

... & 不是“引用运算符”,而是地址运算符。它获取其操作数的地址。

实际上,您仍然“必须”在代码中获取自由函数的地址,例如(尽管可以使用隐式转换):

goobar(freefunction);

存在可用的隐式转换,这将导致诸如 Foo 之类的表达式衰减为指针,但我很难让 GCC 接受此类无错误和警告的代码,在 MSVC 没有问题的情况下。

除此之外,自由函数和非静态成员函数之间还有两个主要区别:

  1. 静态成员函数对类的实例进行操作,并且有一个指向类本身的this指针。
  2. 通过指向自由函数的指针创建和调用的语法与指向成员函数的指针不同。

对于 free 函数,语法很简单:

void foo();  // Function declaration
void(*f)();  // Declaration of pointer-to-function-returning-void-and-taking-no-parameters

但是对于指向成员函数的指针,语法要复杂得多:

struct Bar
{
  void DoIt()
  {
  }
  void DoThat(int n)
  {
    n;
  }
};


void(Bar::*thatfn)(int);    // declares a pointer-to-member-function taking int returning nothing
thatfn = &Bar::DoThat;      // initializes pointer to point to DoThat(int)
(bar.*thatfn)(42);          // call the function

关于c++ - 方法和自由函数之间有哪些细微的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435654/

相关文章:

function - 在 Nasm 中调用汇编函数

c# - 当我在方法中使用变量时,可以将变量调用为方法的参数吗?

c++ - 自动获取某段代码的浮点运算次数

c++程序,用于将具有恒定(但未知)列数的未知大小的csv文件(仅填充 float )读取到数组中

c++ - 在 OpenGL 中创建 GUI,可能吗?

java - 如何从同一类中的先前方法访问 ArrayList?

arrays - Ruby 选择方法 : check number of items that are selected

c++ - g++ 4.5 找不到友元函数

Javascript:找出数组中是否至少有两个不同的值

javascript - 带有障碍物的寻路 javascript