定義

如果物件的可觀察狀態在功能上與該型別的所有其他物件不同,則型別具有值語義。這意味著,如果複製物件,則會有一個新物件,並且舊物件的修改不會以任何方式顯示。

大多數基本 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++引用也有引用語義。