Название: приведение типа после new Отправлено: blood_shadow от Март 19, 2011, 18:55 Добрый вечер
вот стало интересно, а как приводиться тип выражения возращаемого new к необходимому, например: Код как видим здесь явно не приводится возвращаемое значение оператором new(а оно void*) к типу SomeClass * Вопрос - так кто делает работу по приведению типа void* в SomeClass *, ведь void* можно только явно привести к необходимому типу? Название: Re: приведение типа после new Отправлено: Igors от Март 19, 2011, 19:08 Добрый вечер Ну если Вы создаете "SomeClass" и присваиваете возвращаемое значение тому же типу (SomeClass) то и приводить нечего - просто копирование. Оператор new возвращает указанный тип, а не void * вот стало интересно, а как приводиться тип выражения возращаемого new к необходимому, например: Код как видим здесь явно не приводится возвращаемое значение оператором new(а оно void*) к типу SomeClass * Вопрос - так кто делает работу по приведению типа void* в SomeClass *, ведь void* можно только явно привести к необходимому типу? Название: Re: приведение типа после new Отправлено: blood_shadow от Март 19, 2011, 19:34 Оператор new возвращает указанный тип, а не void * подождите как указанный тип, если в файле <new> определено так :Код: void* operator new(std::size_t) throw (std::bad_alloc); помойму, тут ясно сказано что возращаеться именно void* Название: Re: приведение типа после new Отправлено: brankovic от Март 19, 2011, 19:48 помойму, тут ясно сказано что возращаеться именно void* Там-то да, но в C++ оператор new это не просто список каких-то функций или шаблонная функция. operator new это специальная конструкция языка. Переопределять можно тот, который в заголовке new, но когда в коде написано: new MyClass (); компилятор генерит 1. вызов void * operator new (sizeof (MyClass)), 2. вызов конструктора MyClass по этому адресу и тип возвращаемого значения вместо void * подставляет MyClass* Название: Re: приведение типа после new Отправлено: blood_shadow от Март 19, 2011, 20:10 помойму, тут ясно сказано что возращаеться именно void* Там-то да, но в C++ оператор new это не просто список каких-то функций или шаблонная функция. operator new это специальная конструкция языка. Переопределять можно тот, который в заголовке new, но когда в коде написано: new MyClass (); компилятор генерит 1. вызов void * operator new (sizeof (MyClass)), 2. вызов конструктора MyClass по этому адресу и тип возвращаемого значения вместо void * подставляет MyClass* на сколько все-таки морочная реализация этого оператора :) еще вопрос остался - если переопределяешь new, сигнатура ф-ции может меняться, допустим: Код или может различаться только реализация этого оператора? Название: Re: приведение типа после new Отправлено: brankovic от Март 19, 2011, 20:20 на сколько все-таки морочная реализация этого оператора :) да, кривая концепция. Будь всё проще, не было бы ключевого слова new. еще вопрос остался - если переопределяешь new, сигнатура ф-ции может меняться, допустим: Код или может различаться только реализация этого оператора? может меняться, но мне ещё не пригождалось это.. надеюсь и не пригодится :) Название: Re: приведение типа после new Отправлено: Igors от Март 19, 2011, 20:35 на сколько все-таки морочная реализация этого оператора :) То да, но зачем Вам лезть во все хитросплетения? Проще запомнить всего несколько простых вещей- new возвращает что ему сказали (поддерживается компилятором как уже сказал brancovic) - new может вызываться для массива (и для каждого элемента массива будет вызван конструктор по умолчанию) - new может и не распределять память а работать "по указанному месту" причем конструктор(ы) все равно позовутся Для практической работы этого (с избытком) хватает |