我无法理解构造函数和析构函数调用的顺序?什么将在本声明中首先执行A b = f(a)?有人可以帮帮我吗?
#include<iostream>
using namespace std;
class A {
int x;
public:
A(int val = 0)
:x(val) {
cout << "A " << x << endl << flush;
}
A(const A& a) {
x = a.x;
cout << "B " << x << endl << flush;
}
void SetX(int x) {
this->x = x;
}
~A() {
cout << "D " << x << endl << flush;
}
};
A f(A a) {
cout << " C " << endl << flush;
a.SetX(100);
return a;
}
int main()
{
A a(1);
A b=f(a);
b.SetX(-100);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出窗口:
A 1
B 1
C
B 100
D 100
D -100
D 1
Run Code Online (Sandbox Code Playgroud)
为什么在输出窗口的第2行打印B 1?
"为什么它会在第2行打印B 1?"
因为从此语句调用了复制构造函数
A b=f(a);
Run Code Online (Sandbox Code Playgroud)
该函数f()需要A通过值传递,因此该参数的副本在函数调用堆栈上进行.
如果您的下一个问题应该是,如何克服这种行为,并避免调用复制构造函数,您只需将A实例作为引用传递给f():
A& f(A& a) {
// ^ ^
cout << " C " << endl << flush;
a.SetX(100);
return a;
}
Run Code Online (Sandbox Code Playgroud)
附注:endl << flush;冗余BTW,std::endl包括已经冲洗.