C++入门(3):引用,内联函数

一、引用

1.1 引用特性
  1. 引用必须初始化

在这里插入图片描述

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

  2. 引用一旦引用一个实体,就不能引用其他实体

int main()
{int a = 10, C = 20;int& b = a;b = c; // 赋值?还是b变成c的别名?return 0;
}

在这里插入图片描述

1.2 常引用

引用权限可以平移或缩小,但是不能放大

int main()
{// 情形1const int a = 10;// int& a1 = a; // errorconst int& a2 = a;// 情形2// int& b = 10; // errorconst int& b1 = 10;// 10具有常属性,权限平移// 情形3int c = 10;// double& c1 = c;// error,类型不同const double& c2 = c;// 隐式类型转换过程中,会创建一个具有常属性的临时变量return 0;
}
1.3 使用场景
  1. 做参数
#include <iostream>
using namespace std;void Swap(int& x, int& y)
{int tmp = x;x = y;y = x;
}int main()
{int a = 10;int b = 20;Swap(a, b);return 0;
}
  1. 做返回值

观察以下几个场景。

​ (a).

#include <iostream>
using namespace std;int count1()
{int n = 0;n++;return n;
}int& count2()// 实际上是个错误程序
{int n = 0;n++;return n;
}int& count3()
{static int n = 0;n++;return n;
}int main()
{int ret1 = count1();cout << ret1 << endl;int ret2 = count2();cout << ret2 << endl;int& ret3 = count2();// ret3是n的别名,count2函数栈帧销毁后,ret3/n 的值是不确定的cout << ret3 << endl;cout << ret3 << endl;int& ret4 = count3();cout << ret4 << endl;return 0;
}

​ (b).

#include <iostream>
using namespace std;// static
int& Add1(int a, int b)
{static int c = a + b;return c;
}int& Add2(int a, int b)
{static int c;c = a + b;return c;
}int main()
{int& ret1 = Add1(1, 2);cout << "Add1(1, 2) = " << ret1 << endl;Add1(3, 4);cout << "Add1(1, 2) = " << ret1 << endl << endl;int& ret2 = Add2(1, 2);cout << "Add2(1, 2) = " << ret2 << endl;Add2(3, 4);cout << "Add2(1, 2) = " << ret2 << endl << endl;return 0;
}

在这里插入图片描述

1.4 传值、传引用效率比较

以值作为参数或返回值类型,在传参和返回期间,函数不会传递实参或将变量本身直接返回,而是传递实参或返回变量的一份临时拷贝。因此用值作为参数或返回值类型,效率非常低下。

1.5 引用和指针的区别

语法概念上,引用是被引用实体变量的别名,并没有开辟新的内存空间。

在这里插入图片描述

底层实现上,实际开了空间。引用是按照指针的方式实现的。

在这里插入图片描述

二、内联函数

2.1 概念

内联函数是用关键词 inline 修饰的函数,可以代替宏函数(宏函数缺点:1. 语法细节多,易出错;2. 不可调试;3. 没有类型安全检查)。

编译时,C++编译器会在把内联函数在调用位置展开,没有建立函数栈帧的开销,在一定程度上提高程序运行效率。

(在debug模式下,编译器默认不会对代码进行优化,需要通过设置以观察到内联函数)

  1. 右击项目,进入 属性

在这里插入图片描述


在这里插入图片描述

2.2 特性
  1. inline 是一种以空间换时间的做法,在编译阶段,会用函数体替换函数调用。
  2. inline 对编译器来说只是一个“请求”,编译器可以选择忽略。一般建议:将函数规模较小不是递归频繁调用的函数用 inline 修饰,否则编译器会忽略 inline 特性。
  3. inline 不能声明和定义分离,分离会导致链接错误——inline 被展开就没有函数地址了。
// Func.h
#include <iostream>
using namespace std;inline void f(int x);// Func.cpp
#include "Func.h"void f(int x)
{cout << "f(x)" << endl;
}// test.cpp
#include "Func.h"int main()
{f(10);return 0;
}// error:
// 链接错误:Test.obj : error LNK2019: 无法解析的外部符号 "void __cdecl f(int)" (?f@@YAXH@Z),函数 _main 中引用了该符号

正确做法:

// Func.h
#include <iostream>
using namespace std;inline void f(int x)
{cout << "f(x)" << endl;
}

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

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

相关文章

MySQL实践——分页查询优化

问题现象 一个客户业务系统带有分页查询功能&#xff0c;但是随着查询页数的增加&#xff0c;越往后查询性能越差&#xff0c;有时一个查询可能需要1分钟左右的时间。分页查询的写法类似于&#xff1a; select * from employees limit 250000,5000;这是最传统的一种分页查询写…

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

GB28181学习(十一)——控制(PTZ、镜头、光圈等控制)

要求 源设备向目标设备发送控制命令&#xff0c;控制命令类型包括&#xff1a; 摄像机云台控制远程启动录像控制报警布防/撤防报警复位强制关键帧拉框放大/缩小看守位控制PTZ精准控制存储卡格式化目标跟踪软件升级设备配置 设备配置的内容包括&#xff1a; 基本参数视频参数范…

React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的

npm install types/包名称 例如&#xff1a;npm install types/jquery 学习链接

QSPI介绍

0 Preface/Foreword 1 QSPI介绍

Win10下基于VS2015编译SQLite3源码

一、下载SQLite SQLite SQLite Download Page 下载红框部分的3个文件 提示&#xff1a;这里有个 sglite-autoconf-3420000.tar.gz 是免编译版&#xff0c;想省事就下载这个&#xff0c;但我自己用这个老是编译不过 所以我这里不推荐这个了 二、配置SQLite 打开vs 2015或者其他…

Android Kotlin 协程初探 | 京东物流技术团队

1 它是什么&#xff08;协程 和 Kotlin协程&#xff09; 1.1 协程是什么 维基百科&#xff1a;协程&#xff0c;英文Coroutine [kəru’tin] &#xff08;可入厅&#xff09;&#xff0c;是计算机程序的一类组件&#xff0c;推广了协作式多任务的子程序&#xff0c;允许执行被…

SqueezeNet 一维,二维网络复现 pytorch 小白易懂版

SqueezeNet 时隔一年我又开始复现神经网络的经典模型&#xff0c;这次主要复的是轻量级网络全家桶&#xff0c;轻量级神经网络旨在使用更小的参数量&#xff0c;无限的接近大模型的准确率&#xff0c;降低处理时间和运算量&#xff0c;这次要复现的是轻量级网络的非常经典的一…

muduo源码学习base——Atomic(原子操作与原子整数)

Atomic(原子操作与原子整数&#xff09; 前置知识AtomicIntegerTget()getAndAdd()getAndSet() 关于原子操作实现无锁队列(lock-free-queue) 前置知识 happens-before&#xff1a; 用来描述两个操作的内存可见性 如果操作 X happens-before 操作 Y&#xff0c;那么 X 的结果对于…

有奖招募——2023年度清华社“荐书官”活动今日开始了!

又到“1024程序员节”了&#xff0c;维护网络世界稳定和平的程序员大大们&#xff0c;辛苦了&#xff01;生活难免有bug&#xff0c;来给彼此个hug~ 过完1024&#xff0c;这一年也快要结束了&#xff0c;岁末回顾又要提上日程。很多人都有整理年度书单的习惯&#xff0c;那么这…

架构风格区别-架构案例(五十九)

管道-过滤器和仓库的区别&#xff1f; 独立的数据仓库&#xff0c;处理流独立&#xff0c;处理数据用连接仓库工具数据与处理在一起&#xff0c;改动的话需要重启系统需要仓库工具与仓库连接&#xff0c;数据与处理分离&#xff0c;性能差可以支持并发连接访问仓库&#xff0c…

【经验分享】如何构建openGauss开发编译提交一体化环境

前文 本文适合对openGauss源代码有好奇心的爱好者&#xff0c;那么一个友好的openGauss源代码环境应该是怎么样的。openGauss的开发环境是如何设置的&#xff1f;openGauss的编译环境是如何构建的&#xff1f;如何向openGauss提交代码&#xff0c;笔者集合官方和几位博主实践提…

2023年【危险化学品生产单位主要负责人】考试报名及危险化学品生产单位主要负责人模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位主要负责人考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位主要负责人模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产单位主要负…

用nodejs爬虫台湾痞客邦相册

情景:是这样的,我想保存一些喜欢的小伙伴的照片,一张张保存太慢了, 所以我写了个js,放在国外服务器爬,国内的自己解决~ 使用方法 1.点相册随便一张, 复制url, 这张开始接下来的图片都会保存 /*** 2023年10月23日 22:58:44* 支持解析痞客邦相册* 只需要复制相册第一张图片的ur…

新款模块上线实现SIP模块与扩拨电话之间打点与喊话功能 IP矿用电话模块SV-2800VP

新款模块上线实现SIP模块与扩拨电话之间打点与喊话功能 IP矿用电话模块SV-2800VP 一、简介 SV-2800VP系列模块是我司设计研发的一款用于井下的矿用IP音频传输模块&#xff0c;可用此模块打造一套低延迟、高效率、高灵活和多扩展的IP矿用广播对讲系统&#xff0c;亦可对传统煤…

Linux 下安装配置部署MySql8.0

一 . 准备工作 MySQL安装包&#xff1a;在官网下载需要的版本&#xff0c;这里我用的版本是 MySQL 8.0.34 https://dev.mysql.com/downloads/mysql/ 本次linux机器使用的是阿里云ECS实例 二 . 开始部署 1. 将安装包上传至服务器 解压到当前文件夹 tar -zxvf mysql-8.0.34…

SAP HANA Time Zone设置

通常对于MINICHECK中检查出来的Timezone时区设置问题&#xff0c;可以通过以下方式进行修改 对于ABAP系统 修改HANA 参数即可 • indexserver.ini -> [global] -> timezone_default_data_client_name 000 • indexserver.ini -> [global] -> timezone_default_da…

蓝桥杯每日一题2023.10.21

后缀表达式 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 30分解法&#xff1a;要求出最大的结果就需要加的数越大&#xff0c;减的数越小&#xff0c;以此为思路简单列举即可 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10…

微信小程序设计之主体文件app-json-pages

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…

【2021集创赛】Digilent杯二等奖:基于FPGA的动态视觉感知融合的运动目标检测系统

杯赛题目&#xff1a;Diligent杯&#xff1a;基于FPGA开源软核的硬件加速智能平台 参赛组别&#xff1a;A组 设计任务&#xff1a; 利用业界主流软核处理器(仅限于Cortex-M系列及 RISC-V系列)在限定的DIGILENT官方FPGA平台上构建SoC片上系统&#xff0c;在 SoC中添加面向智能应…