【发布时间】:2020-04-07 16:20:28
【问题描述】:
我正在学习运算符重载,我遇到了一个需要清晰理解或替代解决方案的场景。这是我的代码。
#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
在上面的代码中,当operator+按照operator重载规则被重载时,operator右边的对象作为按值传递传递给operator+函数。
因此这使我的复制构造函数被调用,在上面的代码中,我没有在我的复制构造函数中添加任何逻辑,因此它不会影响我的代码,但是如果其中存在一些逻辑并且会影响我的代码?我应该如何避免调用复制构造函数?当我从 operator+ 函数返回我的临时对象时,也会调用复制构造函数!
我还声明了赋值运算符,它也将被调用,因此我的结果不会显示为 15 21 ,而是显示 ob1 在加法值之前的值。
这是它的工作方式,我们必须处理所有这些场景,还是它可以在我的代码或方法中进行更改?
我在堆栈溢出中遇到了类似的问题,这里是它的链接: Copy Constructor And Operator Overloading +
我只想知道我可以在我的代码中解决什么问题并进行改进,或者这就是它的工作方式,一切都应该得到照顾?如果我必须使用所有这些复制构造函数和运算符重载,如何避免这种混淆?
【问题讨论】:
-
除了在复制构造函数和复制赋值运算符中复制成员之外,您不应该做任何事情。如果你的代码做的不止这些,你可能应该重新考虑一下。
-
@Karthikgr 创建赋值运算符或复制构造函数时,不要像现在那样将它们设为存根函数——这些不仅仅是无关紧要的丢弃函数。创建此类函数后,您必须正确分配成员。现在,您的复制构造函数和赋值运算符只输出一条消息,这会导致出现奇怪的行为。
-
@PaulMcKenzie 你明白了,但我只是有一个疑问,我想用代码来表达它,所以没有在那里分配任何东西。它不适用于任何项目,我只是想学习概念.
-
@Rish ya 谢谢我明白了。
标签: c++ operator-overloading copy-constructor