我们写一个函数,比如 objclass fun(objclass obj); objclass是类名,obj是对象,fun是函数名。
然后调用此函数,编译器分两个步骤:
1.每次通过值传递的方式给函数传递一个对象时,都会建立一个该对象的拷贝。
2.每次通过值从函数返回一个对象时,也会建立另一个拷贝。
也就是说调用一次此函数,系统会自动建立两次的对象拷贝,然后再调用两次析构函数释放对象的拷贝。
我们知道当调用函数的时候,这些对象被复制到栈中,这样做会费时且占用内存,当使用用户定义的大对象时,这种拷贝带来的内存开销是非常显著的。当时用用户建立的类时,每次生成这种临时的拷贝都要调用一个特殊的构造函数:复制构造函数。当函数返回时,对象的临时拷贝被删除,此时需要调用对象的析构函数。如果返回对象时通过值传递的方式,那么必须建立对象的拷贝,然后再删除。对于很大的对象,调用构造函数和析构函数在速度和内存方面都会造成很大的开销。
为了说明这一点见下面的例子:
以上code可以直接复制使用~~