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
,这种参数传递方式就是引用传递,也就是引用语义。
上述两种代码的输出是否符合你的期望?
细心的你应该已经观察到了,上面两段代码仅仅是函数参数多了一个**&**的区别,可输出却完全不同。
先来分析第一段代码:
暂时无法在飞书文档外展示此内容
可以看图,在函数调用时,v
和value
是不同的空间,v
是value
的一份拷贝,所以开始时v
的值也是100。
当执行v = 2
语句时,v
所在的空间的值自然就会被更改,但由于v
和value
是不同的空间,所以这不会影响到value的值,所以最后会输出100.
而第2段代码:
暂时无法在飞书文档外展示此内容
看图,和上面的不同,v
和value
不是完全不同的空间,也可以理解为v
是一个索引或者软链接,它指向的其实是value
所占的那块空间,
所以,当改动v
时,其实是改动v
所指向的那块空间,也就是value
,所以value
最后变成了2,最后会输出2。
这就是引用语义,它不会执行拷贝操作,而是类似软链接的一个东西,指向它所引用的那个变量的空间,对引用做任何改动,也就相当于对原空间做了改动。
那怎么使用引用语义
?通过&就可以,在函数传递时可以使用&来进行引用传递:
void func(int &v);
声明变量时,也可以使用引用语义,比如:
int value = 100;
int v& = value;
v = 2;
std::cout << value << "\n";
这段代码和上面引用传递的代码类似,就不过多分析了。
练习
这块其实还涉及到很多知识点:
- 什么时候用值语义,什么时候用引用语义?
- 引用与指针有什么区别?
- 引用的本质是什么?
可以思考下。
