定义

如果对象的可观察状态在功能上与该类型的所有其他对象不同,则类型具有值语义。这意味着,如果复制对象,则会有一个新对象,并且旧对象的修改不会以任何方式显示。

大多数基本 C++类型都有值语义:

int i = 5;
int j = i; //Copied
j += 20;
std::cout << i; //Prints 5; i is unaffected by changes to j.

大多数标准库定义的类型也具有值语义:

std::vector<int> v1(5, 12); //array of 5 values, 12 in each.
std::vector<int> v2 = v1; //Copies the vector.
v2[3] = 6; v2[4] = 9;
std::cout << v1[3] << " " << v1[4]; //Writes "12 12", since v1 is unchanged.

如果该类型的实例可以与另一个对象(在其外部)共享其可观察状态,则称该类型具有引用语义,这样操作一个对象将导致该状态在另一个对象内发生更改。

C++指针具有关于它们指向哪个对象的值语义,但它们具有关于它们指向的对象状态的引用语义 :

int *pi = new int(4);
int *pi2 = pi;
pi = new int(16);
assert(pi2 != pi); //Will always pass.

int *pj = pi;
*pj += 5;
std::cout << *pi; //Writes 9, since `pi` and `pj` reference the same object.

C++引用也有引用语义。