Re: Вызвать конструктор напрямую
От: M16_rage  
Дата: 09.12.09 11:36
Оценка:
Здравствуйте, Rothmans, Вы писали:

R>Привет всем,


R>Вот давеча натолкнулся (в коде коллег ) на такую вот конструкцию:

R>сначала стояло:
R>
R>class SomeClass
R>{
R>...
R>};

R>SomeClass x[100];
R>...
R>for(..)
R>{
R>  x[i] = SomeClass();
R>}
R>

R>потом видимо при переходе на очередную версию gcc это дело перестало работать (?) и оказалось закомментированным.
Версии компиляторов стремятся к несовместимости (по разным причинам).
При переходе все и проявляется..

R>На место вышеозначенного кода пришло следующее:

R>
R>class SomeClass
R>{
R>...
R>};

R>SomeClass x[100];
R>...
R>for(..)
R>{
R>  // g++ does not allow the automatic casting
R>  // x[i] = SomeClass();
R>  SomeClass sc = SomeClass();
R>  x[i] = sc;
R>}
R>

R>Правда второй вариант тоже не собирается, поскольку у SomeClass не объявлен копирующий конструктор.

Зачем копировать?
  // или обойтись без копирования,
  // дополняя парой функций (де)инициализации класс SomeClass:
  // int  Init() {/*Do init*/}
  // void Exit() {/*Do exit*/} // в деструкторе не забыть вызвать
  // тогда
  x[i].Init();


R>Я вообще не каждый день пишу на С++, поэтому тонкости ускользают и/или забываются.

R>Объясните-ка мне, что автор вообще хотел сказать конструкцией вида x[i] = SomeClass(); ?

R>Каков смысл в вызове конструктора напрямую без new?

R>Другой мой коллега утверждает, что
R>
R>void proc()
R>{
R>   SomeClass();
R>}
R>

R>не только вызовет конструктор, но и _выделит_ память под безымянный объект в стеке и еще и деструктор вызовется при выходе из процедуры.

R>Какой толк вызывать вне класса его конструктор напрямую без new и без объявления переменной (кроме исполнения самого кода конструктора)?

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

R>Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.