Russian Qt Forum
Ноябрь 24, 2024, 00:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: приведение типа после new  (Прочитано 3122 раз)
blood_shadow
Гость
« : Март 19, 2011, 18:55 »

Добрый вечер
вот стало интересно, а как приводиться тип выражения возращаемого new к необходимому,
например:
Код
C++ (Qt)
SomeClass *p_someClass = new SomeClass;
 
как видим здесь явно не приводится возвращаемое значение оператором new(а оно void*)
к типу SomeClass *
Вопрос - так кто делает работу по приведению типа void* в SomeClass *, ведь void* можно только
явно привести к необходимому типу?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Март 19, 2011, 19:08 »

Добрый вечер
вот стало интересно, а как приводиться тип выражения возращаемого new к необходимому,
например:
Код
C++ (Qt)
SomeClass *p_someClass = new SomeClass;
 
как видим здесь явно не приводится возвращаемое значение оператором new(а оно void*)
к типу SomeClass *
Вопрос - так кто делает работу по приведению типа void* в SomeClass *, ведь void* можно только
явно привести к необходимому типу?
Ну если Вы создаете "SomeClass" и присваиваете возвращаемое значение тому же типу (SomeClass) то и приводить нечего - просто копирование. Оператор new возвращает указанный тип, а не void *
Записан
blood_shadow
Гость
« Ответ #2 : Март 19, 2011, 19:34 »

Оператор new возвращает указанный тип, а не void *
подождите как указанный тип, если в файле <new> определено так :
Код:
void* operator new(std::size_t) throw (std::bad_alloc);
void* operator new[](std::size_t) throw (std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();
void* operator new(std::size_t, const std::nothrow_t&) throw();
void* operator new[](std::size_t, const std::nothrow_t&) throw();
void operator delete(void*, const std::nothrow_t&) throw();
void operator delete[](void*, const std::nothrow_t&) throw();

// Default placement versions of operator new.
inline void* operator new(std::size_t, void* __p) throw() { return __p; }
inline void* operator new[](std::size_t, void* __p) throw() { return __p; }

// Default placement versions of operator delete.
inline void  operator delete  (void*, void*) throw() { }
inline void  operator delete[](void*, void*) throw() { }

помойму, тут ясно сказано что возращаеться именно void*
Записан
brankovic
Гость
« Ответ #3 : Март 19, 2011, 19:48 »

помойму, тут ясно сказано что возращаеться именно void*

Там-то да, но в C++ оператор new это не просто список каких-то функций или шаблонная функция. operator new это специальная конструкция языка. Переопределять можно тот, который в заголовке new, но когда в коде написано:

new MyClass ();

компилятор генерит

1. вызов void * operator new (sizeof (MyClass)),
2. вызов конструктора MyClass по этому адресу

и тип возвращаемого значения вместо void * подставляет MyClass*
Записан
blood_shadow
Гость
« Ответ #4 : Март 19, 2011, 20:10 »

помойму, тут ясно сказано что возращаеться именно void*

Там-то да, но в C++ оператор new это не просто список каких-то функций или шаблонная функция. operator new это специальная конструкция языка. Переопределять можно тот, который в заголовке new, но когда в коде написано:

new MyClass ();

компилятор генерит

1. вызов void * operator new (sizeof (MyClass)),
2. вызов конструктора MyClass по этому адресу

и тип возвращаемого значения вместо void * подставляет MyClass*

на сколько все-таки морочная реализация этого оператора  Улыбающийся
еще вопрос остался - если переопределяешь new, сигнатура ф-ции может меняться, допустим:
Код
C++ (Qt)
void* operator new(std::size_t, int len, double **end) throw (std::bad_alloc);
 
или может различаться только реализация этого оператора?
Записан
brankovic
Гость
« Ответ #5 : Март 19, 2011, 20:20 »

на сколько все-таки морочная реализация этого оператора  Улыбающийся

да, кривая концепция. Будь всё проще, не было бы ключевого слова new.

еще вопрос остался - если переопределяешь new, сигнатура ф-ции может меняться, допустим:
Код
C++ (Qt)
void* operator new(std::size_t, int len, double **end) throw (std::bad_alloc);
 
или может различаться только реализация этого оператора?

может меняться, но мне ещё не пригождалось это.. надеюсь и не пригодится Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 19, 2011, 20:35 »

на сколько все-таки морочная реализация этого оператора  Улыбающийся
То да, но зачем Вам лезть во все хитросплетения? Проще запомнить всего несколько простых вещей

- new возвращает что ему сказали (поддерживается компилятором  как уже сказал brancovic)
- new может вызываться для массива (и для каждого элемента массива будет вызван конструктор по умолчанию)
- new может и не распределять память а работать "по указанному месту" причем конструктор(ы) все равно позовутся

Для практической работы этого (с избытком) хватает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 23.