变量的实现方式:引用语义和值语义
值语义和引用语义
值语义把变量的值直接保存在变量的存储区里,赋值实际是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/