✔️本文主题:引用 C++ 内联函数 auto关键字 范围for循环
✔️本文作者:蓝色学者

文章目录

  • 一、前言
  • 二、引用
  • 三、内联函数
  • 四、auto关键字
  • 五、范围for循环
  • 六、结语

一、前言

大家好久不见,这篇文章带大家学习一下C++中的引用内联函数

二、引用

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字,举个例子,李逵有很多外号,这些外号都是指李逵这一个人,因此这些外号都是他的引用!


一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

在C++中,我们用int(数据类型)& +引用名称(b) = 变量名称(a) 来表示b是a的 一个 别名,别名当然可以有很多个!


如图,b是a的别名,因此a和b的值、地址全部都一致。


引用与指针不同,引用必须指向已经存在的变量,必须赋值,即不能出现如下写法:

int& b; //空引用‘b’ ❌
int* b; //空指针’b‘ ✔️

引用一旦指向一个变量,就不能再指向其他变量,因为引用相当于变量的别名,若更换引用,实际上是给变量赋值。


想要把b改为c的别名,但事实上,b仍然是a的别名,指向同一块空间,只是这块空间的值被改为了c的值

总结一下,C++中引用一共有三个特性:

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体,再不能引用其他实体

引用作为一种数据类型,是既可以作为参数传递,也可以作为返回值返回,我们重点讨论一下传值返回和传引用返回。

✔️作用范围:传引用返回只能在空间不会随函数结束而销毁的情况,传值返回可以函数结束销毁的适合返回。

✔️使用效率:正是由于传值返回返回变量的临时拷贝,所以传引用返回会带来性能上的提升,但有些时候是 不可以传引用返回的,如果你将一块栈上的空间返回了别名,会引发严重的错误

引用与指针功能类似,又有很多不同:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
    一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

三、内联函数

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

//内联函数的格式
inline int Add(int x,int y)
{return x+y;
}

内联函数与C语言宏相似,因此也是一种空间换时间的做法,虽然能够提高运行效率,但会让目标文件变大。

与C语言宏不同,内联函数支持调试,并且可以规避C语言宏的一系列问题。

#define Add(a,b) ((a)+(b))

如果上述宏少写括号都会引发严重的问题,与乘法结合之类的问题就会频出,内联函数很好的解决了这个问题。

内联函数定义和声明在一起!因为inline就没有函数地址了,链接无法找到这个函数!声明和定义都在类中的函数也被认为是内联函数,因此简短的函数适合将声明和定义都放在类内声明和定义。

四、auto关键字

auto是C++11新增的一个关键字,能够自动推导变量类型,与C语言中typedef的功能类似。

但需要注意,使用auto定义变量时必须初始化,否则无法通过编译在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。


auto细节说明:
1、可以自动推导出auto为指针类型,但不能推导引用,因此引用类型只能加&

auto  a = &A;
auto* b = &A;
auto& c =  A;

2、在同一行使用auto时必须保证都是同一类型,编译器只推导第一个类型,然后将类型给与其他变量

auto a = 10,b=20,c=30;√
auto a = 10,b='a';    X

3、auto不能声明数组,也不可以作为函数的参数

int func(auto x){};   X
auto arr[200];        X

五、范围for循环

对于有范围的数组,范围for循环能够让程序员更方便的遍历数组

int arr[10] = {0,1,2,3,4,5,6,7,8,9};
for(int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)//传统for循环
for(int e : arr) //范围for循环

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

需要注意的是,e是临时变量,更改时无法改变原数组,若要改变原数组,可以使用引用:

for(int& e : arr) //引用

六、结语

到这里今天的内容就结束了,希望能对大家学习C++有所帮助,我是蓝色学者,我们下次再见!

【C++修行之路】引用、内联函数、auto关键字、范围for循环相关推荐

  1. C++学习笔记之——引用 内联函数

     本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者 ...

  2. C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性

    C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...

  3. 【C++入门】函数重载,引用,内联函数......

    目录 命名空间 C++的输入与输出 缺省参数 函数重载 引用 内联函数 auto关键字 命名空间 在C++的学习过程中,比起C语言,C++有着更多的函数,关键字等等,但是他们都存在于全局作用域中,就可 ...

  4. C++ 基础 : 函数重载、引用、内联函数、auto、范围for循环

    函数重载 引用 内联函数 auto 范围for循环 函数重载 C++中引入了一个新特性,函数重载. 在同一个作用域下,对于相同的函数名,函数的参数不同,不同类型的参数顺序不同,参数的个数不同,都可以形 ...

  5. C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针

     目 录 1      开始学习C++............................................................................... ...

  6. 【C++】引用、内联函数、函数重载、函数默认参数(缺省参数)与占位参数、extern “C“ 浅析

    端午继续~         C++对C的扩展 目录 引用 普通变量名引用 对数组的引用 对指针的引用 对函数的引用 引用作为函数的参数 引用作为函数的返回类型 常引用 内联函数 函数重载 函数的默认参 ...

  7. 【C++之函数】引用符号、内联函数inline、函数重载

    文章目录 引用(&)是标识符的别名 内联函数(关键字:inline) 函数重载 引用(&)是标识符的别名 声明一个引用指向一个对象,则只是为对象的别名,其本身同所指对象保持一致. 例如 ...

  8. C++起始(内联函数,宏的优缺点,const关键字,auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11))

    内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率 函数前增加inline关键字将其改成内联函数,在编 ...

  9. ios内联函数 inline

    ios内联函数 inline 缘由 由于在学习使用UIScrollVew开发的过程中,碰到下面这个属性(设置内边距): @property(nonatomic) UIEdgeInsets scroll ...

最新文章

  1. php文本计数器源码,php 简单文本计数器[基于文件系统的页面计数器范例]
  2. JSP/Servlet 工作原理
  3. 秀尔算法:破解RSA加密的“不灭神话” --zz
  4. Linux 问题分析,性能优化
  5. PHP的面向对象 — 封装、继承、多态
  6. MVC3.0 将网站设为首页和加为收藏的实现(IE/Firefox)
  7. 推荐一款日志切割神器!我常用~
  8. 无盘服务器秒卡 锐起0359,锐起无盘系统问题汇集
  9. 求解不定方程 (扩展欧几里得算法)
  10. 超详细的 Python 方法、函数总结
  11. MapServer教程
  12. java后端getmonth_Java中的MonthDay getMonth()方法
  13. 我叫mt4服务器注册 满了,我叫MT4注册上限怎么办 人数上限解决办法
  14. 手把手教你搭建STM32MP1开发环境
  15. Java 处理资源的try语句 (try-with-resources, TWR)
  16. html+canvas+输入文字换行,canvas文字换行
  17. 依赖倒转原则和里氏代换原则详解
  18. UVC摄像头开发(一)
  19. C#中 out的使用
  20. 【 C++11 】列表初始化、声明、范围for、STL中一些变化

热门文章

  1. 微信小程序使用自动更新证书不成功的原因
  2. mac m4a转mp3怎么转?
  3. [附源码]java+ssm计算机毕业设计java基于Java通识课程管理系统v87xr【源码、数据库、LW、部署】
  4. StrictMode ——安卓严苛模式
  5. 旧电脑装html5,老式电脑安装Win10还是Win7系统流畅?
  6. Element is not exported
  7. 2018京东C++开发工程师实习面经
  8. python爬虫笔记之re.IGNORECASE
  9. 一个企业级数据挖掘实战项目|教育数据挖掘
  10. 资金表实现过程方案一:资金表与冻结表合并(一)