据我了解,方法实际上只是带有隐式额外参数(this
指针)的函数,而静态方法与自由函数几乎相同。
但是方法和函数之间似乎有些区别;例如,当将函数作为参数传递时,为什么引用运算符 &
必须在方法上使用,而不是在自由函数上?
foobar(&MyClass::method);
goobar(freefunction);
方法和自由函数之间还有哪些其他细微的技术差异?
最佳答案
在:
foobar(&MyClass::method);
... &
不是“引用运算符”,而是地址运算符。它获取其操作数的地址。
实际上,您仍然“必须”在代码中获取自由函数的地址,例如(尽管可以使用隐式转换):
goobar(freefunction);
存在可用的隐式转换,这将导致诸如 Foo
之类的表达式衰减为指针,但我很难让 GCC 接受此类无错误和警告的代码,在 MSVC 没有问题的情况下。
除此之外,自由函数和非静态成员函数之间还有两个主要区别:
- 非
静态
成员函数对类的实例进行操作,并且有一个指向类本身的this
指针。 - 通过指向自由函数的指针创建和调用的语法与指向成员函数的指针不同。
对于 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/