1. C++ / Говнокод #3629

    +157

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    MYCString  myexport
    operator+(const MYCString& s, const char* pstr)
    {
      return MYCString(s, pstr);	// Use the special concatenation constructor
    }            
    
    MYCString myexport
    operator+(const char* c, const MYCString& s)
    {
      return MYCString(c) + s.data();
    }
    
    MYCString  myexport
    operator+(const MYCString& a, const MYCString& s)
    {
      return a + s.data();
    }

    Название класса изменено. Он встречается в одном большом проекте в библиотеке-заменителе STL )

    Запостил: DarthBobr, 02 Июля 2010

    Комментарии (24) RSS

    • operator+ должен возвращать const значение иначе такое скомпилится без ошибки

      a+b = c;
      Ответить
      • Новый стандарт с тобой не согласится. Чтобы полноценно использовать возможности rvalue-references как раз нужно, чтобы возвращался неконстантный объект.
        Да и при текущем стандарте возврат константного значения убивает некоторые потенциальные оптимизации
        Ответить
        • Интересненько...
          1)Можно на ссылочки пофапать поглядеть?
          2)Какие оптимизации это убивает?
          Ответить
          • скорее всего он об move-конструкторе...
            Ответить
          • 1) http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ и далее по ссылкам в конце каждой части.
            2) Убивается возможность copy elision.
            Ответить
            • >Want Speed? Pass by Value!
              Очень нестандартное утверждение... %) Нужно поразбираться...
              Ответить
    • можно было обойтись только последним оператором, так как при сложении с const char автоматически вызовется конструктор который преобразует его в MYCString
      Ответить
      • Можно, но видимо индусы посчитали, что 3 перегруженых оператора сложения лучше чем 1.)
        Класс строки вообще зачетный. В этом же классе под деструктором стоит комент, в котором пейсатель сего класса говорит, что он сделал деструктор невиртуальным, чтоб избежать создания таблицы виртуальных методов и поэтому использовать сей класс надо с осторожностью, так как много других классов наследуются от данного. Всё бы ничего, но в этом классе вообще нет виртуальных методов, и виртуальный деструктор просто нафиг не нужен.
        Ответить
        • >в этом классе вообще нет виртуальных методов, и >виртуальный деструктор просто нафиг не нужен.
          ошибаешься

          Виртуальный деструктор нужен, если объекты удаляются через указатель на базовай объект
          Хорошее правило - если от класса будут наследоваться, в нем нужен виртуальный деструктор

          Что хотел сказать индус (предположение) - не удаляйте эти объекты через указатели не родительские. А от виртуального деструктора отказался в пользу эффективности (взяв пример со стандартной библиотеки, например)
          Ответить
      • если конечно MYCString(const char *) не помечен как explicit.
        Ответить
        • он должен быть помечен как explicit...
          Ответить
          • ... при его определении, которое здесь было опущено.
            Ответить
          • взаимоисключающие параграфы?
            если должен и помечен, значит последним оператором уже не обойтись...
            Ответить
            • последний оператор принимает MYCString который может быть сконструирован из explicit MYCString( const char* )...
              Ответить
              • вот так (при условии наличия ещё и оператора присваивания) может:

                MYCString a("string1");
                a = a + MYCString("string2");

                а вот так уже нет:

                MYCString a("string1");
                a = a + "string2";
                Ответить
          • Ещё вопрос, был ли в 1995 году explicit введен в язык или еще нет.
            Ответить
      • глюк
        Ответить
        • Помоему тоже. Конструктор в С++ неявно вызывается только для параметров функций передаваемых по значению. Для операторов это не так.
          Ответить
          • вызывается, только что проверил..
            class Vector
            {
            Vector( float x ){}

            Vector& operator = (const Vector& other)
            {
            }
            } vec;

            такая строка будет работать
            vec = 3.0f;
            Ответить
          • Да не, для операторов все то же самое. Я в прошлом посте сначала написал про explicit, потом уже увидел, что про него уже написали. "глюк" подразумевал, что мой пост им является. :)
            Ответить
    • "в библиотеке-заменителе STL ) "
      А зачем ? Создавался в доSTLевскую эру или почему ?
      Ответить

    Добавить комментарий