Здравствуйте, 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>Спасибо!