变量的实现方式:引用语义和值语义

变量的实现方式:引用语义和值语义

值语义和引用语义

值语义把变量的值直接保存在变量的存储区里,赋值实际是copy一份副本,两个变量拥有的存储空间是独立的,相互之间不影响,如c语言。

简单来说就是这样的效果:

b = a;

赋值实际是copy一份副本,b的值和a无关。图示如下:

引用语义,在变量里保存值(对象)的引用,赋值并不copy一份副本,两个变量只有一份的存储空间,相互之间可以理解为是别名,使用同一个值,如Java、 C#、Python 和JavaScript。

简单来说就是这样的效果:

b = a;

赋值并不copy一份副本,两个变量,只有一份的存储空间,使用同一个值。

数据(data)可有分为不可变(immutable)的数据和可变(mutable)数据。

不可变(immutable)数据具有固定值。

可变(mutable)数据是指其中的成分可以修改。

特别提醒,对于可变(mutable)数据,对于采用引用语义实现的变量,假若b = a,则通过其中任何一个变量(如a)修改数据中的成分,将会在另一个(如b)中体现出来。


我们以Java、Javascript数组(array)为例说明这一点:Java、Javascript支持将一个数组赋值给另一个数组,下面的例中演示了,数组b = a 之后, b[3]的改变a[3]反映出了。

★对于java而言
public class myTest
{
    public static void main(String[] args)
    {
        int[] a  = {1,2,3,4,5};
        int[] b;    
        b = a  ;
        b[3] = b[3] + 10;
        System.out.println("a[3] = " + a[3]);   //14
    }
}
 

★对于javascript而言
var a = [1,2,3,4,5];
var b= [];
b = a;
b[3] = b[3] + 10;
console.log(a[3]);  //14

特别提示:c++ 内置数组不支持支持将一个数组赋值给另一个数组,C++ STL array容器可以(需要引入 array 头文件),是值语义的,如下面的例子所示,b = a 之后, b[3]的改变不会影响a[3],示例如下:

#include <iostream>
//需要引入 array 头文件
#include <array>
using namespace std;
int main()
{
    array <int, 10> a = { 1,2,3,4,5};
    array <int, 10> b;
    b = a;
    a[3] = a[3] + 10;
    cout << b[3] <<endl;  //4
}

关于C++ STL array容器 https://segmentfault.com/a/1190000039954245

关于值语义,引用语义,可参考:

https://blog.csdn.net/zhc_24/article/details/82156970

https://www.toutiao.com/a6583429024326877700/

https://www.zybuluo.com/guochy2012/note/14265

https://juejin.cn/post/6904945884975497224

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值