На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> explicit для чего нужен?
    Цитата Craft @
    Просто насколько мне не изменяет памъять то у windows под кучю выделяется 1Мб

    Жжёшь :lool:

    Цитата Craft @
    Я никогда не видел что ктото использовал неявное преобразование на подобие этого
    ExpandedWrap disabled
      S s = 10;
    кроме тестовых каких нибуть примеров. Начинающий программист в основном не использует explicit, а опытный программист просто напросто никогда не напишет такой код который я написал више.

    Тебя послушать, так шаблон std::complex создан на коленках начинающими программистами :lol:
      Цитата vovan01 @
      Один из способов из способов избежать создания временных объектов это по возможности использовать объявления конструкторов как

      Глупость.
        Цитата Бобёр @
        Craft и Archimed раскрыли тему полностью :yes:

        Цитата
        Один из способов из способов избежать создания временных объектов это по возможности использовать объявления конструкторов как

        временные объекты здесь вообще не при чём.

        лучше почитай литературу, могу дать ссылку на книжку ;)

        а это другой сучий когда можно использовать 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:
        ExpandedWrap disabled
          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);
          };
        Сообщение отредактировано: vovan01 -
          и где тут встечаются слова "временные объекты"?
          тут видны слова "implicit conversions" - о чем все и говорят
          Сообщение отредактировано: Alek86 -
            Цитата vovan01 @
            лучше почитай литературу, могу дать ссылку на книжку ;)

            Редко встречаю такой аргумент, но всегда ему умиляюсь :rolleyes:. С тем же успехом и тебе можно посоветовать "почитать литературу".
              предлагаю с компилить следующий код
              ExpandedWrap disabled
                #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;
                }


              а после этого по пробуйте вот это
              ExpandedWrap disabled
                #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;
                }


              Теперь сравните результаты думаю что будет ясно что преобразование
              ExpandedWrap disabled
                 obj_1 = 10;

              создаёт временный объект. :whistle:
                vovan01, а ты попробуй во втором случае убрать explicit и скомпилировать, ага?
                С тем же успехом можно было в первом варианте написать return 0, а во втором - return EXIT_SUCCESS и заявить, что EXIT_SUCCESS помогает избежать временных объектов. explicit, как и EXIT_SUCCESS к временным объектам никакого отношения не имеет.
                  Цитата archimed7592 @
                  vovan01, а ты попробуй во втором случае убрать explicit и скомпилировать, ага?
                  С тем же успехом можно было в первом варианте написать return 0, а во втором - return EXIT_SUCCESS и заявить, что EXIT_SUCCESS помогает избежать временных объектов. explicit, как и EXIT_SUCCESS к временным объектам никакого отношения не имеет.

                  ты просто не понял ничего если оставить линию
                  ExpandedWrap disabled
                    obj_1 = 10;

                  то по просту у тебя во втором случае компилятор выдаст ошибку по этому я и написал.
                  ExpandedWrap disabled
                    ObjectBase<int> obj_1(10);


                  archimed7592 - так ты убедился что в первом случае создаётся временный объект?
                  Сообщение отредактировано: vovan01 -
                    Цитата vovan01 @
                    ты просто не понял ничего

                    Куда уж мне :rolleyes:.

                    Цитата vovan01 @
                    если оставить линию
                    obj_1 = 10;

                    то по просту у тебя во втором сучий компилятор выдаст ошибку по этому я и написал.
                    ObjectBase<int> obj_1(10);

                    Вы делаете мне смешно :lol:.
                    Почему ты не заменил эту строку на return 0; ?
                    Из твоих слов получается, что присваивание и конструирование - это одно и то же. Что ж, тогда я заявляю, что присваивание и return 0 - это одно и то же ;).

                    Если класс подразумевает операцию присваивания, то тебе придётся её реализовать и explicit никак на это не повлияет. Если ты захочешь реализовать эту операцию "без временных объектов" - ты её реализуешь. Не захочешь - будут временные объекты(или их не будет - это уже компилятору виднее, стандарт ему руки развязывает). При чём здесь explicit?

                    Класс с операцией присваивания int и класс без таковой операции - это два разных класса, не надо подавать их как один и тот же класс с разным выходом временных объеков.

                    Цитата vovan01 @
                    archimed7592 - так ты убедился что в первом случай создаётся временный объект?

                    Делать мне больше нечего.
                      archimed7592
                      Цитата archimed7592 @
                      Почему ты не заменил эту строку на return 0; ?


                      я тебе про Фому а ты мне про Ерему.

                      Слушай я прогу написал в IDE Dev-C++, если ты слыхал про такую, там EXIT_SUCCESS = 0
                        vovan01, сравни:
                        ExpandedWrap disabled
                          ObjectBase<int> obj_1;
                          obj_1 = 10;

                        и
                        ExpandedWrap disabled
                          ObjectBase<int> obj_1(10);

                        Мне почему-то не кажется, что это одно и то же. И при чем тут explicit?
                        ЗЫ Да и копировщик добавить бы не мешало
                        Сообщение отредактировано: pan2004 -
                          Затянувшаяся жара определённо плохо влияет на некоторых людей.
                            Цитата pan2004 @
                            Мне почему-то не кажется, что это одно и то же. И при чем тут explicit?
                            ЗЫ Да и копировщик добавить бы не мешало

                            Ну, автор примера имел в виду, что в первом случае для присваивания будет сначала создан временный объект (путем вызова соответствующего конструктора), после чего будет собственно присваивание. А во втором случае, если просто добавить explicit, то присваивание не пройдет:
                            ExpandedWrap disabled
                              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.
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0439 ]   [ 15 queries used ]   [ Generated: 16.07.25, 11:46 GMT ]