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

    +13

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    class A
    {
    public:
    
      A& operator=(const A &a)
      {
        this->A::A(a);
        return *this;
      };
    // ...
    };

    Правильный оператор присваивания!

    Запостил: guest, 16 Июня 2009

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

    • valexey:
      А как оно вообще компилируется то? Что за компилятор?
      Ответить
    • А чего ему не компилироваться? Временный объект по ходу создается.
      Ответить
    • valexey:
      this->A::A(a); --это ну никак не создание нового объекта.

      Если бы было написано нечто типа:
      A(a); -- это да, это эквивалентно A a, и, кстати, тоже бы не компилировалось т.к. переменная под именем "a" уже существует.

      Поэтому интересно, что за чудо компилятор допускает подобную конструкцию. Сколь я помню, стандарт не допускает непосредственного вызова конструкторов.
      Ответить
    • nb:
      VS 2005 компилирует это и оно вполне работает )
      Ответить
    • #4,
      этому компилятору пофиг на всякие стандарты, да еще и не мелкософтовкие
      Ответить
    • а код то нормальный
      Ответить
    • Маргарита Вольфганговна:
      Нормальный код, может, разве, не совсем очевиден.
      Присваивание происходит через вызов конструктора копий
      Ответить
    • ахалай-махалай:
      Как это компилируется?!

      А вообще это известный прикол. Только правильно он пишется так:

      class A
      {
      public:

      A& operator=(const A &a)
      {
      new(this) A(a);
      return *this;
      };
      // ...
      };

      Конструируем новый объект без выделения памяти
      Ответить
    • показать все, что скрыто>>new(this) A(a);

      что это за высер? нах?
      Ответить
    • #9
      это размещающий new.
      Ответить
    • #9: использовал когда-нибудь аллокаторы?
      Ответить
    • А вызывать деструктор кто будет???
      Ответить
    • Говнокоду это делать неположено )
      Ответить
    • баян
      Ответить

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