pass by value vs pass by reference

本文探讨了Java中参数传递的方式:值传递(passbyvalue)与引用传递(passbyreference)。通过具体实例说明了如何理解Java中的对象传递行为,并解释了看似引用传递现象背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pass by value

当参数是pass by value时,调用者和被调用者是有两个相同具有相同值的独立变量,被调用者修改了参数的值,调用者是看不到效果的。

pass by reference

当参数是pass by reference时,调用者和被调用者是使用一个相同的变量,如果调用者更改了参数的值,调用者是可以看到效果的。

Java参数传递

java都是pass by value, 看下面这个例子

public static void main(String[] args) {
    String x = new String("ab");
    change(x);
    System.out.println(x);   //ab
}

public static void change(String x) {
    x = "cd";
}

这个例子和string的不可变性无关,只是因为Java是值传递

看另外一个例子

public static void main( String[] args ) {
    Dog aDog = new Dog("Max");
    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // this changes the name of d to be "Fifi"
    d.setName("Fifi");
}

这个表面一看看起来是传递的引用,实际上,Dog aDog是个变量,这个变量存储的是对象new Dog(“Max”)的地址,参数传递的时候传递的仍然是aDog的值,只是这个sDog的值又恰好是new Dog(“Max”)的地址而已。

在 C++ 编程语言中,函数参数传递有两种基本的方式:按值传递(Pass by Value按引用传递(Pass by Reference)。这两种方式决定了函数内部对传入的数据是如何处理的以及是否会改变原始数据。 ### 按值传递 (Pass by Value) #### 定义: 当使用“按值传递”时,实参的实际数值会被复制一份新的副本给形参。这意味着在函数体内操作的是这个副本而不是原来的变量本身。因此,无论你在函数内怎样修改该参数,在函数返回后,外部的真实变量不会受到影响。 ```cpp void passByValue(int x) { x = 10; // 修改x只会影响局部副本,不影响原变量a } int main() { int a = 5; passByValue(a); cout << "After calling passByValue(), a is still: " << a << endl; // 输出仍然是5 } ``` #### 特点: - 数据安全:避免了意外更改外部变量的风险。 - 性能影响:如果传递大型对象或结构体,则需要额外的时间来进行深拷贝,并占用更多内存空间。 --- ### 按引用传递 (Pass by Reference) #### 定义: 通过“按引用传递”,我们将实际变量地址作为隐式指针传递给形式参数。这样一来,函数可以直接访问并修改真实的输入变量内容而不仅仅是它的副件。这种机制通常借助于引用(&)关键字实现。 ```cpp void passByReference(int &refX) { refX = 20; // 直接改变了主调函数中的变量b的值 } int main() { int b = 6; passByReference(b); cout << "After calling passByReference(), b has changed to: " << b << endl; // 输出变为20 } ``` #### 特点: - 高效传输大容量数据:不需要创建整个对象的一个新实例,节省时间资源。 - 更改可见性:允许函数内的变更反映到外面环境中,适合用于交换两个数或者更新状态等任务。 总结起来,“按值传递”适用于不想让被调用方影响原始数据的情况;而对于希望减少不必要的复制开销并且能够接受甚至期望有副作用的操作场合则更适合选择“按引用传递”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值