C++学习日记 | Lecture 7 函数进阶

news2024/11/17 19:51:04

资料来源:南科大 余仕琪 C/C++ Program Design

LINK:

  1. CPP/week07 at main · ShiqiYu/CPP · GitHub
  2. 7.1-default-arguments_哔哩哔哩_bilibili
  3. 7.2-function-overloading_哔哩哔哩_bilibili
  4. 7.3-function-templates_哔哩哔哩_bilibili
  5. 7.4-function-pointers-and-references_哔哩哔哩_bilibili



0 概述

        本节课为函数的进阶课程,主要内容包括:默认参数、函数重载、函数模板、递归、指向函数的指针。

1 Default Arguments 默认参数

        默认参数是C++中才有的概念。需要注意的是:

  • 默认参数设置时只能放在后面不能放在前面
此处能行的原因是z=0在y=9前面

2 Function Overloading 函数重载

        函数重载同样是C++里面有的特性。它可以实现存在多个一样的函数名称

  • C++内部对于函数的查找依赖于函数名称和函数参数列表,二者都相同才认定两个函数是一样的。
  • 因此,相同的函数名称和函数参数列表不能有不同的输出类型,否正会造成混乱(它究竟要输出什么类型?)
  • 函数在使用时要明确让编译器选择什么类型,否正会出现问题,比如声明 int sum(int x, int y)和 float sum(float x, float y),使用却输入 sum(1, 2.2),让编译器两个都可以使用而陷入选择

3 Function Templates 函数模板

        为什么需要函数模板?因为在使用函数重载的过程中存在一部分相同的代码需要写,在管理上不方便。

        通过使用函数模板、定义一个泛形T解决以上问题。

  • 函数模板在定义后编译器编译时并不知道泛形具体是什么类型,并不会编译模板里面的内容。需要进行实例化之后才能让编译器进行编译
  • 在实例化过程中,可以忽略<>
  • 同时,存在隐式实例化,即程序会根据调用进行实例化。

  •  对于想要实现一些特殊运算,比如泛形为结构体,要实现两个结构体之间的加法,这种操作需要进行特例化

 specialization.cpp:

#include <iostream>
#include <typeinfo>
using namespace std;

template<typename T>
T sum(T x, T y)
{
    cout << "The input type is " << typeid(T).name() << endl;
    return x + y;
}

struct Point
{
    int x;
    int y;
};

// Specialization for Point + Point operation
template<>      //注意必须加<>,否则就会变成实例化而不是特例化
                //之前的实例化没有括号:
                // Explicitly instantiate
                // template double sum<double>(double, double);
Point sum<Point>(Point pt1, Point pt2)
{
    cout << "The input type is " << typeid(pt1).name() << endl;
    Point pt;
    pt.x = pt1.x + pt2.x;
    pt.y = pt1.y + pt2.y;
    return pt;
}


int main()
{
    //Explicit instantiated functions
    cout << "sum = " << sum(1, 2) << endl;
    cout << "sum = " << sum(1.1, 2.2) << endl;

    Point pt1 {1, 2};
    Point pt2 {2, 3};
    Point pt = sum(pt1, pt2);
    cout << "pt = (" << pt.x << ", " << pt.y << ")" << endl;
    return 0;
}

Function Pointers and References 函数指针和引用

        函数指针是指向函数的指针,指向的具体内容是指令区的地址。

 

函数指针具有以下作用:

  1. 调用函数:函数指针允许您通过指针调用函数。与C语言类似,您可以定义一个函数指针并将其赋值为已声明函数的地址。然后,您可以使用函数指针来调用函数,而不必直接使用函数名。

  2. 作为函数的参数(更常见):函数指针还可以作为函数的参数。通过规定好的指针类型,您可以在编程中使用变量来代替函数进行运算。这对于简化代码并在一定程度上节约内存非常有用。例如,当您需要返回数组中的元素时,可以返回数组的首元素地址给调用函数,从而让函数返回多个值。此外,您还可以使用指针函数来动态分配内存并返回该内存的地址,以便其他函数可以操作它。

        同样的,函数也有引用。引用需要在定义时就明确对象。

 

Recursive Functions 递归函数

        递归函数是指一个函数在其定义中又调用自身的过程。这种调用自身的行为称为递归。

 递归函数通常由以下两个部分组成:

  1. 基本情况(Base Case):这是递归的终止条件。如果没有基本情况,递归函数将无限地调用自己,导致栈溢出。基本情况是一个判断,当满足某个条件时,递归不再继续,而直接返回结果。

  2. 递归情况(Recursive Case):在递归情况中,函数将问题分解成更小的子问题,并自我调用来解决这些子问题。每一层递归都依赖于其下一层的结果,直到达到基本情况,然后逐层返回计算结果。

递归函数的优缺点:

优点:

  • 适合于树形遍历
  • 代码长度小

缺点:

  • 消耗相对更多的栈内存
  • 运行速度可能变得更慢
  • 实现和debug变得更为困难

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

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

相关文章

【课程总结】Day7:深度学习概述

前言 本篇文章&#xff0c;我们将通过示例来逐步学习理解导数、求函数最小值、深度学习的本质、以及使用numpy和pytorch实操深度学习训练过程。 线性回归 线性回归内容回顾 在《【课程总结】Day5(下)&#xff1a;PCA降维、SVD分解、聚类算法和集成学习》中&#xff0c;我们…

Diffusers代码学习-ControlNet(Inpaint)

对于Inpaint&#xff0c;需要一个初始图像、一个蒙版图像和一个描述用什么替换蒙版的提示词。ControlNet模型允许添加另一个控制图片来调节模型。让我们用Inpaint蒙版来调整模型。这样&#xff0c;ControlNet可以使用修复掩模作为控件来引导模型在蒙版区域内生成图像。 # 以下代…

【Unity | Editor强化工具】资产快速访问工具

经常在Project窗口中翻找资产相对麻烦&#xff0c;Unity自带的Favorite功能又和Project窗口强绑定&#xff0c;且只能在双列视图下使用&#xff0c;故制作了一个可以在独立窗口中列举常用资产的小工具&#xff1a; Unity Asset Quick Access 。 CSDN弄了个Github加速计划&…

基于深度图像的无监督目标跟踪

概要 大致的步骤 深度图像获取:通过深度传感器(例如ToF相机、双目相机等)获取场景的深度图像。深度图转scanscan转pointcloud点云聚类卡尔曼滤波预测匈牙利算法匹配目标ID更新深度图转scan 参考这篇博客 scan转pointcloud

小迪安全代码语言回溯

java安全 第一个就是文件上传&#xff0c;可以通过../上传到上一级目录&#xff0c;以及别的目录&#xff0c;避免本目录不可以执行 jw令牌窃取 令牌由三部分组成&#xff0c;以.号分割&#xff0c;在java的程序看到cookie是三个奇怪的字符串以.号分开&#xff0c;可以确定是…

snmp-check一键获取SNMP信息(KALI工具系列二十一)

目录 1、KALI LINUX 简介 2、snmp-check工具简介 3、在KALI中使用onesixtyone 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 SNMP 检查 4.2 指定 SNMP 端口 4.3 指定社区字符串 4.4 详细输出 4.5 指定多项 5、总结 1、KALI LINUX 简介…

6.11 作业

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

EGST:Explicit Geometric Structure Transformer论文解读

目录 一、导言 二、相关工作 1、3D局部描述子 2、点云配准方法 三、EGST模型 1、结构化特征 2、特征提取 3、点云匹配 4、变换估计 5、损失函数 四、实验 1、数据集 2、评估指标 3、细节 4、对比实验 一、导言 该论文提出一种基于增强几何结构特征的点云配准方…

【华为 ICT HCIA eNSP 习题汇总】——题目集21

1、OSPF协议中的hello报文不包括以下哪个字段&#xff1f; A、Priority&#xff08;优先级&#xff09; B、Neighbor&#xff08;邻居表&#xff09; C、Interval&#xff08;时间间隔&#xff09; D、Checksum&#xff08;校验和&#xff09; 考点&#xff1a;路由技术原理 解…

三十而已,逐梦AI新赛道,解锁职业第二春

前言 哎&#xff0c;你说这年头&#xff0c;一晃眼就三十了&#xff0c;是不是觉得找工作就像在走钢丝&#xff0c;小心翼翼还生怕踩空&#xff1f;特别是想换个跑道&#xff0c;跑到AI那边去&#xff0c;心里头那个忐忑啊&#xff0c;感觉比相亲还紧张。总担心老板们会不会嫌…

Linux-笔记 设备树插件

前言&#xff1a; 设备树插件&#xff08;Device Tree Blob Overlay&#xff0c;简称 DTBO&#xff09;是Linux内核和嵌入式系统中用于动态修改或扩展系统运行时的设备树配置的一种机制。它是对传统设备&#xff08;Device Tree Source&#xff0c;简称 DTS&#xff09;的补充&…

shiro反序列化分析

shiro反序列化分析 基础知识简单介绍关键组件SecurityManagerSubjectRealm总结 shiro安全框架在web中使用配置文件配置具体实现ShiroFilter过滤器分析 shiro的漏洞shiro550链子分析序列化加密cookie反序列化解密cookie验证总结 poc编写存在的问题和解决CC6TemplatesImlCC6insta…

AI写作助手:五款超实用工具让创作更轻松

写作这件事一直让我们从小学生头痛到打工人&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;苦战几个…

Day48 代码随想录打卡|二叉树篇---合并二叉树

题目&#xff08;leecode T617&#xff09;&#xff1a; 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新…

C++ 不定参数模版

使用不定参数模版遇到一个小问题&#xff0c;做个记录 测试代码如下&#xff1a; template<typename T, typename ...Args> void pushToVectorIfParamIsStr(std::vector<std::string>& vec, T &&value,Args&&... args) {const bool is std:…

linux-计划任务

作用&#xff1a;定时自动完成特定的工作 计划任务的分类 一次性的计划任务&#xff1a;例如下周三对文档的重要文件备份一次 周期性的计划任务&#xff1a;每天12:00创建一个文件 命令 一次性的任务计划 at batch 周期性计划任务 crontab anacron 一次性计划任务 …

快手可灵AI开始内测,对标Sora?免费体验!

最近&#xff0c;国内第一个可以和 Sora 相媲美的 AI 视频生成模型&#xff0c;快手的可灵大模型&#xff08;Kling&#xff09;开始免费内测。 在快手旗下的快影App&#xff0c;就可以申请。 别忘记填写表格信息&#xff0c;可以加快你的申请通过&#xff0c;链接我放在这里…

macOS Sequoia 开发者测试版下载和安装教程

macOS Sequoia 于 2024年6月10日在WWDC 2024 上发布&#xff0c;里面添加了AI、窗口排列、操控iPhone等功能&#xff0c;目前发布的为测试版本&#xff0c;可能很多人不知道怎么去下载安装&#xff0c;现在小编教一下大家怎么安装最新的 macOS Sequoia 开发者测试版。 下载 mac…

基于 Transformer 的大语言模型

语言建模作为语言模型&#xff08;LMs&#xff09;的基本功能&#xff0c;涉及对单词序列的建模以及预测后续单词的分布。 近年来&#xff0c;研究人员发现&#xff0c;扩大语言模型的规模不仅增强了它们的语言建模能力&#xff0c;而且还产生了处理传统NLP任务之外更复杂任务…

[总线]AMBA总线架构的发展历程

目录 引言 发展历程 第一代AMBA&#xff08;AMBA 1&#xff09; 第二代AMBA&#xff08;AMBA 2&#xff09; 第三代AMBA&#xff08;AMBA 3&#xff09; 第四代AMBA&#xff08;AMBA 4&#xff09; 第五代AMBA&#xff08;AMBA 5&#xff09; AMBA协议简介 ASB&#x…