实例方法如何存储在内存中?

问题描述 投票:0回答:1

我正在研究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);
}

由于该方法是非虚拟方法,因此不应将其保存在虚拟方法表中(对吗?),那么该方法存储在什么地方?我想念什么?

感谢您的帮助!

c++ pointers methods static-methods class-method
1个回答
1
投票

首先,void (A::*ptrToSample);必须为void (A::*ptrToSample)();


样本是非静态的,这意味着没有A对象我无法调用它

更确切地说,如果我不创建A的对象,那么它的所有非静态方法和成员也不会存储在内存中

否,方法不存储in对象。您无需复制方法即可在不同的对象上调用它。在幕后,它们像常规(免费)功能一样工作,但具有隐式this参数。

构造函数不应该是这样的:ptrToSample = &(this->sample);

很难说为什么选择了特定的语法,但是&(this->sample)可能会产生误导,因为成员指针不包含指向特定对象实例的指针(因此this将被丢弃)。您不必具有创建成员指针的对象。当您取消引用指针时,需要稍后提供该对象。

© www.soinside.com 2019 - 2024. All rights reserved.