C++调用函数时的两种传递方式“传值方式调用”和“引用方式调用”有何不同?

2024-11-01 08:25:38
有3个网友回答
网友(1):

引用是直接使用.不引用就是 复制一个给定参数的版本,然后用克隆版进行操作.
引用与否有以下两个重要区别:
1.引用效率比非引用高.考虑关于string类型的某函数some(string &x);
这个是引用,函数内部直接使用x本身进行操作,而如果是非引用,函数内部生成一个临时的string,这个临时的string 和x 一样.然后对临时的string进行操作.显然,生成一个小的string 不需要花太多时间,但是当string非常大的时候,引用和非引用的区别就明显了,而且当参数扩展到对象的时候就更明显,有的对象非常之大使得非引用方式效率无法忍受.

2.引用可以修改参数本身而非引用则不可以.正如上一点所述,引用直接对参数进行操作,因而函数内部对引用参数的任何修改都会在函数外体现.举例子,考虑如下函数:
void setx(int &x)
{
x=3;
}
假设有int t=4;执行setx(t) 后,t=3;如果去掉引用符号,则setx(t)后t的结果是不变的.
这一点可以使得引用可以作为函数返回的一种手段,比如考虑计算x*3的void函数:
void int x3(int x,int &sum)
{
sum=x*3;
}
在调用之前sum是什么值无关紧要,重要的是调用后sum的值就是x*3的值,这正是我们想要的结果.
但是这一点在有些情况下是我们不想看到的,比如有一个数据规模巨大无比的对象我们要调用它但是我们不想调用函数修改它.如果是非引用,这不成问题--记住非引用函数不会改变参数--然而这个巨大的对象对于非引用的调用来说效率实在低下.c++提供const 关键字 对我们的矛盾 给出了一个不错的解决方案.
考虑以下函数:
void setx(const int &x)
{
x=4;
}
编译失败.以const声明的参数x 是无法在函数内部被修改的.

当然,不用const也可以,只要你确定你的代码不修改"不希望修改的参数"的值就行,然而人毕竟是人,代码多了程序长了难免会有疏漏,所以我们用计算机提醒我们.这就是我们使用计算机的初衷之一...

.....over

网友(2):

值传递就是把变量的值赋给一个临时变量,在对参数的调用过程使用的是这个临时变量,对临时变量的任何操作不影响原变量的值
引用传递好比是给变量起了一个别名,实际对引用参数的调用就是对原变量的调用,操作会影响到这个变量的值,这个跟C里面的地址传递类似

网友(3):

传值方式调用是传植,而引用方式调用是传址,和指针方式调用相同