【C++】拷贝构造函数于临时变量小探
今天遇到了一个关于拷贝构造于临时变量的小问题,在这里记录一下。
这是代码:
#include <iostream>
using namespace std;
class s1mple {
public:
int i;
s1mple() : i(23) {
cout << "constructor" << endl;
}
s1mple(const s1mple& x) {
cout << "copy constructor" << endl;
i = x.i;
}
~s1mple() {
cout << "deconstruct" << endl;
}
};
s1mple func() {
s1mple s1;
s1.i = -23;
return s1;
}
int main() {
s1mple xt = func();
return 0;
}
程序输出
constructor
copy constructor
deconstruct
deconstruct
如果修改程序如下:
#include <iostream>
using namespace std;
class s1mple {
public:
int i;
s1mple() : i(23) {
cout << "constructor" << endl;
}
s1mple(const s1mple& x) {
cout << "copy constructor" << endl;
i = x.i;
}
~s1mple() {
cout << "deconstruct" << endl;
}
};
s1mple func() {
s1mple s1;
s1.i = -23;
return s1;
}
int main() {
func();
return 0;
}
输出仍然不变
constructor
copy constructor
deconstruct
deconstruct
通过对内存地址的比对发现,在第一种情况下,返回值直接作为xt
的拷贝构造函数的引用值参与拷贝构造,而在第二种情况下,返回值是作为构造临时变量的拷贝构造函数的参数参与拷贝构造。
另外注意,我的生成环境是 visual studio 2019
的 debug
模式,在 release
模式下拷贝构造并没有被触发(?)