拷贝构造函数调用时机
这里讨论两种情况下的拷贝函数调用:
- 作为参数传值过程中的拷贝函数调用,有一个Dog类,d1是Dog类的一个实例现在通过function将d1传入,void function(Dog dog); d1是dog的实参,在调用function的过程中产生了一个拷贝构造的调用,相当于Dog dog = Dog(d1);
- 作为返回值产生的拷贝构造函数的调用,例如有函数:
Dog function(Dog dog){ //传入时的调用
Dog tmp;
return tmp; // 返回时的调用
}
在main函数中调用该函数返回一个Dog值:
Dog d1;
Dog dog = function(d1);
这个调用过程中,产生了一个拷贝函数的调用function中 return d;不是返回的d,而是通过拷贝函数,将d的值赋值给了一个临时的Dog类对象,让后将这个临时对象的值赋给dog,但是本人在实际运行时发现,这个过程 城中,临时变量并没有调用构造和析构函数,经过查询相关资料,这是C++17对返回方式的优化,若将函数内的局部变量作为返回值,编译器不再进行拷贝构造生成临时变量,这样减少了副本,提高了程序运行的效率,但具体是返回的这里的 tmp 还是其他操作还没有进行研究。