Перегрузка оператора присваивания - PullRequest
0 голосов
/ 01 марта 2011

Мы можем перегрузить оператор присваивания как обычную функцию, но мы не можем перегрузить оператор присваивания как дружественную функцию.Почему?

Ответы [ 4 ]

4 голосов
/ 01 марта 2011

Поскольку стандарт C ++ говорит об этом, статья 13.5.3 / 1:

Оператор присваивания должен быть реализован с помощью нестатической функции-члена с точно одним параметром.Поскольку оператор оператора копирования = неявно объявляется для класса, если он не объявлен пользователем (12.8), оператор назначения базового класса всегда скрыт оператором копирования копии производного класса.

Это все, что вам действительно нужно знать.Дружественная функция не является функцией-членом, поэтому ее нельзя использовать для перегрузки оператора присваивания.

0 голосов
/ 28 декабря 2016

Вы не можете «расширить» оператор присваивания с помощью «свободной функции» вне класса, но вы можете спроектировать класс так, чтобы он позволял ему:

Data.h

class Data {
public:
    Data& operator=(const Data& lhs) { /*...*/; return *this; }
    template <typename T> Data& operator=(const T& lhs) {
        return assign(*this, lhs); // Magic right here...
    }
private:
    // ...
};

Point.h

class Point {
public:
    float x,y;
    Point& operator=(const Point& lhs) { x = lhs.x, y = lhs.y; return *this; }
    template <typename T> Point& operator=(const T& lhs) {
        return assign(*this, lhs); // Magic right here...
    }
};

Assignment.h

Data& assign(const Data& lhs, const Point& rhs) {
    lhs["x"] = rhs.x;
    lhs["y"] = rhs.y;
    return lhs;
}

Point& assign(const Point& lhs, const Data& rhs) {
    rhs.query("x", lhs.x) || rhs.query(0, lhs.x);
    rhs.query("y", lhs.y) || rhs.query(1, lhs.y);
    return lhs;
}
0 голосов
/ 28 января 2012

Разница между перегрузкой функцией-другом и перегрузкой функцией-членом заключается в том, что вызывающий объект должен быть первым операндом в перегрузке функцией-членом , тогда как нет ограничения в перегрузке функцией друга . Это причина за стандарт. Точно так же некоторые другие операторы, требующие, чтобы первый операнд был вызывающей функцией, должны быть перегружены с использованием функций-членов (примеры: =, [], ->, и ( )).

0 голосов
/ 01 марта 2011

Если вы хотите написать:

MyClassObject = MyFriendObject;

Тогда вы захотите реализовать конструктор, который принимает константную ссылку на класс друга в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...