C/C++ - 函数进阶(C++)

目录

默认参数

函数重载

内联函数

函数模板

递归函数

回调函数


默认参数

  • 定义

    • 默认参数是在函数声明或定义中指定的具有默认值的函数参数。
    • 默认参数允许在调用函数时可以省略对应的参数,使用默认值进行替代。
  • 使用

    • 默认参数可以用于全局函数和成员函数。
    • 默认参数的定义通常放在函数声明中,但也可以在函数定义中进行。
    • 默认参数只能在参数列表的末尾进行定义,即后续参数必须都有默认值。
  • 解析

    • 当调用带有默认参数的函数时,如果省略了对应的参数,编译器会使用默认值进行替代。
    • 如果调用函数时提供了实际参数,则实际参数将覆盖默认参数的值。
    • 默认参数的值在编译时确定,对于每个函数调用都是固定的。
  • 特性

    • 默认参数的定义只能在函数声明或定义中进行一次。
    • 默认参数通常在函数的原型或头文件中进行定义,以便在多个文件中共享。
    • 默认参数的值可以是常量、全局变量、静态变量或其他常量表达式。
  • 示例

    #include <iostream>
    #include <Windows.h>int Fun1(int a, int b = 10/*默认参数*/)
    {return a + b;
    }//默认参数只能在参数列表的末尾进行定义
    //int Fun2(int a, int b = 1, int c)
    //{
    //	return a + b + c;
    //}int Fun2(int a, int b = 1, int c = 2)
    {return a + b + c;
    }bool ExitProcess(int nPid = 0)
    {//TODO//结束进程//参数PID == 0 则结束自身 否则结束指定进程if (nPid == 0){std::cout << "结束自身进程" << std::endl;return 1;}std::cout << "结束指定进程" << std::endl;
    }int main()
    {std::cout << Fun1(1) << std::endl;std::cout << Fun2(1) << std::endl;std::cout << Fun2(1 , 2) << std::endl;std::cout << Fun2(1 , 2 , 3) << std::endl;ExitProcess();ExitProcess(123);return 0;
    }
    

函数重载

  • 定义

    • 函数重载是指在同一作用域内,根据函数的参数类型、参数个数或参数顺序,定义多个具有相同名称但不同特征的函数。
    • 通过函数重载,可以使用相同的函数名来表示具有不同行为和功能的函数。
  • 使用

    • 函数重载允许使用相同的函数名,但函数特征必须不同,包括参数类型、参数个数或参数顺序。
    • 函数重载可以应用于全局函数和成员函数。
  • 解析

    • 在调用重载函数时,编译器会根据函数调用的参数类型、参数个数或参数顺序,选择最匹配的函数进行调用。
    • 编译器会进行函数匹配,优先选择完全匹配的重载函数。如果没有完全匹配的函数,编译器会尝试进行隐式类型转换,选择最匹配的函数。
    • 如果有多个重载函数都能匹配调用,编译器会产生二义性错误。
  • 特性

    • 仅根据函数的返回类型不可以进行函数重载。
    • 函数重载不能仅通过函数的 const 修饰符进行区分。
    • 函数重载不能仅通过函数的参数名进行区分,参数名对于函数重载没有影响。
    • 函数重载中的默认参数可以用于区分不同的函数。
  • 示例

    #include <iostream>//全局作用域
    int Add(int a, int b) //整数类型
    {return a + b;
    }float Add(float f1, float f2) //小数类型
    {return f1 + f2;
    }//无法仅通过返回值类型完成重载
    //int Fun()
    //{
    //
    //}
    //
    //float Fun()
    //{
    //
    //}//函数重载不能仅通过函数的 const 修饰符进行区分
    //int Fun(int a)
    //{
    //
    //}
    //
    //int Fun(const int a)
    //{
    //
    //}//函数重载不能仅通过函数的参数名进行区分,参数名对于函数重载没有影响
    //int Fun(int a)
    //{
    //
    //}
    //
    //int Fun(int b)
    //{
    //
    //}int main()
    {//函数重载//个数不同//类型不同//数量不同Add(1.0f, 2.0f);Add(1, 1);return 0;
    }
    

内联函数

  • 定义

    • 内联函数是在函数声明或定义中使用 inline​​ 关键字标记的函数。
    • 内联函数的主要目的是减少函数调用的开销,将函数的代码插入到函数调用的地方。
  • 使用

    • 内联函数适用于较短的函数代码,通常在头文件中定义。
    • 内联函数可以用于全局函数和成员函数。
  • 解析

    • 当调用内联函数时,编译器会将函数的代码直接插入到函数调用的地方,而不是生成函数调用的指令。
    • 内联函数的展开是在编译时完成的,而不是在运行时。
    • 内联函数的展开可能导致代码膨胀,因此适用于较短的函数代码。
  • 特性

    • 内联函数的定义通常放在头文件中,以便在多个文件中共享。
    • 内联函数只是对编译器的建议,编译器可以选择忽略内联函数的建议,特别是对于较大的函数或复杂的函数。
    • 内联函数不能递归调用自身。
    • 内联函数不能包含复杂的控制流结构,如循环和递归。
  • 示例

    #include <iostream>//宏函数
    #define ADD(X,Y) ((X) + (Y))//普通函数
    int Add1(int a, int b)
    {return a + b;
    }//内联函数
    inline int Add2(int a, int b)
    {return a + b;
    }int main()
    {//mov         dword ptr [a],3int a = ADD(1, 2);//push        2//push        1//call        Add1(0401276h)//add         esp, 8//mov         dword ptr[b], eaxint b = Add1(1, 2);//mov         eax, 1//add         eax, 2//mov         dword ptr[c], eaxint c = Add2(1, 2);return 0;
    }
    

函数模板

  • 定义

    • 函数模板是一种通用函数的定义,可以用于处理多种类型的参数。
    • 函数模板通过在函数声明或定义中使用占位符类型参数来表示参数类型。
  • 使用

    • 函数模板可以用于全局函数和成员函数。
    • 函数模板的定义通常放在头文件中,以便在多个文件中共享。
  • 解析

    • 函数模板可以进行特化,以处理特定类型的参数或特定情况。
    • 显式特化(Explicit Specialization)是指为特定的类型提供具体的函数实现。
    • 隐式特化(Implicit Specialization)是指编译器根据参数类型自动选择最匹配的函数实现。
  • 特性

    • 当调用函数模板时,编译器根据参数类型推断出函数模板的实际类型,并生成对应的函数实例。
    • 函数模板的实例化是在编译时完成的。
    • 函数模板可以根据需要进行多次实例化,以适应不同的参数类型。
    • 函数模板的定义通常放在头文件中,以便在多个文件中共享。
    • 函数模板的定义通常包含在类定义或命名空间中。
    • 函数模板可以有多个类型参数,以适应多个参数类型的情况。
  • 示例

    #include <iostream>template <typename CC>
    CC Compare(CC a, CC b)
    {return a > b ? a : b;
    }template <>
    const char* Compare<const char*>(const char* str1, const char* str2)
    {return strlen(str1) > strlen(str2) ? str1 : str2;
    }int main()
    {std::cout << Compare(1, 2) << std::endl;std::cout << Compare(3, 2) << std::endl;std::cout << Compare(3.15f, 2.5f) << std::endl;std::cout << Compare("CCCCCCCC", "Heeloooooooo") << std::endl;return 0;
    }
    

递归函数

  • 定义

    • 递归函数是在函数的定义中调用自身的函数。
    • 递归函数通常用于解决可以通过将问题分解为更小的子问题来解决的问题。
  • 使用

    • 递归函数可以用于全局函数和成员函数。
    • 递归函数的定义通常放在函数声明的后面。
  • 终止

    • 递归函数必须具有基本情况,也称为终止条件(Termination Condition)。
    • 终止条件定义了递归函数何时结束递归调用。
  • 递归

    • 递归函数在其定义中调用自身,通常使用不同的参数值。
    • 递归调用会将问题分解为更小的子问题,并逐步解决这些子问题。
  • 特性

    • 递归函数必须具有正确的终止条件,以避免无限递归。
    • 递归函数的性能可能较低,因为每次递归调用都需要保存函数的状态。
    • 递归函数的栈帧可能会占用大量的内存空间,特别是在递归层数较深时。
  • 示例

    #include <iostream>int Sum(int n) 
    {if (n == 0)return 0;return n + Sum(n - 1);
    }int main()
    {int sum = 0;for (int i = 0; i <= 10; i++){sum += i;}Sum(10);return 0;
    }
    

回调函数

  • 函数指针

    • 函数指针是指向函数的指针变量。
    • 函数指针可以用于回调函数,即在程序执行期间将函数作为参数传递给其他函数,并在需要时调用该函数。
  • 函数回调

    • 函数回调可以通过将函数指针、函数对象或Lambda表达式作为参数传递给其他函数来实现。
    • 回调函数可以在需要时被调用,可以传递参数并返回结果。
  • 示例

    #include <iostream>// 示例1: 函数指针的函数回调
    void PrintMessage(const char* message) 
    {std::cout << "Message: " << message << std::endl;
    }void PerformCallback(void (*callback)(const char*)) 
    {callback("Hello, world!");
    }// 示例2: 函数对象的函数回调
    struct Callback 
    {void operator()(const char* message) 
    {std::cout << "Message: " << message << std::endl;}
    };void PerformCallback(const Callback& callback) 
    {callback("Hello, world!");
    }// 示例3: Lambda表达式的函数回调
    void PerformCallback(const std::function<void(const char*)>& callback) 
    {callback("Hello, world!");
    }int main() {// 示例1: 函数指针的函数回调PerformCallback(PrintMessage);// 示例2: 函数对象的函数回调Callback callbackObj;PerformCallback(callbackObj);// 示例3: Lambda表达式的函数回调PerformCallback([](const char* message) {std::cout << "Message: " << message << std::endl;});return 0;
    }
    

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

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

相关文章

C语言KR圣经笔记 5.12 复杂声明

5.12 复杂声明 C 语言有时会因为声明的语法而受到谴责&#xff0c;特别是涉及函数指针的声明语法。语法试图使声明和使用一致&#xff1b;在简单的情况下它的效果不错&#xff0c;但在更复杂的情况下会让人困惑&#xff0c;因为声明不能从左往右读&#xff0c;而且括号被过度使…

Linux文本三剑客---sed经典案例

Sed介绍&#xff1a; sed是一种流编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff0c;接着用sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕。接着处理…

Mybatis-plus原生pages分页未生效的解决方案

文章目录 前言原因1、Mybatis Plus版本的问题2、Mapper.xml文件中SQL语句格式问题3、Mybatis Plus默认分页拦截器问题4、分页参数传参问题5、分页配置的问题 解决方案1、升级对应的Mybatis-plus版本分页插件配置问题3、自定义分页拦截器4、正确的参数5、不同版本的配置文件3.4.…

Hugging Face创始人分享:企业如何在ChatGPT浪潮下实现战略布局

Hugging Face创始人兼首席执行官 Clem Delangue在IBM一年一度的 THINK大会中研讨了当前人工智能发展趋势&#xff0c;特别是ChatGPT模型以及其对行业的影响。他的演讲还涉及到一个关键的议题&#xff0c;在ChatGPT这样的通用模型出现后&#xff0c;企业如何在人工智能领域找到自…

QR 分解cpu程序

1. 代码 Makefile EXE : hello_qrSRC_QR qr_main.c qr_func.c $(EXE): $(SRC_QR)gcc $^ -o $ -lm.PHONY: clean clean:-rm -rf $(EXE) qr_main.c #include "stdio.h"int maqr(double* a,int m,int n,double* q);int main() {int i,j;static double q[4][4],a[4]…

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求。 Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索 Similar…

window下如何安装ffmpeg(跨平台多媒体处理工具)

ffmpeg是什么? FFmpeg是一个开源的跨平台多媒体处理工具&#xff0c;可以用于录制、转换和流媒体处理音视频。它包含了几个核心库和工具&#xff0c;可以在命令行下执行各种音视频处理操作&#xff0c;如剪辑、分割、合并、媒体格式转换、编解码、流媒体传输等。FFmpeg支持多…

C++类和对象引入以及类的介绍使用

文章目录 一、面向过程和面向对象的初步认识二、类的引入2.2 类的引入 三、类的访问限定符及封装3.3 访问限定符3.4 【面试题】C中struct和class的区别3.5 类的两种定义方式 四、封装【面试题】面向对象的三大特性 五、类的作用域六、类的实例化七、类对象模型7.1 类对象的存储…

postman之接口参数签名(js接口HMAC-SHA256签名)

文章目录 postman之接口参数签名&#xff08;js接口签名&#xff09;一、需求背景二、签名生成规则三、postman js接口签名步骤1. postman设置全局、或环境参数2. 配置Pre-request Scripts脚本 四、Pre-request Scripts脚本 常见工作整理1. js获取unix时间戳2. body json字符串…

day35WEB 攻防-通用漏洞XSS 跨站反射存储DOMBeef-XSS

目录 一&#xff0c;XSS 跨站-原理&分类&手法&探针 1、原理 2、分类 3、危害 二&#xff0c;反射型XSS 1&#xff0c;案例演示 三&#xff0c;存储型XSS 1&#xff0c;案例演示 四&#xff0c;DOM 型XSS 五&#xff0c;XSS 利用环境-XSS 平台&Beef-XS…

探讨UI自动化测试几步骤

随着软件开发的不断发展&#xff0c;UI自动化测试变得越来越重要&#xff0c;它能够提高测试效率、降低人为错误&#xff0c;并确保软件交付的质量。本文将介绍UI自动化测试的一般步骤和一些最佳实践&#xff0c;以帮助开发团队更好地实施自动化测试。 需求分析和选择测试工具&…

QT+VS实现Kmeans++

1、Kmeans的原理如下&#xff1a; &#xff08;1&#xff09;首先选取样本中任一数据点作为第一个聚类中心&#xff1b; &#xff08;2&#xff09;计算样本每一个数据点至现所有聚类中心的最近距离&#xff0c;并记录下来&#xff1b; &#xff08;3&#xff09;逐一挑选所…

电脑监控软件:提升工作效率与保障信息安全

随着信息技术的飞速发展&#xff0c;电脑已经成为了我们日常生活和工作中不可或缺的工具。然而&#xff0c;随着电脑使用频率的增加&#xff0c;工作效率低下、信息泄露等问题也日益凸显。为了解决这些问题&#xff0c;电脑监控软件应运而生&#xff0c;为我们的工作和生活提供…

基于vue实现待办清单案例

一、需求 新增内容&#xff1b; 删除内容&#xff1b; 统计操作&#xff1b; 清空数据。 示例图&#xff1a; 二、代码演示 1、基础准备 index.css代码 html, body {margin: 0;padding: 0; } body {background: #fff ; } button {margin: 0;padding: 0;border: 0;backgr…

马斯克将为 X 平台设立内容审核中心;Google Bard 冲上 LLM 排行榜第二

马斯克旗下社交媒体平台 X&#xff08;原 Twitter&#xff09;的业务运营主管 Joe Benarroch 表示&#xff0c;将在得州奥斯汀设立一个新的内容审核中心&#xff0c;招募 100 名全职员工。 该中心将重点打击平台上虐待儿童相关内容&#xff0c;并执行平台的仇恨言论限制政策&am…

雪深传感器的工作原理

TH-XL2雪深传感器的工作原理主要是利用超声波的发射和反射来测量雪的厚度。传感器发射超声波&#xff0c;超声波遇到雪表面后会反射回来&#xff0c;传感器再接收反射回来的超声波&#xff0c;通过计算超声波的传播时间和速度&#xff0c;就可以得出雪的厚度。 另外&#xff0c…

幻兽帕鲁服务器价格,这个价格不够电费的

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云换手帕服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G3…

STM32学习笔记(三) —— GPIO点亮LED

1.GPIO简介 GPIO&#xff0c;全称是General-purpose input/output&#xff08;通用输入输出&#xff09;。在单片机中是表示能被控制的引脚&#xff0c;能检测输入信号的高低电平&#xff0c;也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚&#xff0c;其中有51个…

SQL注入-sqli-labs-master第一关

实验环境&#xff1a; Nginx.1.15.11 MySQL&#xff1a;5.7.26 实验步骤&#xff1a; 1.第一步&#xff1a; 在id1后加入一个闭合符号&#xff0c;如果报错&#xff0c;再在后面加上 -- 将后面注释掉&#xff0c;如果不报错&#xff0c;则证明为字符型。 http://127.0.0.1/…

(Sping Xml方式整合第三方框架)学习Spring的第十天

Spring整合mybatis 1 . 导入Mybatis整合Spring的相关坐标 <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.13.RELEASE</version></dependency><dependency><…