c++的学习之路:3、入门(2)

一、引用

1、引用的概念

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

怎么说呢,简单点理解就是你的小名,家里人叫你小名,你就不是你了?显然不是,这个就是引用的概念,在变成过程中,引用的用法就是如下方图片就是最简单的引用表示,我先定义一个变量a然后给a取别名为b然后这里是把他们的地址都打印出来了,然后发现他们的地址都是一个,这样就能最简单的证明了引用就是取别名,就是共同访问同一个地址。

那么能否给b接着取别名呢?

当然可以了,如果收,别人叫你的小名,再给这个小名去一个小名就不是自己了?,代码测试如图,这样就可以得出引用是可以套用的。而&这个就是引用的符号,他和取地址符是同一个,那是因为他的原理其实就是一个指针。

2、引用的特性

引用在定义时必须初始化,因为引用和指针不同,指针是存放这个变量的地址,也就是说,这个指针,也可以不初始化,放入空值都是可以的。

 一个变量可以有多个引用,这个就像上文中说的,可以取好几个别名,最间的的说明就是一个人是可以有很多称呼的,如下图就可以看出,对d取地址就可以看出也是a。

引用一旦引用一个实体,再不能引用其他实体 ,这个引用不学指针可以更改地址,引用是只可以对一个变量引用,也就是说b是a的引用,那么b只能是a的别名,不可能存在b是别的别名,那么就可以说明引用具有唯一性。

引用是具有等级权限的 ,最简单就是常量,如下如图所示,就可以看出,如果对一个常量进行引用,就会报错,这就是引用的权限,引用是只可以限制权限,不能放大权限,就像下图所示,a是一个常量,然后他的属性是只读,那么b想引用他,并且变成可以写的变量,那肯定是不可以的,但是假如说,变量a是可以读写的,引用的时候只限制成只读,可以吗?答案是可以的,因为引用可以把权限变小,如下图二所示是没有报错的就是可以的,那么如何引用常量呢,就是把权限限制为平级,也就是也变成常量,如下图三就是把别名也变成常量,那么权限就是平级的了,所以也就是可以使用引用了。

 3、引用可以做什么?

最简单的就是传参,例如以前想要改变一个变量的值,那么就需要传递一个指针过去,但是有了引用就轻松多了,可以直接传参过去,然后函数内引用,访问的还是这个变量的地址,效果如图就是利用引用进行传参,还有就是返回值,就是经常使用的函授返回值,例如ADD返回两数相加的和,那么利用引用的话可以直接接收,不会产生临时变量,毕竟函数返回时,在栈帧销毁时,返回的值也是一个局部变量,会在函数结束时,随着栈帧的销毁而销毁,所以函数的返回时本质是创建一个临时变量,进行传参,在销毁,用引用传参如下图所示。

 但是一般的函数是不能这样使用的,因为如果一个函数在销毁后,接着去访问这个地址可能会找到啥?这个是不确定的,因为临时变量是在会销毁的,如果这个空间在销毁时,没被随机值刷新,那么可能会找到正确的值,但是如果这个空间在销毁时被随机值刷新了 ,那么就是访问到随机值,这个就是一个典型的越界访问了,所以这样使用引用时是有限制的,只有在静态变量、全局变量、栈帧还没没有销毁时、malloc等情况下才能用引用去取返回值,其他的情况就需要使用返回值了,那么对比一下引用和返回值的效率吧,代码测试如下图可以看出差别还是挺大的。

#include <time.h>
struct A { int a[10000]; };
void test1(A a) {}
void test2(A& a) {}
void test3()
{
    A a;
    size_t begin1 = clock();
    for (size_t i = 0; i < 100000; ++i)
        test1(a);
    size_t end1 = clock();
    size_t begin2 = clock();
    for (size_t i = 0; i < 100000; ++i)
        test2(a);
    size_t end2 = clock();
    cout << end1 - begin1 << endl;
    cout << end2 - begin2 << endl;
}

int main()
{
    test3();
    return 0;
}

4、引用和指针的区别

在上面说过引用的原理其实就是指针,但是引用和指针还是有点区别的,区别如下:

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

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

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

④没有NULL引用,但有NULL指针

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

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

⑦有多级指针,但是没有多级引用

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

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

二、内联函数

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

简而言之就是和宏的用处差不多,宏是有缺陷,因为在宏的使用时是直接替换的,这样代码的安全性就大大下降了,总结一下宏的优缺点

优点:

1.增强代码的复用性。

2.提高性能。

缺点:

1.不方便调试宏。(因为预编译阶段进行了替换)

2.导致代码可读性差,可维护性差,容易误用。

3.没有类型安全的检查 。

而内联函数的用法就是和宏差不多,但是它可以把一个函数变成宏,但是有一点就是内联时,函数的代码是要求尽量简短,当然如果过多时编译器依然会把他当成函数处理,在简短 时内联函数就是直接替代,从下图反汇编就可以看出内敛函数是直接替代的,而不是call这个函数但是当行数过多时依然会当成函数调用了,测试如下,就可以看出内联函数也不是所有都可以替代。内联函数也不建议声明和定义分离,分离会导致链接错误。因为内联函数被展开,就没有函数地址了,链接就会找不到

inline int ADD(int a, int b)
{
    return a + b;
}

inline int ADD1(int a, int b, int c)
{
    c = a + b;
    a = a + b;
    b = a + b;
    c = a + b;
    a = a + b;
    b = a + b;
    c = a + b;
    a = a + b;
    b = a + b;
    c = a + b;
    a = a + b;
    b = a + b;
    c = a + b;
    a = a + b;
    b = a + b;
    c = a + b;
    a = a + b;
    c = a + b;
    b = a + b;
    return c;
}
int main()
{
    int ret = ADD(1, 3);
    int ret1 = ADD1(1, 3,2);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot和vue的旅游资源网站的设计与实现

环境以及简介 基于vue, springboot旅游资源网站的设计与实现&#xff0c;Java项目&#xff0c;SpringBoot项目&#xff0c;含开发文档&#xff0c;源码&#xff0c;数据库以及ppt 环境配置&#xff1a; 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xf…

谷歌seo营销服务有哪些服务?

以我们举例&#xff0c;如果你在做B2B外贸建站&#xff0c;这里有全套保姆式托管服务&#xff0c;让你既省心又省力&#xff0c;七天就能搞定网站建设&#xff0c;快速上线&#xff0c;再来就是谷歌白帽SEO&#xff0c;我们这边强调的是纯白帽操作&#xff0c;专注于高质量的原…

今天聊聊新零售

一、什么是新零售&#xff1f; 2016年&#xff0c;在杭州举行的“云栖大会”上&#xff0c;马云发表了讲话&#xff0c;首次提出了“新零售”这一概念。 1.1 新零售概念 新零售&#xff0c;英文是New Retailing&#xff0c;新零售是对人货场的重构。人是消费者、销售人员、…

CISP 4.2备考之《物理与网络通信安全》知识点总结

文章目录 第 1 节 物理与环境安全第 2 节 网络安全基础第 3 节 网络安全技术与设备第 1 部分 防火墙第 2 部分 入侵检测系统第 3 部分 其他安全产品 第 4 节 网络安全设计规划 第 1 节 物理与环境安全 1.场地选择 1.1 场地选择:自然条件、社会条件、其他条件。1.2 抗震和承重&…

【操作系统】进程基础知识

目录 1、进程的介绍 2、进程的五个基本特性 3、进程的组成 4、进程的并行和并发执行 5、进程的状态 6、进程的通信 7、线程 1、进程的介绍 进程&#xff08;Process&#xff09;是程序在某个数据集合上的一次运行活动&#xff0c;也是操作系统进行资源分配和保护的基本单…

java设计模式(1)---总则

设计模式总则 一、概述 1、什么是设计模式 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 解释下&#xff1a; 分类编目&#xff1a;就是说可以找到一些特征去划分这些设计模式&#xff0c;从而进行分类。 代码设计经验&#xff1a;这句很重…

使用Intellij idea编写Spark应用程序(Scala+SBT)

使用Intellij idea编写Spark应用程序(ScalaSBT) 对Scala代码进行打包编译时&#xff0c;可以采用Maven&#xff0c;也可以采用SBT&#xff0c;相对而言&#xff0c;业界更多使用SBT。 运行环境 Ubuntu 16.04 Spark 2.1.0 Intellij Idea (Version 2017.1) 安装Scala插件 安…

【微服务】StackOverflow的架构学习

目录 架构基础设施网络服务器SQL 服务器Redis推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战StackOverflow 是资源需求量最大的网站之一。我们作为架构师,在进行各种微服务架构的实践的同时,也需要学习借鉴各个成熟实践的精华。 因此本…

【HarmonyOS】ArkUI - 状态管理

在声明式 UI 中&#xff0c;是以状态驱动视图更新&#xff0c;如图1所示&#xff1a; 图1 其中核心的概念就是状态&#xff08;State&#xff09;和视图&#xff08;View&#xff09;&#xff1a; 状态&#xff08;State&#xff09;&#xff1a;指驱动视图更新的数据&#xf…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-子串分值和

solution1&#xff08;通过40%&#xff09; 依次求子串并统计出现过的字母个数 #include<iostream> #include<string> #include<set> using namespace std; int main(){string s, subs;cin >> s;int len s.size(), ans 0;for(int j 1; j < len…

【LabVIEW FPGA入门】FPGA寄存器(Register)

当您需要从多个时钟域或设计的不同部分访问数据&#xff0c;并且需要编写可重复使用的代码时&#xff0c;可使用寄存器项来存储数据。与 FIFO 相比&#xff0c;寄存器项消耗的 FPGA 逻辑资源更少&#xff0c;而且不消耗块存储器&#xff0c;而块存储器是最有限的 FPGA 资源类型…

2024阿里云2核2G服务器租用价格99元和61元一年

阿里云2核2G服务器配置优惠价格61元一年和99元一年&#xff0c;61元是轻量应用服务器2核2G3M带宽、50G高效云盘&#xff1b;99元服务器是ECS云服务器经济型e实例ecs.e-c1m1.large&#xff0c;2核2G、3M固定带宽、40G ESSD entry系统盘&#xff0c;阿里云活动链接 aliyunfuwuqi.…

微光图像增强算法学习记录(一)

微光图像增强&#xff08;LLIE&#xff09;旨在恢复照明并提高微光图像的可见性&#xff0c;本文对阅读的文献进行记录和分享&#xff0c;帮助回顾和大家建立学习资料。 文献一摘要及前沿摘选主要贡献网络结构实验结论 文献二摘要 文献三摘要主要贡献网络架构实验 文献四摘要实…

机器学习K-means算法

K-Means 算法&#xff08;K-Means算法、K-Means 中心值计算、K-Means 距离计算公式、K-Means 算法迭代步骤、K-Means算法实例&#xff09; 问题引入 给你如下两种图片&#xff0c;快读回答2个问题&#xff0c;问 图1 中有几类五谷杂粮&#xff1f;问 图2 中有几类五谷杂粮&…

linux源配置:ubuntu、centos;lspci与lsmod命令区别

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…

基于SpringBoot+MyBatis框架的智慧生活商城系统的设计与实现(源码+LW+部署+讲解)

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台功能拓展 商品详情单管理 个人中心 秒杀活动 推荐系统 评论与评分系统 后台功能拓…

分布式之网关介绍

一、网关简介 1、网关背景 由于微服务“各自为政的特性”使微服务的使用非常麻烦。通常公司会有一个“前台小姐姐”作为统一入口&#xff0c;这就是网关 2、网关作用 统一入口&#xff1a;为服务提供一个唯一的入口&#xff0c;网关起到外部和内部隔离的作用&#xff0c; 保…

阿里云幻兽帕鲁4核16G和8核32G服务器优惠价格

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …

C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序

1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…

AJAX-综合

文章目录 同步代码和异步代码回调函数地狱解决回调函数地狱Promise-链式调用async函数和awaitasync函数和await-捕获错误 事件循环宏任务与微任务Promise.all静态方法 同步代码和异步代码 同步代码&#xff1a;逐步执行&#xff0c;需原地等待结果后&#xff0c;才继续向下执行…