C++ 引用 深度理解
-
对于一个函数来说,传值和传引用,在函数功能上没有区别,但在性能和副作用方面有显著差异。
-
传值
当按值传递参数时,函数会创建参数的一个副本。这样做的好处是函数内部对参数的修改不会影响原始变量,但缺点是对于大对象来说,拷贝操作会带来性能开销。 -
传引用
当按引用传递参数时,函数接收的是参数的引用,而不是副本。这样做的好处是避免了拷贝操作,提高了性能,但函数内部对参数的修改会影响原始变量。
除此之外,当函数的形参是一个const修饰的引用的时候,意思是在该函数内,不会通过这个引用修改值。所以实参是不是const修饰的引用,是不是const修饰的变量,都没有关系。只是说明该函数内部不会通过引用修改值。而且外面如果不是常量,函数外面可以随意修改值的。
说白了,就是形参的const 引用,只能保证在这个函数里,不会改变这个引用的值,至于外面传入的实参是值还是引用,改不改值,我不管。
-
#include <iostream>
using namespace std;
void func(const int& a)//这个const 引用的意思是,只能保证在这个函数里,不会改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{
std::cout << "test = " << a << std::endl;
return;
}
void func2(int& a)//这个引用的意思是,在这个函数里,可以改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{
std::cout << "test = " << a << std::endl;
return;
}
int main()
{
const int a = 0;//定义了一个常量,本身值不可修改
//a++;// 这行代码是不合理的,因为 a 是一个常量,不能修改其值
func(a);//可以作为实参
func2(a); // 不合理,因为func2()的形参是非const类型,预示着可以在函数里改变值,你将一个不能改变值的变量传递给它是不可以的。
int b = 0;// 定义了一个变量
func(b); //可以作为实参
b++; // 外面修改不影响,作为实参传入const引用
int& c = b;//定义c位非常量引用,引用的值就是变量b
func(c);//非const引用,可以作为实参传给const 引用形参,说明函数体内不改值
c++;
const int& d = c;// d 是 c 的常量引用,不能通过d去修改c的值,但是通过c可以修改引用的值
func(d);
c++;//这是合理的,因为c是非常量引用可以修改值
// d++;// 不合理,因为 d 是一个常量引用,不能修改其值,d是常量引用,c是非常量引用,二者的值都是变量b
return 0;
}
- 多个引用所绑定的值是同一个地址的内容的时候,不能通过常量引用修改,但是可以通过非常量引用修改值。如果非常量引用修改了值,那么相应的常量引用对应的值,也发生了改变。因为二者所对应的变量是同一个地址里的内容。由此我们可以得知,
常量引用的意思是,不要希望通过我去改变所引用变量的值,但是至于其他引用有没有改变所引用的值,我就管不了了。我只能保证我不会改而已。
例如:
int a = 1;
const auto& b = a;
auto& c = a;
c++;//可以通过c改变,所引用的值,与此同时,常量引用b所引用的值也被改变了。因为二者所引用的值是同一个地址。
被const修饰的变量,是无法修改值的,谁都不可以修改
,除了非常规手段,但是及其不推荐。所以即使重新定义引用绑定到这个变量上,也不可能修改,所以只能是常量引用可以绑定这个变量上。意味着不可试图修改引用值。
#include <iostream>
using namespace std;
int main()
{
const int a = 0;// 定义了一个常量,意思是不可更改,重新定义的引用绑定到该变量也不能修改,而且只能常量引用可以绑定
int& b = a;// 不合理,非常量引用不能绑定到常量,编译报错
int b = a;//合理,重新定义了一个变量b,是a的一个拷贝,但是是非常量。b值得改变丝毫不影响a得值
int& c = b; //合理,定义了一个非常量引用c,绑定到b上,因为b是非常量,可以绑定,且可以通过c修改。
const int& d = c; //合理,定义了一个常量引用d,绑定到非常量引用c所绑定的变量上b上,所以和c绑定的是同一个变量,但是不要企图通过d去改变引用的值,至于c去不去改,变量b自己去不去改,其他可能的引用去不去修改,我d管不到。我只保证我自己无法修改。
return 0;
}
标签:const,常量,int,c++,基础知识,修改,引用,变量
From: https://blog.csdn.net/XWWW668899/article/details/142368504