运算符重载影响我的复制构造函数

Operator overloading affects my copy constructor

提问人:Karthikgr 提问时间:4/7/2020 更新时间:4/7/2020 访问量:101

问:

我正在学习运算符重载,我遇到了一个场景,我需要一个清晰的理解或替代解决方案。这是我的代码。

#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+ 函数返回我的临时对象时,还会调用复制构造函数!

我还声明了也将调用的 Assignment 运算符,因此我的结果不会显示为 15 21 ,而是在添加值之前显示 ob1 的值。

这是它的工作方式,我们必须处理所有这些场景,还是可以在我的代码或方法方式中更改任何内容?

我在堆栈溢出中遇到了类似的问题,这是它的链接: 复制构造函数和运算符重载 +

我只想知道我可以在我的代码中解决一些问题并改进,或者这就是它的工作原理,一切都应该得到照顾?如果我必须使用所有这些复制构造函数和运算符重载,如何避免这种混淆?

C++ 运算符重载 copy-constructor

评论

0赞 R Sahu 4/7/2020
你看过 stackoverflow.com/questions/4421706/ 吗......
0赞 Rish 4/7/2020
除了在复制构造函数和复制赋值运算符中复制成员外,不应执行任何其他操作。如果你的代码做得更多,你可能应该重新考虑一下。
0赞 PaulMcKenzie 4/7/2020
@Karthikgr 当你创建一个赋值运算符或复制构造函数时,不要像现在这样让它们成为存根函数——这些不是简单的丢弃函数,无关紧要。创建此类函数后,必须正确分配成员。现在,您的复制构造函数和赋值运算符除了输出消息之外什么都不做,这会导致奇怪的行为发生。
0赞 Karthikgr 4/7/2020
@PaulMcKenzie你明白了,但我只是有一个疑问,我想用代码来表达它,所以没有在那里分配任何东西。这不是为了任何项目,我只是想学习概念。
0赞 Karthikgr 4/7/2020
@Rish谢谢你,伙计,我明白了.

答:

1赞 Karthikgr 4/7/2020 #1

根据问题,复制构造函数不应通过运算符重载来调用,因此引用类型必须作为参数传递,并与引用类型一起返回,而不是按值传递。因此,它不会创建对象,并且永远不会调用复制构造函数。

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