воскресенье, 14 ноября 2010 г.

31. Какой результат должны возвращать операции с присваиванием?

Вообще говоря, ничего они не должны. Однако, для всех классов, по умолчанию, этот оператор означает копирование объекта и возвращение ссылки. Поэтому, при переопределении оператора, отступать от этого правила нежелательно. Но мы не обязаны использовать этот оператор только для копирования объектов.

class A{
public:
  int x;
  A& operator=(const A& a){x = a.x; return *this;} //переопределили стандартное поведение
  void operator=(int xx){x=xx;} //определили поведение при присваивании целого. Но здесь тоже можно вернуть *this.
};

int main(){
  A a;
  a=1;
  A a2;
  std::cout << (a2=a).x;
}

3 комментария:

  1. А если убрать строчку
    A& operator=(const A& a){x = a.x; return *this;}
    то все работает точно так же. Для чего она?

    ОтветитьУдалить
  2. Если мы не объявили
    A& operator=(const A& a)
    он всегда создается по умолчанию. Если убрать эту строчку, компилятор сгенерирует эквивалентный код, какой я привел в примере, поэтому и без этой строчки работает так же. А вообще переопределять бывает необходимо, если в классе есть указатели.

    ОтветитьУдалить
  3. Или есть желание, что бы оператор = выполнял некую другую функцию, а не присваивание.

    ОтветитьУдалить

Можно использовать теги <b>, <i>