gpt4 book ai didi

c++ - 为什么我的运算符+重载尽管被引用传递但仍调用我的拷贝构造函数?

转载 作者:行者123 更新时间:2023-12-02 10:30:19 25 4
gpt4 key购买 nike

我已经进行了一些研究,但无法找到代码行为的解释(我可能没有问正确的问题)。我正在使用VS2019在C++中工作。
该代码涉及在“数据结构和其他对象”教科书中找到的Points类。
我的类(class)现在存在:

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;
}
当我发现无法在同一行上创建类的实例,而我试图使用operator +重载添加两个实例时,首先出现了问题。
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+重载会使用默认构造函数创建一个温度点,然后使用getter和setter手动更改值,然后返回该温度点。我的理解是,仅在创建新对象时才应调用复制构造函数,而 p3则不是。
我还要说,我们还没有讨论过将指针与类/对象一起使用。
感谢您的帮助。
在此先感谢您的协助。

最佳答案

创建一个临时点并更改其值将不会调用复制构造函数。
您将在此处返回一个对象,而不是指针或对对象的引用:

point operator + (const point& A, const point& B) { //Adds x1 to x2, y1 to y2
当您从函数返回时,会从函数内部创建的对象创建一个新对象,这就是调用复制构造函数的地方。

关于c++ - 为什么我的运算符+重载尽管被引用传递但仍调用我的拷贝构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62493070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com