传值和传引用的概念
传值(pass by value):即形参接收实参传递过来的值,如果是自定义类型,要调用拷贝构造函数。函数处理的是形参的值。
传引用(pass by reference):引用表示与原对象完全相同,是同一个对象。若函数的形参是引用,则实参与形参间不存在参数传递,且函数内对形参的修改就是修改实参,因为它们是引用关系,是同一个对象。
语言应用
- C语言中,传递的参数类型只有1个:传值,包括传递普通数值和指针。
- C++中,传递的参数类型有2个:传值、传引用
- java中,传递的类型只有1个:传值。java中传的值包括:基本数据类型和对象,其中对象当做指针看待
三种语言的处理方法相同: 不管传递的是普通变量还是指针,都是传值。对于指针,看函数修改的是指针的值,还是指针所指对象的值就可以了。
引用和指针主要区别
(1)引用被创建的同时必须被初始化,指针则可以在任何时候被初始化。
(2)不能有NULL引用,引用必须与合法的存储单元关联,指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系,指针则可以随时改变所指的对象。
函数参数传递机制的基本理论
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。
值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的 实参变量。
小结
1、 C++中传值(特别是对于自定义类型),会带来拷贝构造函数执行的开销,所以执行效率低一点。传引用和传指针,不执行拷贝构造函数,效率会高
2、 当用按值传递方式传递或返回一个对象时,编译器会自动调用拷贝构造函数!
3、 当指针作为形参时,最好画出指针所指向的对象。然后分析修改的是指针的值,还是指针所指的对象。