Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters
Register

Reply
 
LinkBack Thread Tools
Old 06.08.2003, 14:24   #1
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default изменение порядка инициализации в конструкторе

чем, согласно стандарту, чреват такой трюк:

struct B
{
B(T* t): t_(t) { }

T* t_;
};

struct D
{
D(): B(tt_ = new T) { } // заставляя член этого класса инициализироваться до вызова конструктора предка

T* tt_;
};
Reply With Quote
Old 06.08.2003, 14:36   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

1. ты забыл написать struct D : public B
2. стандарт я посмотрю потом скажу, если что найду.
Reply With Quote
Old 06.08.2003, 14:58   #3
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

В общем, короче - раздел 12.6.2 (смотри картинку).
VC, выполняет не так как я это ожидаю... он сначала инициализирует член D, а потом вызывает конструктор B, что не есть верно (на мой взгляд).
Reply With Quote
Old 06.08.2003, 15:15   #4
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally posted by Agregat
VC, выполняет не так как я это ожидаю... он сначала инициализирует член D, а потом вызывает конструктор B, что не есть верно (на мой взгляд).
а что ему остается делать, раз ты это заказал кстати, это уже не инициализация, а присваивание.
а после этого он производит уже инициализацию, а поскольку в моем примере ничего не написано, то инициализацию по умолчанию, что оставляет значение указателя неизменным (в случае данного компилятора). эффект проявится, если вместо указателя взять тип с двумя конструкторами, один из которых - по умолчанию, и сделать так:

struct S
{
S(int i = 0): i_(i) {}
int i_;
};

struct B
{
B(S* ps): ps_(ps)
{
cout << ps_->i_;
}

S* ps_;
};

struct D: B
{
D(): B(&(s_ = S(8)))
{
cout << s_.i_;
}

S s_;
};

int
main()
{
D d;
return 0;
}


но стандарт все же ничего не сказал о том, насколько правильно такое присваивание - обязан ли компилятор его обругать или нет...
Reply With Quote
Old 06.08.2003, 15:28   #5
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally posted by Aram Hambardzumyan
а после этого он производит уже инициализацию, а поскольку в моем примере ничего не написано, то инициализацию по умолчанию, что оставляет значение указателя неизменным
впрочем, об этом кажется ничего не сказано в стандарте, и для указателя он ее не выполняет. т.е. для скалярных типов если не вызываять инициализацию явно, то компилятор вполне законно ее проскочит? и не имеет права что-то менять? или имеет?
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 23:12.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.