阅读了C++ Primer 4th第七章,有了明确的答案。
首先,函数的参数。
如果参数类型不是reference的,那么,函数的调用方压入的参数(我们称之为argument,函数本身的参数我们称为 parameter,两者区分来),会被copy一份,然后被赋予到parameter中。如果很不幸这个参数是个vector,那么,整个 vector,包括里面所有的元素,都会被copy一份,这就是参数拷贝。
如果参数类型是reference类型的,那么,就不会有上述的参数拷贝的过程。
很显然,如果有参数拷贝的动作,那么,在函数中对parameter的修改,不会影响到argument。如果没有参数拷贝,那么,对parameter的修改,就会直接影响argument
其次,函数的返回值。
也分为两种情况,如果函数的返回值不是reference类型的,那么,编译器会自动在return的时候,将return的变量copy到一个 临时对象中(temporary object),然后这个临时对象就能给函数的调用者使用。换句话说,如果我们return一个函数中定义的局部变量,这是没有问题的,因为这个变量会被 copy到临时对象中。即使这个局部变量本身会在函数结束的时候也随之消亡。
如果函数的返回值是reference类型的,那么,就没有临时对象这么一回事了。return的是什么就是什么。
所以,根据以上两点,有两个很重要的推论:
1. 如果函数的返回值是reference类型的,那么,不能返回函数中某个局部变量的reference,因为这个局部变量在函数结束的时候也消亡了。
2. 不管函数的返回值是不是reference类型的,都不要返回一个指向函数中局部变量的指针。这个指针本身可能在函数的调用方是可以访问的,但是这个指针所指的对象肯定是在函数结束后访问不到的。
首先,函数的参数。
如果参数类型不是reference的,那么,函数的调用方压入的参数(我们称之为argument,函数本身的参数我们称为 parameter,两者区分来),会被copy一份,然后被赋予到parameter中。如果很不幸这个参数是个vector,那么,整个 vector,包括里面所有的元素,都会被copy一份,这就是参数拷贝。
如果参数类型是reference类型的,那么,就不会有上述的参数拷贝的过程。
很显然,如果有参数拷贝的动作,那么,在函数中对parameter的修改,不会影响到argument。如果没有参数拷贝,那么,对parameter的修改,就会直接影响argument
其次,函数的返回值。
也分为两种情况,如果函数的返回值不是reference类型的,那么,编译器会自动在return的时候,将return的变量copy到一个 临时对象中(temporary object),然后这个临时对象就能给函数的调用者使用。换句话说,如果我们return一个函数中定义的局部变量,这是没有问题的,因为这个变量会被 copy到临时对象中。即使这个局部变量本身会在函数结束的时候也随之消亡。
如果函数的返回值是reference类型的,那么,就没有临时对象这么一回事了。return的是什么就是什么。
所以,根据以上两点,有两个很重要的推论:
1. 如果函数的返回值是reference类型的,那么,不能返回函数中某个局部变量的reference,因为这个局部变量在函数结束的时候也消亡了。
2. 不管函数的返回值是不是reference类型的,都不要返回一个指向函数中局部变量的指针。这个指针本身可能在函数的调用方是可以访问的,但是这个指针所指的对象肯定是在函数结束后访问不到的。