引用、内联、范围for、auto

1.引用

1.1什么是引用

引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会给引用变量开辟内存空间,它和它的引用变量共用一块内存空间。就好比一个人的绰号和名字都表示同一个人,只是称呼不一样而已。
在这里插入图片描述

1.2引用的特性

1.引用在定义时必须初始化

2.一个变量可以有多个引用

3.引用一旦引用一个实体,再不能引用其他实体,否则变为赋值

在这里插入图片描述

1.3常引用

引用在初始化赋值时,权限是可以缩小的,不可以放大,指针也是这样的
在这里插入图片描述
在这里插入图片描述

1.4引用的一些使用场景

1.引用作参数
a.输出型参数(函数内部的改变可以影响外部),避免了使用指针,代码更改简洁方便
b.大对象引用传参可以提高效率
在这里插入图片描述
在这里插入图片描述

2.引用作返回值
如果函数返回时,出了函数作用域,返回对象还未返还给系统(没有被销毁),则可以使用引用返回,如果已经返还给系统了,则必须使用传值返回;

在这里插入图片描述

1.5引用的底层实现

在语法上,引用只是一个别名,没有独立的空间,和引用实体共用一块空间。在底层实现上实际是有空间的,因为引用是按照指针的方式实现的;
在这里插入图片描述

1.6引用和指针的不同点

1.引用在定义时必须初始化,指针没有要求

2.引用在初始化时必须引用一个实体,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型的实体

3.没有NULL引用,但有NULL指针

4.在sizeof中含义不同,引用结果为引用类型的大小,指针始终是地址空间所占的字节个数

5.引用自增,为实体增1,指针加1则指针向后移动所指向的类型大小

6.有多级指针没有多级引用

7.访问实体的方式不同,指针需要显示的解引用,引用编译器自己处理

8.引用比指针使用起来更加的安全

9.引用概念上定义一个变量的别名,指针存储一个变量的地址

2.内联函数

2.1什么是内联函数

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方进行展开。这样就没有了调用函数的压栈开销,提升了程序的运行效率;

比如我们变现一个计算机程序,那么其中的加法函数的调用会非常频繁,调用函数形成栈桢需要空间和性能的消耗,此时解决的办法有利用宏函数或内联函数。但是宏函数有比较大的缺点,不方便调试且容易出现问题,在C++中内联函数相对于宏函数来说就比较完美的解决了这个问题;

在这里插入图片描述

2.2内联函数的特性

1.inline是一种以空间换时间的做法,省去调用函数的额外开销,所以代码很长或者有循环或者递归的函数都不适宜作为内联函数,内联适合频繁调用的小函数;

2.inline对于编译器来讲只是一个建议,编译器会自动进行优化,如果定义为inline的函数体内有循环或者递归等不满足内联函数的要求,编译器会自动忽略掉内联

3.inline不建议声明和定义分离,分离会导致链接错误,因为内联函数被展开,就没有函数的地址了,链接就会找不到;

2.3C++和宏

1.宏的优缺点

优点:
a.增强代码的复用性
b.提高性能

缺点:
a.不方便调试,因为预处理阶段会进行宏替换
b.宏的过多使用,代码的可读性会很差,可维护性差,容易误用
c.没有类型安全的检查

2.C++有那些技术替代宏

a.常量定义换用const
b.函数定义换成内联函数

3.范围for

3.1什么是范围for

平常我们使用for循环都是自己控制循环范围,但是对于一个有范围的集合而言,由程序员来控制范围是多余的,有时候还会容易犯错误,因此在C++ 11中,引入了基于范围的for循环;

for循环后的括号有冒号“:”分为两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围;

3.2范围for的使用条件

1.for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围。对于类而言,应该提供begin和end的方法,begin和end就是for迭代循环的范围

2.迭代对象要实现++和==的操作
在这里插入图片描述

4.关键字auto

4.1什么是auto

在C语言中,auto是表示变量在哪里储存的关键字,很显然,我们开辟出来的变量的属性是动态变量还是静态变量由定义所处的位置决定,都是默认的这一个关键字就几乎没人使用了。

在C++ 11中,重新赋予了这个关键字新的含义:auto作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得;

在这里插入图片描述

4.2auto使用规则

1.使用auto定义变量的时候必须进行初始化:
这是因为在编译阶段编译器需要根据初始化的表达式来推导出auto的实际类型,auto不是一种类型的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量的实际的类型;

2.auto与指针和引用结合使用
auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时必须加上&
在这里插入图片描述
3.在同一行定义对多个变量,变量的类型必须一致
编译器只对第一个变量的类型进行推导,然后用推导出来的类型定义其它变量
在这里插入图片描述
4.auto不能作为函数的参数

5.auto不能直接用来声明数组

6.为了避免与C++ 98中的auto发生混淆,C++ 11 只保留了auto作为类型指示符的用法

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值