值语义
值语义就是赋值语句执行之后,两个变量没有任何关系,各自是独立的。
基础类型都是值语义的
例如:
int a = 0;
int b = 1;
a = b; // a 和 b 仅仅是值相同,实际上是两个没有任何关系的变量。有各自的内存地址。
对象默认也是值语义的
参考 : 对象之间赋值_对象之间的赋值
标准库STL的容器都是值语义的
即,将一个容器对象赋值给另一个容器对象之后,两个容器相互独立。
vector<int> arr1{ 1, 2, 3};
auto arr_copy = arr; // arr_copy 有自己的独立的内存空间,也有三个变量,分别存储着 1 ,2 ,3;
标准库的值语义,也意味着我们无法将一个变量真正的放到容器里。
将一个变量放进容器,实际上是把变量的值传给容器,容器在内部创建一个同类型的变量,并赋值为传入的值。
例如,下面的代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int a = 4;
vector<int> arr;
arr.push_back(a);//a并没有进入容器,a的副本在容器里被创建了出来
a = 5;
cout<<arr.back()<<endl;//输出4,不会输出5
return 0;
}
程序输出:4