Как методы Instance хранятся в памяти? - PullRequest
0 голосов
/ 15 апреля 2020

Я изучаю указатели на методы класса C ++, и я пересек этот пример:

class A
{
public: 

A();

void sample() {  ...method_stuff... }

void (A::*ptrToSample);

};

A::A()
{
ptrToSample = &A::sample;
}

Теперь, если я правильно понял, sample не является stati c, что означает, что я не могу вызвать его без объекта A , точнее, если я не создаю объект A , а также все его неустановленные c методы и члены также не сохраняются в памяти. Сказав это, я запутался в конструкторе объектов, представленном в примере. Разве любой объект A не должен иметь копию sample ? Если да, то почему я должен использовать оператор & в области видимости вместо оператора this ?

Разве конструктор не должен выглядеть примерно так:

{
ptrToSample = &(this->sample);
}

?

Поскольку метод не виртуальный, его не следует сохранять в таблице виртуальных методов (верно?), тогда где, черт возьми, он хранится? Что мне не хватает?

Спасибо за помощь!

1 Ответ

2 голосов
/ 15 апреля 2020

Во-первых, void (A::*ptrToSample); должно быть void (A::*ptrToSample)();.


sample is non-stati c, что означает, что я не могу вызвать его без объекта A

Да.

Точнее, если я не создаю объект A, также все не статичные c методы и члены не сохраняются в памяти либо

Нет, методы не сохраняются в объектах. В памяти всегда есть один «экземпляр» каждого метода, и он не копируется при создании объектов. Под капотом методы работают как обычные (бесплатные) функции, но с неявным параметром this.

Разве конструктор не должен выглядеть примерно так: ptrToSample = &(this->sample);

Трудно сказать, почему был выбран определенный c синтаксис, но &(this->sample) будет несколько вводит в заблуждение, поскольку указатель на член не содержит указателя на конкретный c экземпляр объекта (поэтому this будет отброшено). Вам не нужно иметь объект для создания указателя на член. Объект необходимо указать позже, когда вы разыменуете указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...