Некоторые люди считают, что вы не должны использовать указатель this
в конструкторе, потому что объект еще не полностью сформирован. Однако вы можете использовать это в конструкторе (в {body} и даже в списке инициализации), если вы осторожны.
Вот то, что всегда работает: {body}
конструктора (или функции, вызываемой из конструктора) может надежно обращаться к членам данных, объявленным в базовом классе, и / или членам данных, объявленным в собственном классе конструктора. Это потому, что все эти элементы данных гарантированно будут полностью построены к тому времени, как начинает выполняться {body} конструктора.
Вот то, что никогда не работает: {тело} конструктора (или функции, вызываемой из конструктора) не может перейти к производному классу, вызывая функцию виртуального члена, которая переопределяется в производном классе. Если вашей целью было получить переопределенную функцию в производном классе, вы не получите того, что хотите. Обратите внимание, что вы не получите переопределение в производном классе независимо от того, как вы вызываете виртуальную функцию-член: явно используя указатель this (например, this-> method ()), неявно используя указатель this (например, method ( )) или даже вызывая какую-то другую функцию, которая вызывает виртуальную функцию-член вашего объекта this. Суть в следующем: даже если вызывающая сторона создает объект производного класса, во время конструктора базового класса ваш объект еще не принадлежит этому производному классу. Вы были предупреждены.
Вот кое-что, что иногда работает: если вы передаете какой-либо элемент данных в этом объекте инициализатору другого элемента данных, вы должны убедиться, что другой элемент данных уже инициализирован. Хорошая новость заключается в том, что вы можете определить, был ли инициализирован (или нет) другой элемент данных, используя некоторые простые языковые правила, которые не зависят от конкретного компилятора, который вы используете. Плохая новость заключается в том, что вы должны знать эти языковые правила (например, субобъекты базового класса инициализируются первыми (посмотрите порядок, если у вас множественное и / или виртуальное наследование!), Затем элементы данных, определенные в классе, инициализируются в порядок, в котором они появляются в объявлении класса). Если вы не знаете этих правил, не передавайте ни одного члена данных из объекта this (независимо от того, используете ли вы явно ключевое слово this) инициализатору любого другого члена данных! И если вы знаете правила, будьте осторожны.