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

Я изучал перегрузку операторов и столкнулся со сценарием, в котором мне нужно ясное понимание или альтернативное решение. Вот мой код.

#include<iostream>

class loc {
    int longitude, latitude;
public:
    loc() {
        longitude = 0;
        latitude = 0;
        int i = 0;
        std::cout << "Constructor Called " << i++ << std::endl;
    }
    loc(int lg,int lt) {
        longitude = lg;
        latitude = lt;
    }
    loc(loc const& op2) {
        std::cout << "Copy Constructor Called " << std::endl;
    }
    void operator= (loc op2){
        std::cout << "Assignment operator called " << std::endl;
    }
    void show() {
        std::cout << longitude << " " << latitude << std::endl;
    }
    loc operator+ (loc op2);
};

loc loc::operator+ (loc op2) {
    loc temp;
    temp.longitude = this->longitude + op2.longitude;
    temp.latitude = latitude + op2.latitude;
    return temp;
}


int main() {

    loc ob1(5,6), ob2(10,15);
    ob1.show();
    ob2.show();

    ob1 = ob1 + ob2;
    ob1.show();
    return 0;
}

This will be the output of my program:

5 6
10 15
Copy constructor called
Constructor called 0
Copy constructor called
Assignment operator called
5 6

В приведенном выше коде, когда оператор + перегружен в соответствии с правилами перегрузки операторов, объект справа от оператора передается в функцию оператора + как передаваемое по значению.

Таким образом, это заставляет мой конструктор копирования вызываться, здесь в приведенном выше коде я не добавил логики c в мою функцию конструктора копирования, так что это не влияет на мой код, но что если некоторые логики c присутствует в этом, и это влияет на мой код? Как я должен избегать вызова конструктора копирования? Когда я возвращаю свой временный объект из функции operator +, тогда также вызывается конструктор копирования!

Я также объявил оператор присваивания, который также будет вызываться, и поэтому мой результат не будет отображаться как 15 21, но отображает значение ob1's перед добавленной стоимостью.

Так ли это будет работать, и мы должны справиться со всем этим сценарием ios или это что-то, что можно изменить в моем коде или в подходе?

Я столкнулся с похожим вопросом при переполнении стека, и вот ссылка на него: Перегрузка конструктора и оператора копирования +

Все, что я хочу знать, это то, что я могу адрес в моем коде и улучшить или это так, как это работает, и обо всем нужно позаботиться? Как избежать этой путаницы, если бы мне пришлось использовать все эти конструкторы копирования и перегрузки операторов?

1 Ответ

1 голос
/ 07 апреля 2020

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

loc& loc::operator+ (loc& op2) {
    longitude = this->longitude + op2.longitude;
    latitude = latitude + op2.latitude;
    return *this;
}
...