gpt4 book ai didi

c++ - 为什么在调用重载赋值运算符时调用复制构造函数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:40 25 4
gpt4 key购买 nike

我正在尝试了解构造函数和赋值运算符的使用。我正在尝试使用下面的程序。

#include <iostream>
using namespace std;

class myclass {
int x;
public:
myclass (int p) {
cout << "calling constructor" << endl;
x = p;
}
myclass () {
cout << "calling constructor with no arguments" << endl;
x = 0;
}
myclass (myclass &t) {
cout << "calling copy constructor" << endl;
x = t.x;
}

myclass operator=(myclass &t) {
cout << "calling assignment operator" << endl;
x = t.x;
return *this;
}

void show () {
cout << "val = " << x << endl;
}
};


int main() {
myclass a1;
a1.show();
myclass a2 = a1;
a2.show();
myclass a3(a2);
a3.show();
myclass a4(200);
a2 = a4;
a2.show();
return 0;
}

输出:

calling constructor with no arguments // call 1
val = 0
calling copy constructor // call 2
val = 0
calling copy constructor // call 3
val = 0
calling constructor // call 4
calling assignment operator // call 5
calling copy constructor // call 6 i am not able to understand this print line
val = 200

调用 1,是从 myclass a1 完成的;

调用 2,是从 myclass a2 = a1 完成的;

调用 3,由 myclass a3(a2) 完成;

调用 4,从 myclass a4(200) 完成;

调用 5,从 a2 = a4 开始;

但我无法获得调用 6 的来源,它是从指令中调用的:

a2 = a4;

但是,它如何调用复制构造函数?

任何帮助/指针都将是一个很大的帮助。我正在从 c 进入 cpp,因此请多多包涵。

最佳答案

 myclass operator=(myclass &t) {
cout << "calling assignment operator" << endl;
x = t.x;
return *this;
}

上述函数按值返回。按值返回是调用复制构造函数的情况之一。另外 AFAIK,这并不总是正确的(通过值调用复制构造函数返回),因为一些编译器实现了返回值优化。

关于c++ - 为什么在调用重载赋值运算符时调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37297978/

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