Почему мой оператор + перегрузка вызывает мой конструктор копирования, несмотря на то, что он передается по ссылке? - PullRequest
1 голос
/ 21 июня 2020

Я провел небольшое исследование, но не смог найти объяснения поведения моего кода (возможно, я задаю неправильные вопросы). Я работаю на C ++, использую VS2019.

Код относится к классу Points из учебника по структурам данных и другим объектам.

Мой класс в том виде, в каком он существует сейчас:

class point {
private:
    double x;
    double y;
public:
    //constructors
    point(double ix = 0.0, double iy = 0.0) {
        x = ix;
        y = iy;
    }
    point(const point &z) {
        x = z.getX();
        y = z.getY();
        cout << "copy constructor triggered" << endl;
        cout << x << "," << y << endl;
    }

    //assignment
    void operator = (const point& result) {
        x = result.getX();
        y = result.getY();
        cout << "assignment overload triggered" << endl;
        cout << x << "," << y << endl;
    }

    //getters
    double getX() const {
        return x;
    }
    double getY() const{
        return y;
    }

    //setters
    void setX(double newX) {
        x = newX;
    }
    void setY(double newY) {
        y = newY;
    } //other function members are omitted
}//end point() class

point operator + (const point& A, const point& B) { //Adds x1 to x2, y1 to y2
    point n;

    n.setX(A.getX()+ B.getX());
    n.setY(A.getY()+ B.getY());
    return n;
}

Проблема впервые возникла, когда я обнаружил, что не могу создать экземпляр класса в той же строке, что и пытался добавить два экземпляра, используя оператор + перегрузка.

point p1(5, 3);
point p2(12, 9);
point p3 = p1 + p2; //gives the following error: class "point" has no suitable copy constructor

Я обнаружил, что сделал ошибку, забыв включить «const» в свой конструктор копирования. Решив эту проблему с помощью конструктора копирования, я смог заставить код работать достаточно хорошо, чтобы отправить свое задание, но я не был удовлетворен своим пониманием.

В процессе решения этой проблемы я бы также добавлена ​​перегрузка оператора присваивания (=) внутри определения класса. Выполнив некоторую отладку консоли, я обнаружил странный образец:

point p1(5, 3);
point p2(12, 9);
point p3;
p3 = p1 + p2; //calls both copy constructor and assignment instructor
point p4 = p1 + p2; // calls only copy constructor

point p5;
p5 = p1; //calls only assignment operator
point p6 = p2; // calls only copy constructor

Итак, теперь мне интересно , почему p3 = p1 + p2 вызывает и конструктор копирования, и перегрузку присваивания. Вызывает ли компилятор конструктор копирования при добавлении точек? Я не думал, что это будет так, поскольку перегрузка operator+ создает временную точку с конструктором по умолчанию, затем вручную изменяет значения с помощью геттеров и сеттеров, а затем возвращает эту временную точку. Насколько я понимаю, конструктор копирования должен вызываться только при создании нового объекта , а p3 - нет.

Я также должен сказать, что мы еще не обсуждали использование указателей с классами /objects.

Любая помощь здесь приветствуется. Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 21 июня 2020

Создание временной точки и изменение ее значений не вызовет конструктор копирования.

Здесь вы возвращаете объект, а не указатель или ссылку на объект:

point operator + (const point& A, const point& B) { //Adds x1 to x2, y1 to y2

когда вы возвращаетесь из своей функции, новый объект создается из того, который у вас был внутри вашей функции, и именно здесь вызывается конструктор копирования.

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