
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.100] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Жжёшь ![]() Цитата Craft @ Я никогда не видел что ктото использовал неявное преобразование на подобие этого ![]() ![]() S s = 10; Тебя послушать, так шаблон std::complex создан на коленках начинающими программистами ![]() |
![]() |
Сообщ.
#17
,
|
|
Цитата vovan01 @ Один из способов из способов избежать создания временных объектов это по возможности использовать объявления конструкторов как Глупость. |
Сообщ.
#18
,
|
|
|
Цитата Бобёр @ Craft и Archimed раскрыли тему полностью ![]() Цитата Один из способов из способов избежать создания временных объектов это по возможности использовать объявления конструкторов как временные объекты здесь вообще не при чём. лучше почитай литературу, могу дать ссылку на книжку ![]() а это другой сучий когда можно использовать explicit As a rule, every constructor that takes a single argument, including constructors that take multiple arguments with default values such as the following, should be explicit, unless you have a good reason to allow implicit conversions: ![]() ![]() class File { public: //this cоnstructor may be called with a single argument //it's therefore declared explicit: explicit File(const char *name, ios_base::openmode mode=ios_base::out, long protection = 0666); }; |
Сообщ.
#19
,
|
|
|
и где тут встечаются слова "временные объекты"?
тут видны слова "implicit conversions" - о чем все и говорят |
![]() |
Сообщ.
#20
,
|
|
Цитата vovan01 @ лучше почитай литературу, могу дать ссылку на книжку ![]() Редко встречаю такой аргумент, но всегда ему умиляюсь ![]() |
Сообщ.
#21
,
|
|
|
предлагаю с компилить следующий код
![]() ![]() #include <cstdlib> #include <iostream> using namespace std; template<typename T > class ObjectBase { public : ObjectBase(){ cout <<"In constructor_1"<<endl; } ObjectBase(T ob): i(ob){ cout <<"In constructor_2"<<endl; } void GetId(){ cout<< i <<endl; } ~ObjectBase(){ cout <<"In destructor"<<endl; } private: T i; }; template<typename U> void f( ObjectBase<U> const &o) { cout <<"In funstion f"<<endl; } int main(int argc, char *argv[]) { cout<<"In main"<<endl; ObjectBase<int> obj_1; obj_1 = 10; obj_1.GetId(); f(ObjectBase<int>()); system("PAUSE"); return EXIT_SUCCESS; } а после этого по пробуйте вот это ![]() ![]() #include <cstdlib> #include <iostream> using namespace std; template<typename T > class ObjectBase { public : explicit ObjectBase(){ cout <<"In constructor_1"<<endl; } explicit ObjectBase(T ob): i(ob){ cout <<"In constructor_2"<<endl; } void GetId(){ cout<< i <<endl; } ~ObjectBase(){ cout <<"In destructor"<<endl; } private: T i; }; template<typename U> void f( ObjectBase<U> const &o) { cout <<"In funstion f"<<endl; } int main(int argc, char *argv[]) { cout<<"In main"<<endl; ObjectBase<int> obj_1(10); obj_1.GetId(); f(ObjectBase<int>()); system("PAUSE"); return EXIT_SUCCESS; } Теперь сравните результаты думаю что будет ясно что преобразование ![]() ![]() obj_1 = 10; создаёт временный объект. ![]() |
![]() |
Сообщ.
#22
,
|
|
vovan01, а ты попробуй во втором случае убрать explicit и скомпилировать, ага?
С тем же успехом можно было в первом варианте написать return 0, а во втором - return EXIT_SUCCESS и заявить, что EXIT_SUCCESS помогает избежать временных объектов. explicit, как и EXIT_SUCCESS к временным объектам никакого отношения не имеет. |
Сообщ.
#23
,
|
|
|
Цитата archimed7592 @ vovan01, а ты попробуй во втором случае убрать explicit и скомпилировать, ага? С тем же успехом можно было в первом варианте написать return 0, а во втором - return EXIT_SUCCESS и заявить, что EXIT_SUCCESS помогает избежать временных объектов. explicit, как и EXIT_SUCCESS к временным объектам никакого отношения не имеет. ты просто не понял ничего если оставить линию ![]() ![]() obj_1 = 10; то по просту у тебя во втором случае компилятор выдаст ошибку по этому я и написал. ![]() ![]() ObjectBase<int> obj_1(10); archimed7592 - так ты убедился что в первом случае создаётся временный объект? |
![]() |
Сообщ.
#24
,
|
|
Цитата vovan01 @ ты просто не понял ничего Куда уж мне ![]() Цитата vovan01 @ если оставить линию obj_1 = 10; то по просту у тебя во втором сучий компилятор выдаст ошибку по этому я и написал. ObjectBase<int> obj_1(10); Вы делаете мне смешно ![]() Почему ты не заменил эту строку на return 0; ? Из твоих слов получается, что присваивание и конструирование - это одно и то же. Что ж, тогда я заявляю, что присваивание и return 0 - это одно и то же ![]() Если класс подразумевает операцию присваивания, то тебе придётся её реализовать и explicit никак на это не повлияет. Если ты захочешь реализовать эту операцию "без временных объектов" - ты её реализуешь. Не захочешь - будут временные объекты(или их не будет - это уже компилятору виднее, стандарт ему руки развязывает). При чём здесь explicit? Класс с операцией присваивания int и класс без таковой операции - это два разных класса, не надо подавать их как один и тот же класс с разным выходом временных объеков. Цитата vovan01 @ archimed7592 - так ты убедился что в первом случай создаётся временный объект? Делать мне больше нечего. |
Сообщ.
#25
,
|
|
|
archimed7592
Цитата archimed7592 @ Почему ты не заменил эту строку на return 0; ? я тебе про Фому а ты мне про Ерему. Слушай я прогу написал в IDE Dev-C++, если ты слыхал про такую, там EXIT_SUCCESS = 0 |
Сообщ.
#26
,
|
|
|
vovan01, сравни:
![]() ![]() ObjectBase<int> obj_1; obj_1 = 10; и ![]() ![]() ObjectBase<int> obj_1(10); Мне почему-то не кажется, что это одно и то же. И при чем тут explicit? ЗЫ Да и копировщик добавить бы не мешало |
Сообщ.
#27
,
|
|
|
Затянувшаяся жара определённо плохо влияет на некоторых людей.
|
Сообщ.
#28
,
|
|
|
Цитата pan2004 @ Мне почему-то не кажется, что это одно и то же. И при чем тут explicit? ЗЫ Да и копировщик добавить бы не мешало Ну, автор примера имел в виду, что в первом случае для присваивания будет сначала создан временный объект (путем вызова соответствующего конструктора), после чего будет собственно присваивание. А во втором случае, если просто добавить explicit, то присваивание не пройдет: ![]() ![]() hellow_world.cpp:37: error: no match for 'operator=' in 'obj_1 = 10' hellow_world.cpp:7: note: candidates are: ObjectBase<int>& ObjectBase<int>::operator=(const ObjectBase<int>&) т. к. не будет выполнено неявное приведение 10-ти к ObjectBase. |