广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++详细分析讲解引用的概念与使用
  • 104
分享到

C++详细分析讲解引用的概念与使用

2024-04-02 19:04:59 104人浏览 薄情痞子
摘要

目录1.引用的概念2.引用的格式3.引用的特性4.取别名原则5.引用的使用场景做参数做返回值int&Count()的讲解传值传引用效率比较6.引用和指针的不同点1.引用的概念

1.引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

2.引用的格式

类型 & 引用变量名 ( 对象名 ) = 引用实体;

举例如下:

注意:引用类型必须和引用实体是同种类型的

3.引用的特性

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

例如:int& d; 这样就是没有初始化是错的

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

    int a = 10;
    int& b = a;
    int& c = b;
    int* p = &b;    //p是指针

(3). 引用一旦引用一个实体,再不能引用其他实体

4.取别名原则

对原引用变量,权限只能缩小,即 可读可写(普通类型) 可以改成 只读(const);不能放大:,即 只读 不能改成 可读可写的

例子1:权限的放大,不能把const给非const

例子2:权限的缩小 非const 既可以给非const,也可以给const:

例子3:权限缩小和放大规则:适用于引用和指针间

例子4: 权限不适用于普通赋值:

难点:隐式类型转换的引用

整形e能否做双精度浮点型d的别名呢?

直接赋值是不行的,需要加上const才正确。即:const int& e = d; 正确

解释:隐式类型转换的普通赋值的情况,上面的例子:int f=d;从语法上看把8字节的d不能直接给4字节的f,因为浮点数和整形的存储形式就不一样,没办法直接截取,所以d需要先把整数部分给一个4字节的临时变量,再把临时变量给f

再看引用:int& e=d; 临时变量具有常性,所以这里把临时变量给引用e的时候,相当于是把自带const的临时变量赋值给非const的e,把只读的给可读可写的是放大了权限,所以错误;必须改成const int& e=d;才正确!

5.引用的使用场景

做参数

(1)传参:实参给形参传值和传地址都需要传一份值/地址的拷贝,引用传参可以减少拷贝,提高效率

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 0, b = 1;
	swap(a, b);
	double c = 1.1, d = 2.2;
	swap(c, d);
	return 0;
}

(2)作输出型参数:

LeetCode上的题往往有输出型参数,在c++中就可以用引用代替更加方便

做返回值

int&Count()的讲解

传值返回:会有一个拷贝

传引用返回:没有这个拷贝了,函数返回的直接就是返回变量的别名

int& Count()
{
	int n = 0;
	n++;
	return n;
}
int main()
{
	int ret = Count();
	return 0;
}

首先我们来看普通的传值返回:普通的传值返回需要把返回值n给一个函数类型int的临时变量(函数类型就是返回值类型),再把临时变量给ret。

为什么设计一个临时变量,直接把n给ret不行吗?

答:不行,因为当函数Count里执行完各种代码后,返回n,等出了Count函数的作用域后n就会销毁,所以不能直接把n给ret,需要一个临时变量。

如何证明返回时存在临时变量呢?:如果你用int& ret 接收,写成int& ret = Count(); 发现无法运行,因为临时变量有常性,所以需要写成const int& ret = Count();才能通过。

此时再看传引用返回:

当用引用接收引用返回时:这里ret和n的地址一样,也就意味着ret其实就是n的别名。但是因为n出作用域不会立即被覆盖,所以第一次通过ret可以打印是1,当打印第二次时,因为前面已经调用过一次打印函数,已 "销毁" 的Count函数栈帧在此时被打印函数覆盖,再打印ret就会是随机数了!

即:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已 经还给系统了,则必须使用传值返回。

用static修饰n后:用static静态变量使n只初始化一次且改变其生命周期,把n放进了静态区,这样n就一直存在,就可以通过ret找到n了,再怎么打印ret都是1.

传值传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是 当参数或者返回值类型非常大时,效率就更低。 总结:传值和指针在作为传参以及返回值类型上效率相差很大 。

6.引用和指针的不同点

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

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

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

4. 在 sizeof 中含义不同 : 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32 位平台下占 4 个字节 )

5. 引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小

6. 有多级指针,但是没有多级引用

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

8. 引用比指针使用起来相对更安全

引用和指针在语法上是不一样的,但是实际上从反汇编的代码上我们能看到引用和指针的底层实现是一样的!

这就好比保时捷的卡宴和大众的途锐汽车,他们的三大件底盘,发动机,变速箱都是一样的,但是他们的品牌不一样,价格不同

到此这篇关于C++详细分析讲解引用的概念与使用的文章就介绍到这了,更多相关C++引用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++详细分析讲解引用的概念与使用

本文链接: https://www.lsjlt.com/news/148517.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++详细分析讲解引用的概念与使用
    目录1.引用的概念2.引用的格式3.引用的特性4.取别名原则5.引用的使用场景做参数做返回值int&Count()的讲解传值传引用效率比较6.引用和指针的不同点1.引用的概念...
    99+
    2022-11-13
  • C语言超详细讲解指针的概念与使用
    目录一、指针与一维数组1. 指针与数组基础2. 指针与数组3. 一个思考二、指针与字符串三、指针和二维数组1. 指针数组与数组指针2. 指针数组3. 数组指针一、指针与一维数组 1....
    99+
    2022-11-13
  • c++分离讲解模板的概念与使用
    目录泛类编程函数模板函数模板的概念函数模板的使用函数模板的实例化函数模板的匹配原则类模板类模板的定义格式类模板的实例化泛类编程 学习模板,首先我们需要了解一下什么是泛类编程 #inc...
    99+
    2022-11-13
  • C语言 超详细总结讲解二叉树的概念与使用
    目录1.二叉树的概念及结构 2.二叉树链式结构的实现1.二叉树的概念及结构  ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别...
    99+
    2022-11-13
  • C++深入讲解类与封装的概念与使用
    目录一、类的组合二、类的封装三、类成员的作用域四、小结一、类的组合 电脑一般而言是由 CPU,内存,主板,键盘和硬盘等部件组合而成。 二、类的封装 类通常分为以下两个部分 类的实现...
    99+
    2022-11-13
  • C++ 超详细梳理继承的概念与使用
    目录继承的概念及定义继承的概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱...
    99+
    2022-11-13
  • 详解C#中委托的概念与使用
    目录委托的概念多播委托拖动按钮委托的概念 委托这个名字取的神乎其神的,但实质是函数式编程,把函数作为参数传递给另一个参数。对于C语言程序员来说,就是把函数指针当作参数传递给另一个函数...
    99+
    2023-02-27
    C#委托使用 C#委托
  • C++关于const与引用的分析讲解
    目录一、关于 const 的疑问二、关于引用的疑问三、小结一、关于 const 的疑问 const 什么时候为只读变量?什么时候是常量? const 常量的判别准则 只有用字面量初始...
    99+
    2022-11-13
  • C语言详细分析讲解struct与union使用方法
    目录一、struct 的小秘密二、结构体与柔性数组三、C语言中的 union四、小结一、struct 的小秘密 C语言中的 struct 可以看作变量的集合 struct ...
    99+
    2022-11-13
  • C++超详细讲解auto与nullptr的使用
    目录一. auto关键字1. auto介绍2. 使用规则3. auto不能推导的场景二. 基于范围的for循环(C++11)1. 范围for的语法2. 范围for的使用条件三. 指针...
    99+
    2022-11-13
  • C++ 超详细讲解stack与queue的使用
    目录stack介绍和使用模拟实现stack的使用例题最小栈栈的弹出压入序列逆波兰表达式求值queue模拟实现容器适配器deque简介priority_queue优先级队列priori...
    99+
    2022-11-13
  • C语言详细分析讲解关键字const与volatile的用法
    目录一、const 只读变量二、const 全局变量的分歧三、const 的本质四、const 修饰函数参数和返回值五、volatile 解析六、小结一、const 只读变量 con...
    99+
    2022-11-13
  • C语言详细分析讲解关键字goto与void的作用
    目录一、关于goto二、void 的意义三、小结一、关于goto 高手潜规则:禁用 goto项目经验:程序质量与 goto 的出现次数成反比最后的判决:将 goto 打入冷宫 下面看...
    99+
    2022-11-13
  • C++stack与queue使用方法详细讲解
    目录Stack的介绍和使用stack的默认定义的模板stack的使用queue的介绍和使用queue的默认定义的模板queue的使用Stack的介绍和使用 stack的文档介绍 st...
    99+
    2023-01-04
    C++ stack与queue C++ stack使用方法 C++ queue使用方法
  • mysql详细分析讲解子查询的使用
    出现在其他语句中的 select 语句,称为子查询或内查询;外部的查询语句,称为主查询或 外查询 .  -- 子查询 -- 查询的条件来自于另一查询的结果 SEL...
    99+
    2022-11-13
  • C语言详细分析讲解关键字enum与sizeof及typedef的用法
    目录一、枚举类型的使用方法二、sizeof 关键字的用法三、typedef 的意义四、小结一、枚举类型的使用方法 enum 是 C 语言中的一种自定义类型enum 值是可以根据需要自...
    99+
    2022-11-13
  • Vuex与Vuerouter的使用详细讲解
    目录Vuex的使用Vuex的使用流程Vuex的执行流程图Vuex伪代码Vue-router的使用基本使用流程路由的跳转携带参数的路由跳转路由嵌套路由守卫Vuex的使用 在Vue中实现...
    99+
    2022-11-13
    Vuex的使用 Vue router使用
  • C语言超详细讲解宏与指针的使用
    目录1、关于define2、初识指针(1)内存(2)示例(3)指针的使用示例(4)指针变量的大小1、关于define define是一个预处理指令,有两种用法,一种是用define定...
    99+
    2022-11-13
  • Java详细讲解分析双指针法的使用
    目录前言1.判断链表是否有环2.查找链表中间的元素3.奇偶排序前奇后偶4.删除排序链表的重复元素5.三数之和6.分割链表7.合并两个有序的数组8.两数之和—输入有序数组9...
    99+
    2022-11-13
  • C语言详细讲解#error与#line如何使用
    目录一、#error 的用法二、#line 的用法三、小结一、#error 的用法 #error 用于生成一个编译错误消息 用法 #error message,message不需要用...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作