Russian Qt Forum

Программирование => С/C++ => Тема начата: blood_shadow от Март 19, 2011, 18:55



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


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


Название: Re: приведение типа после new
Отправлено: blood_shadow от Март 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*


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


Название: Re: приведение типа после new
Отправлено: brankovic от Март 19, 2011, 20:20
на сколько все-таки морочная реализация этого оператора  :)

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

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

может меняться, но мне ещё не пригождалось это.. надеюсь и не пригодится :)


Название: Re: приведение типа после new
Отправлено: Igors от Март 19, 2011, 20:35
на сколько все-таки морочная реализация этого оператора  :)
То да, но зачем Вам лезть во все хитросплетения? Проще запомнить всего несколько простых вещей

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

Для практической работы этого (с избытком) хватает