复制构造函数调用时机(知识点记录)
-
测试代码:
#include <iostream> using namespace std; class Point { public: Point() { m_x = 0; m_y = 0; } Point(int x,int y) { cout << "有参构造" << endl; m_x = x; m_y = y; } Point(const Point& p) { cout << "拷贝构造" << endl; m_x = p.m_x; m_y = p.m_y; } private: int m_x, m_y; }; Point fun1() { Point a; return a; } void fun2(Point a) { return; } int main() { Point a; Point b(a);//拷贝构造函数调用1 Point c(1,1); fun1();//拷贝构造函数调用2 fun2(a);//拷贝构造函数调用3 fun2(b);//同情况3 fun2(c);//同情况3 system("pause"); }
-
可以直接打断点调试,可以发现有以下三种情况会发生拷贝构造函数调用(均在代码中标出)
-
情况一:定义一个对象时,以本类的另一个对象作为初始值,发生拷贝构造
-
情况二:如果函数形参是类的对象,调用函数时,将使用实参对象初始化形参对象时发生拷贝构造
-
情况三:如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个无名对象,传递给主调函数,此时发生拷贝构造,这种情况可以通过移动构造避免不必要的拷贝