C++学习第八课:函数定义使用和它的高级应用

C++学习第八课:函数的高级使用

在C++中,函数是封装一段代码的单元,使得代码更加模块化、重用性高,并且易于维护。本课我们将介绍如何使用函数组织代码,包括函数原型、定义、调用、参数传递、返回值、默认参数值、递归函数、多返回值函数、函数重载、数组传递、引用传递、内联函数和lambda函数。

为什么需要函数

  • 模块化:将大问题分解成小的、可管理的部分。
  • 重用性:避免重复代码,提高代码的可读性。
  • 维护性:便于修改和测试。

函数原型和定义

函数原型指明了函数的返回类型、名称和参数列表。函数定义包含了函数的完整实现。

// 函数原型
int add(int a, int b);// 函数定义
int add(int a, int b) {return a + b;
}

调用函数

使用函数名和一对圆括号来调用函数,实参会被传递给形参。

int result = add(5, 10); // 调用函数并传递实参5和10

返回值

函数可以使用 return 语句返回一个值。

int square(int num) {return num * num;
}

默认值参数

可以为函数参数提供默认值,这样在调用函数时可以省略该参数。

void print(int value, int times = 1) {for (int i = 0; i < times; ++i) {std::cout << value << std::endl;}
}

递归函数

递归函数是调用自身的函数,用于解决如阶乘、斐波那契数列等问题。

int factorial(int n) {if (n <= 1) return 1; // 基础情况return n * factorial(n - 1); // 递归调用
}

多返回值的函数

函数可以通过输出参数(通常是引用参数)来返回多个值。

void getFactors(int num, std::vector<int>& factors) {for (int i = 1; i <= num; ++i) {if (num % i == 0) {factors.push_back(i);}}
}

函数重载

允许定义多个具有相同名称但参数不同的函数。

void print(int num) {std::cout << num << std::endl;
}void print(const std::string& text) {std::cout << text << std::endl;
}

将数组传给函数

通常通过指针或引用传递数组给函数。

void printArray(int arr[], int size) {for (int i = 0; i < size; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;
}

引用传递参数

使用引用参数可以避免复制,提高性能,常用于传递大型对象。

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

内联函数

使用 inline 关键字声明的函数,建议编译器在每次调用时插入该函数的代码,而不是生成函数调用的代码。

inline int max(int a, int b) {return a > b ? a : b;
}

lambda函数

C++11引入的匿名函数,常用于编写简短的、单次使用的函数。

auto add = [](int a, int b) {return a + b;
};

代码实例

下面是一个结合了上述概念的完整示例程序:

#include <iostream>
#include <vector>
#include <algorithm>// 函数原型
void print(const std::string& text);
int add(int a, int b = 10);
int factorial(int n);
void swap(int& a, int& b);
void printArray(int arr[], int size);
auto getLambda();int main() {// 调用函数print("Hello, World!");int result = add(5); // 使用默认参数std::cout << "Factorial: " << factorial(5) << std::endl;int a = 10, b = 20;std::cout << "Before swap: a = " << a << ", b = " << b << std::endl;swap(a, b);std::cout << "After swap: a = " << a << ", b = " << b << std::endl;int array[] = {1, 2, 3, 4, 5};printArray(array, 5);auto addLambda = getLambda();std::cout << "Lambda add: " << addLambda(3, 4) << std::endl;return 0;
}// 函数定义
void print(const std::string& text) {std::cout << text << std::endl;
}int add(int a, int b) {return a + b;
}int factorial(int n) {if (n <= 1) return 1;return n * factorial(n - 1);
}void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}void printArray(int arr[], int size) {for (int i = 0; i < size; ++i) {std::cout << arr[i] << " ";}std::cout << '\n';
}auto getLambda() {return [](int a, int b) {return a + b;};
}

在C++中,函数重载(Function Overloading)和函数重写(Function Overriding)是两个不同的概念,它们都与多态性(Polymorphism)相关,但含义和使用场景有所不同。

函数重载(Function Overloading)

函数重载是指在同一个作用域(通常是同一个类)内,允许存在一个以上的函数名称相同,但它们的参数列表必须不同。参数列表的不同可以是参数的类型不同、参数的数量不同或者参数的顺序不同。

特点

  1. 发生在同一个类中。
  2. 函数名相同,但参数类型、数量或顺序不同。
  3. 编译时多态,也称为静态多态或早期多态。

示例

class Example {
public:void display(int a) {std::cout << "Int: " << a << std::endl;}void display(double a) {std::cout << "Double: " << a << std::endl;}void display(int a, int b) {std::cout << "Two Ints: " << a << " and " << b << std::endl;}
};

在这个例子中,display 是被重载的函数,每个 display 函数的参数列表都不相同。

函数重写(Function Overriding)

函数重写是指在派生类(子类)中提供一个与基类(父类)中具有完全相同的名称和参数列表的函数。这是运行时多态的一个例子,因为函数调用的最终目标是在程序运行时绑定的。

特点

  1. 发生在父子类之间。
  2. 函数名和参数列表完全相同。
  3. 运行时多态,也称为动态多态或晚期多态。

示例

class Base {
public:virtual void show() {std::cout << "Base show" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived show" << std::endl;}
};

在这个例子中,Derived 类重写了 Base 类的 show 函数。

区别

  • 作用域:重载是在同一作用域内的不同函数,而重写是发生在父子类之间的函数。
  • 参数列表:重载要求参数列表不同,而重写的参数列表必须完全相同。
  • 虚函数:重写通常与虚函数一起使用,以实现运行时多态。重载不涉及虚函数。
  • 多态性:重载是编译时多态,而重写是运行时多态。
  • 访问修饰符:在重写时,基类的函数通常被声明为 virtual,而重载的函数没有这个要求。

结语

通过本课的学习,你了解了如何使用函数组织代码,包括函数的定义、调用、参数传递、返回值、递归、重载、数组传递、引用传递、内联函数和lambda函数。

函数是C++中非常重要的概念,它们使得代码更加模块化、易于理解和维护。掌握函数的使用对于编写高质量的C++程序至关重要。

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

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

相关文章

生成式人工智能(AIGC)教学解决方案

一、前言 近年来&#xff0c;伴随计算能力跃升和数据量指数级增长&#xff0c;以多模态巨型模型为典型代表的生成式AI技术&#xff0c;在全球范围内引起了广泛关注与热烈追捧。在教育、医疗、法律等众多专业领域&#xff0c;生成式人工智能技术的影响力日益凸显&#xff0c;尤…

C++11 设计模式5. 原型模式

什么是原型模式&#xff1f; 原型模式⼀种创建型设计模式&#xff0c;该模式的核⼼思想是基于现有的对象创建新的对象&#xff0c;⽽不是从头开始创建。在原型模式中&#xff0c;通常有⼀个原型对象&#xff0c;它被⽤作创建新对象的模板。新对象通过复制原型对象的属性和状态来…

24.什么是跨域?解决方案有哪些?

为什么会出现跨域问题 存在浏览器同源策略&#xff0c;所以才会有跨域问题。那么浏览器是出于何种原因会有跨域的限制呢。其实不难想到&#xff0c;跨域限制主要的目的就是为了用户的上网安全。 同源策略导致的跨域是浏览器单方面拒绝响应数据&#xff0c;服务器端是处理完毕…

opencv基础篇 ——(十)非真实感渲染

非真实感渲染&#xff08;Non-Photorealistic Rendering, NPR&#xff09;是指通过一系列图像处理技术&#xff0c;将真实感图像转换为具有特定艺术风格或视觉效果的图像&#xff0c;模拟绘画、素描、卡通等非现实主义表现手法。OpenCV 提供了一些内置函数来实现非真实感渲染&a…

2024最新的,免费的 ChatGPT 网站AI(八个)

ChatGPT是美国人工智能研究实验室OpenAI在2022年11月推出的一款人工智能技术驱动的语言模型应用。它基于GPT-3.5架构&#xff08;后续还有GPT-4架构的升级版&#xff09;构建&#xff0c;拥有强大的自然语言处理能力和上下文理解能力&#xff0c;能够参与多轮对话&#xff0c;为…

Python_GUI工具包 PyQt 与 Pyside6的介绍

Python_GUI工具包 PyQt 与 Pyside6的介绍 一、简介 在Python的GUI&#xff08;图形用户界面&#xff09;开发领域&#xff0c;PyQt和PySide6是两个非常重要的工具包。它们都基于Qt库&#xff0c;为Python开发者提供了丰富的GUI组件和强大的功能。当然Python也有一些其他的GU…

Halcon 检测物体定位点

文章目录 get_domain 返回所有输入图像的定义域作为一个区域add_channels 给区域增加灰度值find_shape_model 发现匹配模板find_shape_models 发现最佳模板示例 get_domain 返回所有输入图像的定义域作为一个区域 Halcon 中的区域 get_domain(Image : Domain : : ) Image : …

SpringBoot之自定义注解参数校验

SpringBoot之自定义注解参数校验 为什么要自定义注解 我这里先引入一个例子&#xff0c;就比如我现在要写文章&#xff0c;文章也许写完正要发布&#xff0c;也可以是还没写完正要存草稿&#xff0c;前端往后端发送数据&#xff0c;如果前端的state不是草稿或者已发布状态&…

大模型应用开发极简入门

简单的归纳一下书的前序部分 目录 LLM&#xff08;Large Language Model&#xff09;的应用技术栈通常包括以下几个方面&#xff1a; 深度学习框架&#xff1a; 数据预处理工具&#xff1a; 训练资源&#xff1a; 模型优化和调参工具&#xff1a; 部署和应用集成&#xf…

智慧图书管理|基于SSM+vue的网上服装商城系统(源码+数据库+文档)

智慧图书管理目录 基于SSMvue的网上服装商城系统 一、前言 二、系统设计 三、系统功能设计 1.1 服装列表 1.2 公告信息管理 1.3 公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

linus下Anaconda创建虚拟环境pytorch

一、虚拟环境 1.创建 输入下面命令 conda create -n env_name python3.8 输入y 2.激活环境 输入 conda activate env_name 二、一些常用的命令 在Linux的控制平台 切换到当前的文件夹 cd /根目录/次目录 查看conda目录 conda list 查看pip目录 pip list查看历史命…

Python 爬虫如何配置代理 IP (Py 采集)

在Python中配置代理IP&#xff0c;可以通过设置requests库的proxies参数来实现。以下是一个示例&#xff1a; import requests# 则立可以获取稳定代理Ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg # 推荐使用私密动态 IP proxies {"http": "ht…

芒果超媒财报解读:科技加持下,如何蜕变为内容“全科生”?

在降本增效和内容为王的基调下&#xff0c;国内头部长视频平台正在拥抱增长。 爱奇艺率先公布2023年财务数据&#xff0c;实现归母净利润19.25亿元&#xff0c;与2022年亏损1.36亿元相比&#xff0c;扭亏为盈且增幅显著。 而近日&#xff0c;随着新一季《浪姐》播出&#xff…

JAVA面试题分享---多线程与线程池

多线程 什么是线程?线程和进程的区别?&#xff08;了解&#xff09; 线程&#xff1a;是进程的一个实体&#xff0c;是 cpu 调度和分派的基本单位&#xff0c;是比进程更小的 可以独立运行的基本单位。 进程&#xff1a;具有一定独立功能的程序关于某个数据集合上的一次运…

【漏洞复现】IP-guard WebServer 权限绕过漏洞

0x01 产品简介 IP-guard WebServer 是 IP-guard 网络安全管理系统的一部分,用于提供 Web 界面以进行用户权限管理、监控和审计。 0x02 漏洞概述 IP-guard WebServer的权限验证机制中存在设计缺陷,未授权的攻击者能够规避安全验证,通过后端接口执行文件的任意读取和删除操…

DaVinci Resolve Studio 19(达芬奇19调色剪辑)win/mac激活版

DaVinci Resolve Studio是一个结合专业的8k 编辑&#xff0c;颜色混合&#xff0c;视觉效果和音频后期制作的软件。只需点击一下&#xff0c;你就可以立即在编辑、混音、特效和音频流之间切换。此外&#xff0c;达芬奇解决(达芬奇)是一个多用户协作的解决方案&#xff0c;使编辑…

一单利润100+,不起眼的小生意,却能闷声发财!

今天&#xff0c;我想向大家介绍一个看似不太热门&#xff0c;但实际上需求很高的项目——酒店代订。这个项目其实很早以前就已经有人开始尝试了&#xff0c;但可能并没有被大众所熟知。简而言之&#xff0c;酒店代订就是帮助他人通过我们来预订他们想要入住的酒店。 当客户将…

管理能力学习笔记八:Will-Skill矩阵“盘“团队

如何把握带教中的“度”&#xff0c;才能在把事情做好的基础上&#xff0c;又能使员工获得成长呢&#xff1f; 需要做到 合理授权 & 适当辅导 如何做到&#xff1f; 通过使用 意愿-技能矩阵(Will-Skill Matrix) 辨别不同带教方法的适用情形&#xff0c;"盘"…

ElasticSearch总结1

目录 一、ElasticSearch介绍&#xff1a; 举例一&#xff1a; 举例二&#xff1a; 举例三&#xff1a; 二、ELK技术栈 三、Elasticsearch 的基本概念&#xff1a; 四、正向索引和倒排索引&#xff1a; 正向索引&#xff1a; 倒排索引&#xff1a; 五、Mysql和Elastics…

新版本Qt Creator安装配置

新版本Qt Creator安装配置 文章目录 新版本Qt Creator安装配置1、前言2、环境3、安装配置4、总结 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1、前言 Qt是一个跨平台的C应用程序开发框架&#xff0c;而Qt Creator是专为Q…