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.mfbz.cn/a/585665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

2.2 前言 关于Unity面试题相关的所有知识点&#xff1a;&#x1f431;‍&#x1f3cd;2023年Unity面试题大全&#xff0c;共十万字面试题总结【收藏一篇足够面试&#xff0c;持续更新】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理…

19 做好微服务间依赖的治理和分布式事务

在前两讲里&#xff0c;分别从微服务的对外接口、消息消费以及微服务自身的相关编码规范上阐述了“防备上游、做好自己”这两个准则如何落地。 在本讲里&#xff0c;将会讲解为什么要“怀疑下游”&#xff0c;以及有哪些手段可以落地此条准则。此外&#xff0c;还会介绍在进行…

基于SSM的个人博客系统(三)

目录 第五章 系统实现 5.1 登录模块 5.1.1 博主登录 5.2 博客管理模块&#xff1a; 5.2.1 博客查询 5.2.2 博客新建 5.2.3 博客修改 5.2.4 博客删除 5.3 博客类别管理模块 前面内容请移步 基于SSM的个人博客系统&#xff08;二&#xff09; 个人博客系统的设计…

Qt+Ubuntu20.04:打包qt

打包程序 参考 qt项目在Linux平台上面发布成可执行程序.run_qt.run不是虚拟机的配置文件-CSDN博客 Linux下Qt程序的打包发布(1)-不使用第三方工具 - 知乎 (zhihu.com) 过程 1、Release编译 先将你的程序在release下编译通过&#xff0c;保证下面打包的程序是你最新的。 2…

沐风老师3DMAX一键生成桌子插件TableMaker使用方法

3DMAX一键生成桌子插件TableMaker使用教程 3DMAX一键生成桌子插件TableMaker&#xff0c;参数化方式快速创建各种样式桌子模型。 【适用版本】 3dMax2011-2025&#xff08;不仅限于此范围&#xff09; 【安装方法】 3DMAX一键生成桌子插件无需安装&#xff0c;使用时直接拖动…

GCB | 陆地生态系统C:N:P化学计量对降水变化的响应

西北农林科技大学水保学院上官周平研究员团队在陆地生态系统C:N:P化学计量对降水变化的响应方面取得新进展&#xff0c;并以“C:N:P stoichiometry of plants, soils, and microorganisms: Response to altered precipitation”为题发表在国际生态环境领域著名期刊Global Chang…

SpringBoot之自定义注解参数校验

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

C语言中的趣味代码(五)

我想以此篇结束关于C语言的博客&#xff0c;因为在C语言拖得越久越不能给大家带来新的创作&#xff0c;在此我也相信大家对C语言已经有了一个新的认知。进入正题&#xff0c;在这一篇中我主要编一个“英语单词练习小程序”来给大家展开介绍&#xff0c;从测试版逐步改良&#x…

C语言(操作符)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

【JavaWeb】Day62.SpringBootWeb案例——基础登录功能

登录功能 需求 在登录界面中&#xff0c;我们可以输入用户的用户名以及密码&#xff0c;然后点击 "登录" 按钮就要请求服务器&#xff0c;服务端判断用户输入的用户名或者密码是否正确。如果正确&#xff0c;则返回成功结果&#xff0c;前端跳转至系统首页面。 接…

Python数据分析系列(一):python入门

文章目录 前言一、Python运行方式二、Python集成开发环境(IDE)三、Python开发平台—Anaconda1、下载2、安装3、使用3.1 Anaconda应用介绍3.2 配置Python库3.3 集成开发环境使用3.3.1.Spyder3.3.2 Jupyter Notebook四、Python入门概念1、入门函数:print()与input()2、python书写…

SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize

上一章讲了作业手顺&#xff08;工艺路线Routing&#xff09;。 SAP PP学习笔记07 - 作业手顺&#xff08;工艺路线Routing&#xff09;-CSDN博客 这一章来讲讲作业区&#xff08;工作中心 Work Center&#xff09;。 1&#xff0c;作业区&#xff08;工作中心&#xff09;中…

挑战一周完成Vue3项目Day3: 品牌管理+平台属性管理+SPU管理+SKU管理

一、真实接口替换mock接口 &#xff08;1&#xff09;替换各个环境下的服务器地址&#xff08; .env.development、.env.production、.env.test &#xff09; VITE_SERVE"http://sph-api.atguigu.cn" &#xff08;2&#xff09; 配饰代理跨域&#xff1a;vite.con…

如何测试响应式网站

我们每天通过多种设备访问互联网。移动电话&#xff0c;台式机/笔记本电脑&#xff0c;平板电脑&#xff0c;平板电脑…我们所掌握的设备数量已经增长为天文数字。作为消费者&#xff0c;体验很棒。我们可以随时随地在任何设备上自由访问互联网。但对于Web开发人员&#xff0c;…

磁盘格式化文件恢复:一文看懂数据恢复操作

当你意识到关键的硬盘已经被格式化&#xff0c;而且你不能获取里面的内容时&#xff0c;这会是非常令人沮丧的。这种情况可能是因为硬盘被不小心格式化&#xff0c;或者是你在试图修正一些问题、调整文件系统或者释放存储空间时&#xff0c;有意进行的格式化。无论具体情况是什…

Go 语言变量

变量来源于数学&#xff0c;是计算机语言中能储存计算结果或能表示值抽象概念。 变量可以通过变量名访问。 Go 语言变量名由字母、数字、下划线组成&#xff0c;其中首个字符不能为数字。 声明变量的一般形式是使用 var 关键字&#xff1a; var identifier type 可以一次声…

线程基础知识

进程是资源分配的最小单位&#xff0c;线程是程序执行的最小单位… 为什么使用线程 多线程之间会共享同一块地址空间和所有可用数据的能力&#xff0c;这是进程所不具备的线程要比进程更轻量级 &#xff0c;由于线程更轻&#xff0c;所以它比进程(fork创建进程以执行新的任务…

Postgresql 从小白到高手 十一 :数据迁移ETL方案

文章目录 Postgresql 数据迁移ETL方案1、Pg 同类型数据库2 、Pg 和 不同数据库 Postgresql 数据迁移ETL方案 1、Pg 同类型数据库 备份 : pg_dump -U username -d dbname -f backup.sql插入数据&#xff1a; psql -U username -d dbname -f backup.sqlpg_restore -U username…

远程桌面连接服务器怎样连接不上的六个常见原因

远程桌面连接服务器无法连接的问题可能由多种原因引起。以下是一些常见的问题及其解决方案&#xff1a; 1. 网络连接问题&#xff1a;远程桌面连接的基础是稳定的网络连接。如果网络连接不稳定或中断&#xff0c;那么你将无法连接到远程桌面。检查你的网络连接&#xff0c;确保…

Codigger数据篇(中):数据可控性的灵活配置

在数据服务领域中&#xff0c;数据可控性无疑是至关重要的一环。数据可控性不仅关乎数据的安全性和隐私性&#xff0c;更直接影响到数据价值的实现。Codigger&#xff0c;在其数据可控性方面的灵活配置&#xff0c;为用户提供了更加便捷、高效的数据管理体验。 一、自主选择数…
最新文章