首页 > 其他分享 >1.2引用

1.2引用

时间:2024-03-13 21:25:05浏览次数:23  
标签:const 1.2 temp int 引用 实参 ref

1、引用的基本使用

引用的作用:给变量起别名
语法数据类型 &别名 = 原名

image
为什么a输出的也是20?
因为不管我们呢是用原名a来操作它,还是用别名b来操作它,我们所修改的都是同一块内存。

回忆:操作系统中讲的共享

2、引用的注意事项

引用必须初始化
引用在初始化后,不可以再改变了!

点击查看代码
int main()
{
	int a = 10;
	int b = 20;
	int &c;  //错误!引用必须初始化!
	int &c = a; //正确,初始化引用,给a起个别名为c
	c = b; //赋值操作,并不是更改引用。
}

3、引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参。
优点:可以简化指针修改实参(可以不用指针直接修饰实参)。

几种函数参数形式的对比:

1、值传递

形参不会改变(修饰)实参

点击查看代码
void mySwap1(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
}
mySwap1(a , b); //调用方式

2、地址传递

形参会修饰实参

点击查看代码
void mySwap2(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
mySwap2(&a, &b); //调用方式

3、引用传递

形参会修饰实参

点击查看代码
void mySwap3(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}
mySwap3(a , b); //调用方式

总结:

通过引用参数产生的效果同按地址传递是一样的,但是引用的语法更清楚简单。

4、引用做函数返回值

作用:引用时可以作为函数的返回值存在的。
注意:不要返回局部变量引用。
用法:函数调用作为左值
当一个函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。

点击查看代码
//返回局部变量的引用
int & test1()
{
	int a = 10; //局部变量存放在栈区中,在程序执行完就被释放了
	return a;
}
//返回静态变量的引用
int & test2()
{
	static int a = 20;  //静态变量,存放在全局区,全局区上的数据在程序结束后由系统释放
	return a;
}

int main()
{
	//不能返回局部变量的引用
	int &ref = test1();
	cout << "ref = " << ref << endl;	//第一次结果正确,是因为编译器做了保留
	cout << "ref = " << ref << endl;	//第二次结果错误,输出的是一堆乱码,因为a的内存已经释放
	//但X86环境下会给你保留一次 X64环境下一次都不会保留(两次都是乱码)
	
	//如果函数作为左值,那么必须返回引用
	int &ref2 = test2();
	cout << "ref2 = " << ref2 << endl;  //输出为10
	
	test02() = 1000;	//函数作为左值,实际上就是将函数返回的a的引用赋值为1000,即 a = 1000;
	cout << "ref2 = " << ref2 << endl;  //输出为1000
	cout << "ref2 = " << ref2 << endl;  //输出为1000
	//为什么输出ref2也是1000,因为ref2是test2()函数的返回值的别名,即a的别名
	
}

5、引用的本质

引用的本质在C++内部实现一个指针常量

点击查看代码
void func(int &ref)  //引用传递参数
{
	ref = 100;	//ref是引用,转换为*ref = 100
}
int main(){
	int a = 10;
	//自动转换为 int *const ref = &a; (指针常量), 指针常量是指针指向不可改,也说明为什么引用不可更改
	int &ref = a;
	ref = 20; //内部发现ref是引用,自动帮我们转换为 *ref = 20;
}

结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了

6、常量引用

作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加 const 修饰形参,防止形参变实参

点击查看代码
int &ref = 10;  // 引用本身需要一个合法的内存空间,因此这行错误
const int & ref = 10; //假如const就可以了,编译器优化,int temp =10; const int &ref = temp;

ref = 100;//错误,加入const后ref就不可更改变量了。

//在函数中利用常量防止误操作修改实参
void func( const int &a)
{
	a = 100; // 错误,参数a传进来就是常量,无法修改
}


标签:const,1.2,temp,int,引用,实参,ref
From: https://www.cnblogs.com/H43724334/p/18071428

相关文章

  • Java 引用变量的比较
    在Java中,当你使用双引号直接创建字符串时,如:Strings=“LXHYouth”;Strings2=“LXHYouth”;使用==运算符比较这两个引用时,结果为true然而,当你使用new关键字创建字符串对象时,情况就有所不同了:Strings3=newString(“LXHYouth”);//使用new关键字,s3指向堆中的一......
  • vue3 循环引用的解决办法问题,Cannot access ‘xxxx‘ before initialization
    ReferenceError:Cannotaccess‘xxxx‘beforeinitialization ,原因之前已经初始化过,但页面组件嵌套,需要被重复引用。1、开启异步引用来解决components:{DeviceManage:defineAsyncComponent(()=>import('@/views/operation/mechanism/index.vue'))}2、用ifrme来......
  • 使用kubeadm部署Kubernetes 1.26及其它版本
    1.系统配置环境信息:系统:CentOSLinuxrelease7.6.1810(Core)k8s版本:1.26.0(可自己选择)IP主机名规划角色192.168.223.123auto-inspaction-1master192.168.223.68auto-inspaction-0node192.168.223.73auto-inspaction-2node在各个主机上完成下......
  • LabVIEW中引用的概念及在VI间传递值
    一引用的概念LabVIEW中有一个重要概念:引用。引用的本质是一个临时指针,它可以指向一个具体的对象,并为其分配内存空间,是对象在程序中的唯一标识。尽管LabVIEW不是纯粹面向对象的语言,但引用的概念与其它面向对象的语言,例如:C++,基本相同。我们可以把LabVIEW中的控件、VI、应用程......
  • k8s 1.23 nfs动态存储nfs-subdir4.0.18
    参考 https://blog.csdn.net/m0_51510236/article/details/132641343nfs服务器:192.168.18.12master:192.168.18.111、在nfs服务器安装nfsyuminstallnfs-utils-yvim/etc/exports/data/nfs/data1G*(rw,no_root_squash,no_all_squash,sync)/data/nfs/data2G*(rw,no_r......
  • Java是值传递还是引用传递?
    1、典型回答值传递(Passbyvalue)和引用传递(Passbyreference)是关于参数传递方式的两个概念值传递:将传递参数的值,复制一份到方法的参数中。换句话说,值传递的是原始数据的一个副本,而不是原始数据本身引用传递:将实际参数的引用(内存地址)传递给方法,这意味着方法内部对参数的修改......
  • UVM宏解释+odt文件转doc+merge命令和difflib+python调用命令+clog2和系统函数+java添
    UVM宏解释UVM_DISABLE_AUTO_ITEM_RECORDINGhttps://blog.csdn.net/MGoop/article/details/127295965itemrecord的方法主要是用于记录事务信息的,原理是调用accept_tr,begin_tr,end_tr。似乎和波形上显示出各个事务相关。默认情况下,在调用get_next_item()和item_done()时自动......
  • 高德地图 离线地图jsapi2.0 插件引用
    当引用一个插件,但是这个插件没有时会报错:UncaughtTypeError:AMap.ControlBarisnotaconstructor这里引用了罗盘这个插件这时候需要翻看高德的离线js了目前有两种逻辑:一个是同级目录下下载一个对应插件的js。还有一个是目录下有mapsplugin.js,通过这个插件来加载的,那么......
  • UE 共享指针 共享引用
    classFTestA{public: FTestA(){ UE_LOG(LogTemp,Warning,TEXT("FTestA构造")); } voidTestFun(){ UE_LOG(LogTemp,Warning,TEXT("FTestATestFun方法")); } ~FTestA(){ UE_LOG(LogTemp,Warning,TEXT("FTestA析构")); }};......
  • Java8方法引用简化Lambda
    静态方法引用importlombok.AllArgsConstructor;importlombok.Data;importjava.lang.reflect.Array;importjava.util.Arrays;importjava.util.Comparator;importjava.util.zip.DeflaterOutputStream;/***@authorPickle*@versionV1.0*@date2024/3/823:3......