一.错误情景(无法打印拷贝函数)
#include<iostream>
using namespace std;class person
{
public:person(){cout << "person默认构造函数调用" << endl;}person(int age){cout << "有参构造函数调用" << endl;}person(const person& p){cout << "拷贝构造函数调用" << endl;}~person(){cout << "析构函数调用" << endl;}private:int m_Age;
};person dowork2()
{person p1;return p1;
}void test03()
{person p = dowork2();
}int main()
{test03();return 0;
}
- 错误运行结果如下:
通过代码分析test03调用dowork2,dowork2中person p1会调用一次默认构造函数,而return p1会调用拷贝构造函数,dowork2结束后,p1是局部变量,会被析构掉,所以会调用一次析构函数,来到test03中,person p=dowork2()创建对象会调用拷贝构造函数。这里根据编译器优化的不同其实dowork2()有可能产生临时变量,后面就是对p的析构。
二.未达预期的原因(编译器优化问题)
原因:拷贝构造函数没有被调用的原因可能是因为编译器进行了优化,如返回值优化(RVO)或移动语义。这种优化可能会导致拷贝构造函数被省略掉,所以看不到相关的输出信息。
解决方法:要强制确保拷贝构造函数被调用,可以尝试关闭编译器的优化选项。具体方法取决于您使用的编译器和开发环境。
- 如果使用GCC编译器可以通过在编译时添加-fno-elide-constructors参数来禁用返回值优化。
- source.cpp是你的源文件,output是输出文件
g++ -fno-elide-constructors -o output source.cpp
2.G++编译器也相同,这种方法是–禁止特定类型的优化
g++ -fno-elide-constructors -o output source.cpp
- 运行结果如下: