1.引用
1.1引用的定义和概念
引⽤不是新定义⼀个变量,⽽是给已存在变量
取了⼀个别名
,编译器
不会为引⽤变量开辟内存空间,
它和它引⽤的变量共⽤同⼀块内存空间。
1.2引用的特性
•
引⽤在定义时必须初始化(
引用就是取别名,你总有取别名的对象吧,所以初始化就是确定对象)
•
⼀个变量可以有多个引⽤
(就是取很多个别名的意思)
•
引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
(一个别名只能有一个对象,不能你的别名叫翠花,我的别名也叫翠花)
1.3引用的使用
•
引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
•
⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔。
•
引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象。(这里我需要强调的一点是C语言中,只有传址调用形参才可以改变实参的值,但C++中,这个引用,
对象取的别名
进行运算时可以改变
对象
的值)
例如以下例子:
对象a,我给他取了个名字b,对++b时,a从0变成了1,说明对b进行运算时,实际上就是a进行了操作。
1.4const引用
•
可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为
对象的访
问权限在引⽤过程中可以缩⼩,但是不能放⼤。
几大注意事项!!!如下:
情况二,涉及一个
•
类似
int& rb = a*3; double d = 12.34; int& rd = d;
这样⼀些
场景下a*3的和结果(运算结果)
保存在⼀个临时对象中, int& rd = d 也是类似,在
类型转换中
会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。
1.5指针和引用的关系
C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功
能有重叠性,但是各有⾃⼰的特点,互相不可替代。
•
语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
•
引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
•
引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
•
引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
•
sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
•
指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。
2.inline
•
⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就需要建⽴栈帧了,就可以提⾼效率。
•
inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略
•
inline
不建议声明和定义分离到两个⽂件
,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。(一般定义直接放在头文件里)
3.nullptr
在C++中,nullptr才是对指针赋空,注意!!!c语言中的NULL在C++中不适用C++中NULL,就是整数0;还有个重点,C语言中,void*可以接受任何指针类型,在在C++中,同样也不适用。统统忘掉就可以了,就像忘记前男友和前女友那样!
今日鸡汤:持续学习,不断精进,才能让我们保持深度思考的能力,获得真正的成长,练好自己的本领,拥有独一无二的本领,拥有独一无二的竞争力,更多机会才会接接踵而至!!!