【C++专栏】C++入门 | 函数重载、引用、内联函数


  • 博客主页:Duck Bro 博客主页
  • 系列专栏:C++专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

C++入门 | 函数重载、引用、内联函数

文章编号:C++入门 / 02

文章目录

  • C++入门 | 函数重载、引用、内联函数
    • 一、函数重载
      • 1. 函数重载概念
      • 2. 函数重载的使用
    • 二、引用
      • 1. 引用概念
      • 2. 引用特性
      • 3. 常引用
      • 4. 引用的使用场景
        • 4.1 参数
        • 4.2 返回值
      • 5. 传值&传引用效率对比
      • 6. 引用&指针区别
    • 三、内联函数
      • 1. 内联函数概念
      • 2. 内联函数特性
      • 3. 内联函数的使用


一、函数重载

结论:函数名相同 参数不同(类型相同、个数相同、顺序不同)返回值可同可不同。

1. 函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数/类型/类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

2. 函数重载的使用

#include<iostream>
using namespace std;
//1.参数类型不同
int Add(int a, int b)
{cout << "int Add(int a, int b)" << endl;return a + b;
}
double Add(double a, double b)
{cout << "double Add(int a, int b)" << endl;return a + b;
}
//2.参数个数不同
void func()
{cout << "func()" << endl;}
void func(int a)
{cout << "func(int a)" << endl;
}
//3.参数类型顺序不同
void func(int a, char b)
{cout << "f(int a, char b)" << endl;
}
void func(char a, int b)
{cout << "f(char a, int b)" << endl;
}
int main()
{Add(3,4);Add(3.5, 3.7);func();func(10);func(20, 'a');func('a', 20);return 0;
}

二、引用

结论:引用就是给已经存在的变量取别名,不是重新定义一个变量。

1. 引用概念

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

void Test1()
{int a = 10;int& b = a;// 定义引用类型printf("a的地址:%p\n", &a);printf("b的地址:%p\n", &b);}int main()
{Test1();return 0;
}

输出结果:
在这里插入图片描述

2. 引用特性

结论:引用必须初始化。不可以直接定义int& s;

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
void Test2()
{int s = 10;//int& s;  编译出错int& rs = s;int& rrs = s;printf("s的地址:%p\nrs的地址:%p\nrrs的地址:%p\n", &s, &rs, &rrs);
}

3. 常引用

结论:const可以使变量变为常量

在C++中,const是用于指定一个变量为常量(constant)的关键字。使用const关键字声明的变量不能被修改。它可以用于声明常量值、函数参数、函数返回值和成员函数。

void Test3()
{const int a = 10;//int& ra = a; //编译时出错,a是常量const int& ra = a;//int& b = 10; //编译时出错,b是常量const int& rb = 10;double d = 10.15;//int& rd = d;//编译时出错,类型(double)不同const double& rd = d;}

4. 引用的使用场景

4.1 参数

引用做参数传值

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(int*left, int* right)
{int temp = *left;*left = *right;*right = temp;
}
int main()
{int a = 2;int b = 3;//引用传值交换Swap(a, b);cout << a << " " << b << endl;//指针传值交换Swap(&a, &b);cout << a << " " << b << endl;return 0;
}
4.2 返回值

使用引用做返回值

int& Count()
{static int n = 0;n++;// ...return n;
}
int main()
{int ret=Count();cout << ret << endl;return 0;
}

5. 传值&传引用效率对比

结论:传引用比传值效率高

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

测验代码:

#include<iostream>
#include <time.h>
using namespace std;
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc1(a);size_t end1 = clock();// 以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc2(a);size_t end2 = clock();// 分别计算两个函数运行结束后的时间cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{TestRefAndValue();return 0;
}

输出结果:
在这里插入图片描述

6. 引用&指针区别

结论:从语法概念上引用只是取别名,没有独立的空间,但从底层实现上是有空间产生的,因为引用是按照指针方式来实现的。

#include<iostream>
using namespace std;
int main()
{int a = 10;int& ra = a;ra = 20;int* pa = &a;*pa = 20;return 0;
}

引用和指针的汇编代码对比:

在这里插入图片描述

引用和指针的不同点:

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

三、内联函数

结论:内联函数是一种用于提高函数调用效率的优化手段,适用于函数体简单且执行时间短的函数。但是在使用时需要根据具体情况进行权衡和选择。

1. 内联函数概念

C++内联函数是一种特殊的函数,它在编译时会被直接插入到调用它的地方,而不是通过跳转到函数的地址来进行调用。内联函数的主要目的是提高函数调用的效率,避免因函数调用带来的额外开销,例如压栈、跳转等操作。

使用内联函数可以有效地减少函数调用的开销,因为内联函数的代码会直接插入到调用它的地方,而不需要通过函数调用来执行。这就意味着在执行过程中不需要额外地保存和恢复函数的上下文信息,也不需要进行函数调用和返回的跳转。

要定义一个内联函数,需要在函数定义前加上关键字inline。内联函数的定义通常写在头文件中,以便在多个cpp文件中进行共享。

2. 内联函数特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
    用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
    行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
    议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不
    是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
    了,链接就会找不到。

3. 内联函数的使用

#include<iostream>
using namespace std;
//内联函数
inline int Add1(int a,int b)
{return a + b;
}int main()
{int ret = Add1(3, 5);cout << ret << endl;return 0;
}

在这里插入图片描述

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

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

相关文章

sizeof辨析——二维数组(超级详细)

二维数组加sizeof的知识如果基础不扎实&#xff0c;上面的代码恐怕很难区分&#xff0c;这篇文章就深度解析一下有关问题 我们在分析之前&#xff0c;要提及一些基础的前提知识 前提知识&#xff1a; 一&#xff1a; &数组名 和 sizeof&#xff08;数组名&#xff09;这…

【算法沉淀】最长回文子串

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

每日OJ题_路径dp①_力扣62. 不同路径

目录 力扣62. 不同路径 解析代码 力扣62. 不同路径 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标…

视频可回溯系统技术方案vue3+ts+tegg+mysql+redis+oss

一、 项目背景 保险、基金、银行等众多行业在做技术平台时都会需要一种能够准确了解用户操作行为的方式方法。诸如通过埋点、平台监控、视频可回溯等&#xff0c;通过技术手段&#xff0c;保存用户操作轨迹&#xff0c;以此规范安全销售、平台健康检查、出现纠纷时可追溯、问题…

chrome插件开发的几种展现页面形式,3分钟看完

想要开发一个chrome浏览器插件&#xff0c;还是很有必要清楚插件都可以在哪些地方显示出来的&#xff0c;比如只想在pop页面弹出&#xff0c;还是添加右键菜单&#xff0c;还是提示桌面通知&#xff1f;还是在哪里展示&#xff1f;有哪些展示方式等 browserAction(浏览器右上角…

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频!

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频&#xff01; Corel Video Studio 2024免费下载Keygen 你厌倦了在视频编辑软件上花大钱吗&#xff1f;别再看了&#xff01;我们为您提供了完美的解决方案——Corel Video Studio 2024。最棒的部分是什么&#xff1f;…

分享MDN前端结构化技能、实践指南、学习资源

前言 MDN课程为成为一名成功的前端开发人员提供了一个结构化的基本技能和实践指南&#xff0c;以及推荐的学习资源。 先看下让人不得不服的书《宝宝的网页设计》&#xff08;套装共3册&#xff09; 宝宝的HTML、宝宝的CSS、宝宝的JavaScript 全球首套中英文宝宝编程启蒙书&a…

计算机网络 八股

计算机网络体系结构 OSI&#xff1a;物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Gauge)

数据量规图表组件&#xff0c;用于将数据展示为环形图表。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 说明&#xff1a; 建议使用文本组件构建当前数值文本和辅…

【xv6操作系统】xv6 启动过程分析

一、调试用到的汇编代码 为了方便&#xff0c; Makefile 会创建.asm 文件&#xff0c;可以通过它来定位究竟是哪个指令导致了 bug。 可以看到&#xff0c; kernel 从 80000000 地址处开始执行&#xff0c;第二列为相应指令&#xff08;如 auipc&#xff09; 的 16 进制表示&a…

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面&#xff0c;宽和高分别是&#xff1a;m_nDataWidth m_nDataHeight 给定缩放比例&#xff1a;fXZoom fYZoom&#xff0c;返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即&#xff1a; 根据比…

猫头虎分享已解决Bug || 系统监控故障:MonitoringServiceDown, MetricsCollectionError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中

1、第一步可以直接在pycharm项目中创建jupyter notebook文件 2、假若想要切换成pytorch环境做实验例子&#xff0c;会发现报这个错误 Jupyter server process exited with code 1 C:\Users\12430\.conda\envs\pytorch3.11\python.exe: No module named jupyter在这里&#xff…

Python快速入门系列-2(Python的安装与环境设置)

第二章&#xff1a;Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境&#xff08;IDE&#xff09;的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

jvm堆概述

《java虚拟机规范》中对java堆的描述是&#xff1a;所有的对象实例以及数组都应当在运行时分配在堆上。 一个JVM实例只存在一个堆内存(就是new 出来一个对象)&#xff0c;java内存管理的核心区域 java堆区在jvm启动的时候就被创建&#xff0c;空间大小确定。是jvm管理的最大一…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析&#xff1a; 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p&#xff0c;统计其中各字符的出现次数&#xff0c;存储在pnum数组中。初始化snum数组&#xff0c;统计s的前m-1个字符的出现次数。从第m个字符开始遍历s&#xff0c;通过滑动窗…

STM32_3-1点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平&#xff0c;用以驱动Led蜂鸣器等外设&#xff0c;以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压&#xff0c;用于读取按键输入&#xff0c;外接模块电平信号输入&#xff0c;ADC电压采集灯 GP…

C# WinForm AndtUI第三方库 Table控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Table控件至窗体。 使用方法集合 1.单元格点击事件 获取被点击记录特定列内容 private void dgv_CellClick(object sender, MouseEventArgs args, object record, int rowIndex, int columnIn…

一篇搞懂什么是LRU缓存|一篇搞懂LRU缓存的实现|LRUCache详解和实现

LRUCache 文章目录 LRUCache前言项目代码仓库什么时候会用到缓存(Cache)缓存满了&#xff0c;怎么办&#xff1f;什么是LRUCacheLRUCache的实现LRUCache对应的OJ题实现LRUCache对应的STL风格实现 前言 这里分享我的一些博客专栏&#xff0c;都是干货满满的。 手撕数据结构专栏…

解决ts报错:类型“entry”上不存在属性“$AppTools”

uniapp ts 项目&#xff0c;已经将AppTools挂在了vue的原型上&#xff0c;但是在vue页面使用时报错&#xff0c;如图&#xff1a; 解决&#xff1a; 在项目根目录下的tsconfig.json文件添加如下配置&#xff1a; "include": ["src/**/*"],这样报错就消失…