引用

左值引用:引用并非对象,相反的,它只是为一个已经存在的对象所起的另一个名字。
在定义引用时,程序把引用和它的初始值绑定在一起,而不是拷贝,节省了内存资源;引用必须被初始化,引用类型的初始值必须是一个对象,不是确切的数据;
C++ 引用 vs 指针:
引用很容易与指针混淆,它们之间有三个主要的不同:
  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
作为函数参数传递时:
值传递:被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本,开辟额外的内存空间,不会改变形参的数据。
指针传递:实际上也是值传递,只是传递的是地址,开辟额外的内存空间,形参的数据会改变。
引用传递:形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
最后,总结一下指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
  1. ●指针是一个实体,而引用仅是个别名;
  2. ●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
  3. ●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有     的,  前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
  4. ●引用不能为空,指针可以为空;
  5. ●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
  6. ●指针和引用的自增(++)运算意义不一样;
    int main()
    (
    	int ar[5] = { 1,2,3,4,5 };
    	int* ip = ar; //数组首元素地址
    	int& b = ar[O]; //数组首元素的别名叫b
    	++ip;  //由0下标的地址指向1下标的地址
    	++b;  //由0下标指向1下标
    } 
  7. ●引用是类型安全的,而指针不是 (引用比指针多了类型检查)
右值引用:一般来说,不能取地址的表达式,就是右值引用,能取地址的,就是左值。
转移语义: move 本意为 "移动",但该函数并不能移动任何数据,它的功能很简单,就是将某个左值强制转化为右值。基于 move() 函数特殊的功能,其常用于实现移动语义。

#快乐学习#
全部评论
点赞 回复 分享
发布于 2022-07-28 14:48

相关推荐

05-20 13:03
已编辑
浙江工业大学 C++
5.8用过C++十一之后的语法吗?比如 ()?了解C++11 的Lamda表达式,智能指针以及(没听清)吗你刚刚说你用到Lamda和智能指针比较多一点,那我们先来谈谈Lamda表达式,lamda的组成部分有哪些?lamda表达始中的返回类型需要写吗?为什么?它的实现原理了解过吗?为什么编译器会把他形成一个类?然后实现这个类的时候发生了什么?具体使用它的时候发生了什么?这个类有几部分组成?必须有哪些成员函数?Lamda表达始终的[]叫做什么?它的使用场景都有哪些?接下来我们聊聊智能指针,你用过哪些智能指针,简单解释一下?Unique_ptr的使用场景?Unique_ptr的具体实现?你刚刚谈到它的移动构造,描述一下Uniqu_ptr从使用层面怎么去转移所有权,再分析一下它是怎么实现的?std::move实际上做了什么?讲一下shared_ptr实现是怎么样的?底层如何实现?讲一下你的代码中shared_ptr一般怎么写?如果不适用make_shared怎么去实现shared_ptr?new和make_shared他们两个谁的效率更高一点?make_shared是线程安全的吗?引用计数是怎么实现的?你说会指向引用计数,那么是怎么指向的?底层怎么实现的?你可以大概讲一下比如说是一个结构体,这个结构体里面有哪些东西?然后是如何创建它的?然后怎么去通过多个shared_ptr去持有他?引用计数是线程安全的吗?我答的不安全的,他说如果引用计数都不安全的话,那么shared_ptr又该怎么实现安全呢?然后谈到了多线程是不安全的,单线程安全?问如何保证多线程下的安全?除了加锁之外还有哪些方法?知不知道原子操作?接下来谈一谈容器,你是使用哪些STL容器。讲一下vector容器。扩容机制是怎么样的?底层如何实现?用这个扩容过程,性能会有消耗吗?怎么解决频繁扩容带来的性能消耗问题?vector怎么删除元素?写一个vector原地删除重复元素的代码。写快排。---5.91  项目注册登陆是怎么做的   登陆注册的时候会携带那些信息2  密码传输不安全 怎么解决的   你的解决方法太简单了  会被破解  有没有其它方法3 登陆注册  用的什么协议    怎么改成HTTPS  改为HTTPS的话 客户端需要做哪些工作4 HTTPs怎么实现 加密   加密通道怎么建立de5 你的数据 需要发送到服务端  过程是怎么样的?6 就直接到服务器去了?(大概说的是在网络怎么传输) 说一下具体细节7 不使用ARP、DNS怎么解决?8 项目中多线程高并发怎么实现的   没有任务的时候  你的线程在干嘛9 没有互斥锁会怎么样   会导致服务崩溃吗10 举例子说明11 再举一个例子  更好的说明12 举一个较好的让系统崩掉的例子13 系统一定会崩溃吗? 为什么会崩溃?背后有什么机制?14 开很多线程就一定会卡死吗  什么原因导致卡死?15 CPU占满就一定不能切换到另外的程序吗16 再举一个 多线程操作导致程序崩溃的例子   怎么就让程序崩溃了呢?(指我的例子)   从系统的角度和程序运行的角度来看,是怎么发生的?系统报错,报什么错?为什么没有合适的程序处理  就会崩掉 ?什么机制  让程序推出的(上面应该都是想问操作系统会做什么事情)17 你遇到崩溃的话  怎么排查---5.13自我介绍为什么选择云智,对云智了解吗?具体了解那些?你家哪儿的?愿意来武汉吗?愿意留在武汉吗?你有其他的offer吗?分别是什么?你的职业规划?能实习多久?选择你其中一个项目介绍一下?(背景,你做了哪些?)---5.15OC---5.16offer
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务