Кресты / Говнокод #3629 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 DarthBobr, (Updated )

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

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

    a+b = c;
    Ответить
    • Новый стандарт с тобой не согласится. Чтобы полноценно использовать возможности rvalue-references как раз нужно, чтобы возвращался неконстантный объект.
      Да и при текущем стандарте возврат константного значения убивает некоторые потенциальные оптимизации
      Ответить
  • можно было обойтись только последним оператором, так как при сложении с const char автоматически вызовется конструктор который преобразует его в MYCString
    Ответить
    • Можно, но видимо индусы посчитали, что 3 перегруженых оператора сложения лучше чем 1.)
      Класс строки вообще зачетный. В этом же классе под деструктором стоит комент, в котором пейсатель сего класса говорит, что он сделал деструктор невиртуальным, чтоб избежать создания таблицы виртуальных методов и поэтому использовать сей класс надо с осторожностью, так как много других классов наследуются от данного. Всё бы ничего, но в этом классе вообще нет виртуальных методов, и виртуальный деструктор просто нафиг не нужен.
      Ответить
      • >в этом классе вообще нет виртуальных методов, и >виртуальный деструктор просто нафиг не нужен.
        ошибаешься

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

        Что хотел сказать индус (предположение) - не удаляйте эти объекты через указатели не родительские. А от виртуального деструктора отказался в пользу эффективности (взяв пример со стандартной библиотеки, например)
        Ответить
        • взаимоисключающие параграфы?
          если должен и помечен, значит последним оператором уже не обойтись...
          Ответить
          • последний оператор принимает 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евскую эру или почему ?
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8