面试官喜欢出这种题目这种题目:
什么是值传递和引用传递?
简介
值传递和引用传递,是两种不同的数据传递方式,是两种「传递者」和「接收者」之间传递的方式。
值传递:「传递者」和「接收者」存在了两份相同的数据。没有上下文(context)关系。
引用传递:「传递者」和「接收者」 共用一份数据。两者间具有联系(上下文)。这意味着出现bug时,你需要查找的范围增加了。
总结:两者区别在于隔离性。
进阶
数据流动的角度思考。
1)使用值传递的情况。在多个「接收者」情况下,引用传递是必须禁止的。(多线程/情况过多)
原因:共享数据在运行中被修改,会产生使用者不愿意见到的场景。
2)使用引用传递的场景。
- 数据流向不可逆,且没有多条路线
- 数据需要共享(需要像多线程那样考虑各种情况)
另外则是从性能上考虑,参考网站:
-
What are the advantages of passing a reference to an object ? [ duplicate]
-
Is it better in C++ to pass by value or pass by constant reference?
摘要几点:
- 节省克隆的成本(克隆的时间消耗)。
- 弥补传统语言的问题。(不存在多值返回这种用法)
可控角度思考
考虑是否使用值传递,常常是为了考虑“可控否”。多人合作时候,其他人则为不可控因素,因此,为了将不可控因素转换为可控因素,我们常常使用getter/setter形式对类的读取和写入的入口进行控制,并使用上值传递进行隔离,这样一来就形成了上下文无关。
正因为需要考虑到第三方时候,所以我们会使用值传递。倘若不存在第三方,或者存在明确的概念的情况下,值传递也就可以不必使用了。