this указатель в конструкторе

User avatar
Veselchak U
Уже с Приветом
Posts: 1787
Joined: 27 Nov 2002 05:24
Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago

this указатель в конструкторе

Post by Veselchak U »

Вопрос знатокам C++:
Могу ли я использовать указатель this в конструкторе етого-же обьекта?

К примеру, если есть класс Fоо:

Code: Select all

Foo::Foo()
{
   // Bar(this);
}

Я могу гарантировать, что указатель this не будет использоватьса до тех пор пока конструктор не завершит своу работу. Будем говорить, что Bar просто запоминает значение this.

Спасибо!
Hamster
Уже с Приветом
Posts: 11475
Joined: 20 Nov 2000 10:01
Location: Escondido, CA

Post by Hamster »

Можете. Можете даже cast'овать this к типу родительского класса и начать вызывать его методы.
User avatar
Veselchak U
Уже с Приветом
Posts: 1787
Joined: 27 Nov 2002 05:24
Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago

Post by Veselchak U »

Еше раз спасибо! :gen1:
User avatar
DenisM
Уже с Приветом
Posts: 1976
Joined: 08 Jun 1999 09:01
Location: SPb -> SFBA -> Beaverton, OR

Post by DenisM »

Hamster wrote:Можете. Можете даже cast'овать this к типу родительского класса и начать вызывать его методы.


Только невиртуальные :nono#:
User avatar
Vlad G
Уже с Приветом
Posts: 596
Joined: 20 Jan 2002 10:01
Location: Israel

Post by Vlad G »

DenisM wrote:
Hamster wrote:Можете. Можете даже cast'овать this к типу родительского класса и начать вызывать его методы.


Только невиртуальные :nono#:

виртуальные в конструкторе не работают :umnik1:
User avatar
DenisM
Уже с Приветом
Posts: 1976
Joined: 08 Jun 1999 09:01
Location: SPb -> SFBA -> Beaverton, OR

Post by DenisM »

Vlad G wrote:
DenisM wrote:
Hamster wrote:Можете. Можете даже cast'овать this к типу родительского класса и начать вызывать его методы.


Только невиртуальные :nono#:

виртуальные в конструкторе не работают :umnik1:


Я бы сказал, что работают, но неправильно, если из конструктора ( или деструктора ) вызывается виртуальный метод, перегруженный в порожденном классе. Пока не закончен вызов конструктора, vtbl указывает на таблицу виртуальных функций этого класса, а не порожденного. Поэтому вместо перегруженного метода в порожденном классе вызовется соответствующий метод из этого ( ну или базового, если в этом метод не перегружен )

Да, кстати, в VC выдается warning при использовании this в constractor'е, именно для того, чтобы не забыть про эту особенность

Return to “Вопросы и новости IT”