我正在研究C ++类方法指针,并且已经越过了这个示例:
class A
{
public:
A();
void sample() { ...method_stuff... }
void (A::*ptrToSample);
};
A::A()
{
ptrToSample = &A::sample;
}
现在,如果我正确理解的话,sample是非静态的,这意味着如果没有A对象,我将无法调用它,更准确地说,如果我不创建对象A的所有非静态方法和成员也不会存储在内存中。话虽如此,我对示例报告的对象构造函数感到困惑。 A的任何对象都不应具有sample的副本吗?如果是,那么为什么我必须在类作用域上使用&运算符而不是this运算符?
构造函数不应该像这样:
{
ptrToSample = &(this->sample);
}
?
由于该方法是非虚拟方法,因此不应将其保存在虚拟方法表中(对吗?),那么该方法存储在什么地方?我想念什么?
感谢您的帮助!
首先,void (A::*ptrToSample);
必须为void (A::*ptrToSample)();
。
样本是非静态的,这意味着没有A对象我无法调用它
是
更确切地说,如果我不创建A的对象,那么它的所有非静态方法和成员也不会存储在内存中
否,方法不存储in对象。您无需复制方法即可在不同的对象上调用它。在幕后,它们像常规(免费)功能一样工作,但具有隐式this
参数。
构造函数不应该是这样的:
ptrToSample = &(this->sample);
很难说为什么选择了特定的语法,但是&(this->sample)
可能会产生误导,因为成员指针不包含指向特定对象实例的指针(因此this
将被丢弃)。您不必具有创建成员指针的对象。当您取消引用指针时,需要稍后提供该对象。