07、语义和引用语义

厨子大约 2 分钟C++C++基础编程程序厨

本文主要介绍值语义和引用语义的概念。

正文

那什么是值语义?什么是引用语义?

直接看代码:

#include <iostream>
void func(int v) {
  v = 2;
}

int main() {
  int value = 100;
  func(value);
  std::cout << value << "\n";
}

这段代码会输出100,这种参数传递方式就是值传递,也就是值语义。

再看这段代码:

#include <iostream>

void func(int &v) { // here
  v = 2;
}

int main() {
  int value = 100;
  func(value);
  std::cout << value << "\n";
}

这段代码会输出2,这种参数传递方式就是引用传递,也就是引用语义。

上述两种代码的输出是否符合你的期望?

细心的你应该已经观察到了,上面两段代码仅仅是函数参数多了一个**&**的区别,可输出却完全不同。

先来分析第一段代码:

暂时无法在飞书文档外展示此内容

可以看图,在函数调用时,vvalue是不同的空间,vvalue的一份拷贝,所以开始时v的值也是100。

当执行v = 2语句时,v所在的空间的值自然就会被更改,但由于vvalue是不同的空间,所以这不会影响到value的值,所以最后会输出100.

而第2段代码:

暂时无法在飞书文档外展示此内容

看图,和上面的不同,vvalue不是完全不同的空间,也可以理解为v是一个索引或者软链接,它指向的其实是value所占的那块空间,

所以,当改动v时,其实是改动v所指向的那块空间,也就是value,所以value最后变成了2,最后会输出2。

这就是引用语义,它不会执行拷贝操作,而是类似软链接的一个东西,指向它所引用的那个变量的空间,对引用做任何改动,也就相当于对原空间做了改动。

那怎么使用引用语义?通过&就可以,在函数传递时可以使用&来进行引用传递:

void func(int &v);

声明变量时,也可以使用引用语义,比如:

int value = 100;
int v& = value;
v = 2;
std::cout << value << "\n";

这段代码和上面引用传递的代码类似,就不过多分析了。

练习

这块其实还涉及到很多知识点:

  • 什么时候用值语义,什么时候用引用语义?
  • 引用与指针有什么区别?
  • 引用的本质是什么?

可以思考下。