Я изучал перегрузку операторов и столкнулся со сценарием, в котором мне нужно ясное понимание или альтернативное решение. Вот мой код.
#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 или это что-то, что можно изменить в моем коде или в подходе?
Я столкнулся с похожим вопросом при переполнении стека, и вот ссылка на него: Перегрузка конструктора и оператора копирования +
Все, что я хочу знать, это то, что я могу адрес в моем коде и улучшить или это так, как это работает, и обо всем нужно позаботиться? Как избежать этой путаницы, если бы мне пришлось использовать все эти конструкторы копирования и перегрузки операторов?