Vapaamies писал(а):Оба варианта неверны, конструктор вызывается не так. В первом примере теряется указатель на вновь созданный конструктором объект, а во втором к этому добавляется потенциальный AV, если конструктор не только выводит сообщение в консоль, но и обращается к данным объекта.
Я бы сказал иначе: первый формально допустим, но порождает "мусор" (и будет вполне приемлемым, если этот мусор будет где-нибудь и как-нибудь отлавливаться, например, при вызове конструктор зарегистрирует создаваемый объект в каком-нибудь списке), второй принципиально неверный - вызывается метод несозданного объекта. А вот если оформить метод из второго варианта как class procedure, и вызвать его как в первом варианте, то всё будет верно.
С точки зрения генерации кода разница есть. С точки зрения поведения именно такого кода - в первом (формально верном) случае появится мусор (но если больше в программе ничего не будет, то он так же успешно и уничтожится с окончанием программы), во втором мусора не будет, хотя в метод и будут переданы принципиально неверные и опасные параметры - нулевой указатель вместо self. IMHO второй вариант собственно к ООП отношения не имеет, это - всего лишь "хак", позволяющий его обойти.
Добавлено спустя 21 минуту 15 секунд:Хотя вполне допускаю, что такой хак кому-то когда-то может понадобиться. Например, есть какой-то набор очень неплохих модулей, где в каком-то классе, помимо всего прочего, есть и нужный нам метод. Создать объект из этого класса мы не можем или не хотим - и тогда (и только тогда), если этот метод вдруг не работает с полями, VMT и прочим - его можно вызвать так. Если такая работа некритична для нашей функциональности - можно ему подсунуть не nil, а пустой буфер.