最近刚刚开始接触面向对象思想,学了类的基本知识。这两次做作业时,都在函数返回时遇到了一些有点confusing的问题。
首先,在一个要求有返回值(某个自定义类型class)的函数中,最后通常是一句return ...,这一句话别看短小,但他实际会调用你写的拷贝构造函数,至于是拷贝给谁,这里也是十分有讲究的。例如:
class A{
A(){...}
A(const A& second a){...}
~A(){...}
}
A f(){...
A a;
...
return a
}
int main(){
f();
A li=f();
}
大家看main函数里面这两个调用有什么不同呢??好像没什么不同,但是区别是很大的。第一个调用时,return a做了两件事,一个是将a通过拷贝构造函数,赋给了一个临时变量,这个临时变量对于我们是透明的,我们不妨就把这个临时变量看成f()这个整体函数外壳,第二件事是,调用析构函数释放a。但注意还没有完,我们说了f()是个临时变量,所以f();执行完之后立刻又调用析构函数释放f()所以说啊,你这里如果返回一个指针那么就会有问题。
那么下面第二个调用的区别是什么呢??最直白的解释是先将a赋给临时变量f(),然后将f()赋给li,但事实并非如此。大家注意,如果这里是先赋给临时变量的话,这个调用会和上面一样析构函数会调用两次,但事实只调用了第一次,第二次压根就没有赋给临时变量而是直接赋给了li,也就是如果可以省略中间临时变量的步骤就会省略掉。