c++引用和内联函数

news2024/11/17 21:29:44

一、引用

1.引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。(引用类型必须和引用实体是同种类型的),如:

int a = 0;
int& x = a;

2.特点

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

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

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

4.对一个被多次引用的实体来讲,某一个引用改变,其他引用和实体也发生相同改变

3.引用做参数

void swap(int& a, int& b)
{
	int tem = a;
	a = b;
	b = tem;
}

用引用时可以改变对应值的实参

4.常引用

权限的问题

    int x = 0;
    int& y = x;

     //权限的缩小,可以
    const int& z = x;

y++;

 const int& z = x;不会报错是因为权限的缩小,x是可读可写,z被const修饰后只可读,属于权限的缩小

const int a = 10;

int& ra = a;   // 该语句编译时会出错,a为常量

int& ra = a; 该语句会报错是因为权限的放大,a可读,但ra可读可写,将权限放大 

int x=0;

int* p3 = &x;
const int* p4 = p3;

该语句属于权限的缩小 

类型问题

double d = 12.34;
//int& rd = d;  // 该语句编译时会出错,类型不同(d是double类型,会先将其值给一个中间值,然后中间值再赋给rd值,但中间值具有常数性,所以该条不成立,但const int&rd=d成立)

 d会先产生临时变量,临时变量具有常性,属于权限的放大,可改为const int& rd = d

5.引用和指针区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的

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

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

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

4. 没有NULL引用,但有NULL指针(不是绝对的)

int* ptr = NULL;
int& r = *ptr;
//cout << r << endl;

第二行不会报错,本质上r存的是ptr的地址,但输出r的话会进行解引用,会报错

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

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

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

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

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

二、内联函数

在谈内联函数前,先解决一个关于c语言关于宏的问题,为了防止频繁调用一些函数,我们采用了宏这种方式,如:

#define ADD(a, b) ((a) + (b))
// 1.为什么不能加分号?
// 2.为什么要加外面的括号?
// 3.为什么要加里面的括号?
//1.cout << ADD(1, 2) << endl;报错
//2.防止外面遇到优先级更高的运算符
//3.防止遇到比加号优先级还要低的

 宏注意细节很多,并且没有类型检查,不能调试,但在c++中出现了内联函数来更好的解决问题

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

2.特性

1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。 2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现),可能存在函数体过大inline无法使函数体展开的情况

3.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到,所以函数体可直接写在声明中

因为c语言中宏定义具有很多缺陷,所以我们在c++中对于短小函数用inline函数代替

typedef char* pstring;
// const pstring p1; // 编译成功还是失败?

// const pstring* p2; // 编译成功还是失败

typedef也具有一定的缺点,上图第一句编译失败,因为const修饰的是p1,常量本身必须被初始化,所以会报错 

三、nullptr

void f(int a)
{
	cout << "f(int)" << endl;
}
void f(int* a)
{
	cout << "f(int*)" << endl;
}
int main()
{
		f(0);
		f(NULL);
		f((int*)NULL);
		f(nullptr);
	return 0;
}

c++对于NULL指针的定义为0,所以在c++中我们一般使用nullptr作为空指针

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

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

相关文章

漫谈企业信息化安全-综述

一、前言 一直以来想写一些文章&#xff0c;谈一谈企业信息化过程中的安全问题及对策。 随着信息技术的不断发展和普及&#xff0c;特别是今年来移动办公、云服务等等新的工作模式和新的信息技术的应用&#xff0c;企业信息化已经成为提升竞争力、促进创新和发展的重要途径。…

QT小项目:实现远程登录数据库功能(下一章实现主界面菜单设计)

一、环境 1、下载 vs_redist.x64和mysql-connector-c8.0.27-winx64.msi(这个依赖于前者)。 mysql-connector-c8.0.27-winx64.msi vs_redist.x64 二、将程序的数据库登录部分修改 1、这里新增一个控件方便客户端输入ip地址 2、打包项目&#xff0c;步骤参考 QT 项目打包 3、将…

揭秘 淘宝死店采集私信筛选,号称日赚500+

淘宝死店采集工具为电子商务创业者揭示了一个领域的新机遇&#xff0c;通过提供一系列深入分析和资源挖掘的功能&#xff0c;展现了从失败中寻找成功之道的独特方法论。以下是如何通过这种工具寻找电商平台中的隐含机会的几个关键方面&#xff1a; 分析失败的深层原因&#x…

AbMole - 肿瘤发展与免疫器官的“舞蹈”:一场细胞层面的时间赛跑

在生物医学领域&#xff0c;肿瘤与免疫系统之间的相互作用一直是研究的热点话题。肿瘤细胞不是孤立存在的&#xff0c;它们与宿主的免疫系统进行着一场复杂的“舞蹈”。 最近&#xff0c;一项发表在《Molecular & Cellular Proteomics》杂志上的研究&#xff0c;为我们揭开…

kube-apiserver内存占用过多 go tool pprof 入门

目录 环境问题排查1、kube-apiserver %CPU 146 正常&#xff0c;%MEM 高达70&#xff0c;&#xff0c;load average 400&#xff0c;出现kswapd0进程。2、k describe node 看到 SystemOOM3、是否大量连接导致&#xff1f;4、通过prom查看指标5、访问K8s API6、pprof 火焰图 解决…

某方protobuf闲谈

问题 当我们去看某方的时候,搜索了关键词svm,然后通过抓包查看,请求的Request Payload是一串看不懂的乱码,并且返回的数据也大部分是乱码 观察请求的Content-Type是application/grpc-web+proto,没错数据的传输是protobuf的形式了 protobuf的相关概念和原理,网上有很多教…

火山引擎“奇袭”阿里云

图片&#xff5c;电影《美国队长3》剧照 ©自象限原创 作者丨程心 编辑丨罗辑 大模型价格战&#xff0c;已经不是什么新闻。 从OpenAI发布GPT-4o&#xff0c;将API价格下调50%&#xff0c;并宣布面向普通用户免费开始&#xff0c;就标志着大模型的竞争从性能进入到了成本…

CSS单位px、rem、em、vw、vh的区别

目录 前言 零.视口介绍 一.px 二.em 三.rem【重要】 3.1rem介绍 3.2rem与em的区别 四.vw、vh、vmax、vmin 五.注意问题 5.1如何使1rem 10px&#xff1f; 5.2如果父元素没有指定高度&#xff0c;那么子元素的百分比高度是多少&#xff1f; 5.3更多问题 前言 这几…

【MySQL】——并发控制

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

手机端如何访问本地vue+vite项目,实现实时调试?

一、应用场景 h5&#xff08;vuevite&#xff09;嵌入app后&#xff0c;出现某种问题时&#xff0c;需要每次发布坏境后&#xff0c;才能才看效果&#xff0c;这种来回很耗时间&#xff0c;本文章在于解决手机端直接访问本地启动应用项目&#xff0c;无需重复发布坏境 二、实…

南京观海微电子---2种 电流检测中的高低边采样电阻和共模抑制比问题

电流检测有两种方法&#xff1a; 一种是用封装好的电流检测芯片采样电阻&#xff1b; 另一种是自己搭建运放电路 高端检测&#xff1a; 低端检测&#xff1a; 自己搭建运放电路&#xff1a;&#xff08;这种对电阻的精度要求较高&#xff0c;对称电路中电阻的一致性&#xff…

WindowsCMD窗口配置OhMyPosh

WindowsCMD窗口配置OhMyPosh 文章目录 WindowsCMD窗口配置OhMyPosh1. 按装Clink1. 安装Oh-My-Posh2. 安装Clink2. 安装后的位置 2. 编写Lua脚本1. oh-my-posh Lua脚本2. 重启cmd窗口看效果 OhMyPosh对Windows CMD 没有现成的支持。 然而可以使用Clink来做到这一点&#xff0c;它…

【线程的互斥】

线程的互斥 临界区资源多个线程的运行多个线程对同一资源的竞争原子性保持线程之间地互斥互斥量(锁的原理)为什么是原子的 正确使用锁 临界区资源 进程创建线程&#xff0c;是共享内存的&#xff0c;可以对共享的资源有很方便的操作&#xff0c;当一些共享资源可以被多个线程进…

【编译原理--- 汇编、编译、解释系统】

汇编、编译、解释系统 1.编译方式和解释方式 程序种类是否生成目标程序是否参与程序的运行过程程序执行速度可移植性编译程序生成不参与快差解释程序不生成参与慢好 编译方式过程&#xff1a;词法分析、语法分析、语义分析、&#xff08;中间代码生成、代码优化、&#xff0…

重生奇迹MU格斗家上手最轻松的职业

重生奇迹MU格斗家玩法攻略&#xff0c;有一个比较奇葩的职业&#xff0c;那就是格斗家。格斗家拥有其他职业没有的优势&#xff0c;就是加体力和敏捷都可以提升攻击力百分比。格斗家玩法攻略 目前格斗家最多的就是敏格玩法&#xff0c;配合智力MM加成后的幽冥光速拳可以说是第…

修改VSCode中md文件中上传图片的路径

vs上打开md上传一个图片默认的路径是当前文件夹&#xff0c;可以发现&#xff0c;图片一多&#xff0c;非常的乱。 我们希望的是在单独的一个文件中存放图片即可。 使用ctrl , 快捷键&#xff0c;输入markdown 添加一个新的key/value。 **/*.md assets/${documentBaseName}/…

抖音运营_如何做好抖音直播

目录 如何做好抖音直播 一 带货主播应具备的技能 1 专业技能 2 语言表达能力 3 场控应变技能 4 熟悉平台规则 二 选品技巧 1 选择与账号属性相关的产品 2 选择试用过的产品 3 选择热销产品 4 选择低客单价产品 三 直播间产品的管理 四 打造转化率高的直播间 1 突出…

探秘SpringBoot默认线程池:了解其运行原理与工作方式(@Async和ThreadPoolTaskExecutor)

文章目录 文章导图Spring封装的几种线程池SpringBoot默认线程池TaskExecutionAutoConfiguration&#xff08;SpringBoot 2.1后&#xff09;主要作用优势使用场景如果没有它 2.1版本以后如何查看参数方式一&#xff1a;通过Async注解--采用ThreadPoolTaskExecutordetermineAsync…

Jenkins 构建 Maven 项目:构建服务器和部署服务器分离的情况

bash内容 #!/bin/bash#删除历史数据 rm -rf ruoyi-admin.jar# appname$1 appnamevideo.xxxxx.com #获取传入的参数 echo "arg:$appname"#获取正在运行的jar包pid # pidps -ef | grep $1 | grep java -jar | awk {printf $2} pidps -ef | grep $appname | grep java …

C# 深拷贝和浅拷贝

文章目录 1.深拷贝2.浅拷贝3.拷贝类4.浅拷贝的实现5.深拷贝实现5.1 浅拷贝对象&#xff0c;对引用类型重新一个个赋值5.2 反射实现5.3 利用XML序列化和反序列化实现 1.深拷贝 拷贝一个对象时&#xff0c;不仅仅把对象的引用进行复制&#xff0c;还把该对象引用的值也一起拷贝。…