03_C++函数

  1. 函数的分文件编写

1.1头文件-函数声明

//swap.h文件
#include<iostream>
using namespace std;

void swap(int a, int b);

1.2源文件-函数定义

  • 在源文件中,要加上头文件引用#include "swap.h"

//swap.cpp文件
#include "swap.h"

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

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
}

1.3主函数-函数调用

//main函数文件
#include "swap.h"
int main() {

    int a = 100;
    int b = 200;
    swap(a, b);

    system("pause");

    return 0;
}
  1. 函数参数

2.1参数为一维数组

当函数参数是一维数组时,需要在函数声明中指定数组的长度或者使用指针类型的参数来接收数组。

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

int main() {
    int arr[] = { 1, 2, 3, 4, 5 };
    int size = sizeof(arr) / sizeof(int);
    printArray(arr, size);
    return 0;
}

2.2参数为二维数组

二维数组实际上是由多个一维数组组成的数组。当将二维数组作为函数参数时,可以使用指向数组首元素的指针或者使用数组的引用来接收它。

#include <iostream>
using namespace std;
void print2DArray(int** arr, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cout << arr[i][j] << " ";
        }
        cout << std::endl;
    }
}

int main() {
    int arr[3][4] = { {1, 2, 3, 4},
                     {5, 6, 7, 8},
                     {9, 10, 11, 12} };
    int** ptr = new int* [3];
    for (int i = 0; i < 3; i++) {
        ptr[i] = arr[i];
    }
    print2DArray(ptr, 3, 4);
    delete[] ptr;
    return 0;
}

可以看出,C++的函数传入传出数组非常麻烦,建议使用C++标准库中的vector容器来代替二维数组,使代码更加简洁和易于管理。

#include <iostream>
#include <vector>
using namespace std;
void print2DVector(vector<vector<int>> arr) {
    for (int i = 0; i < arr.size(); i++) {
        for (int j = 0; j < arr[i].size(); j++) {
           cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> arr = { {1, 2, 3},
                                {4, 5, 6},
                                {7, 8, 9} };
    print2DVector(arr);
    return 0;
}

vector可以很好的替代二维以及二维以上的数组,同时包含大量函数(例arr.size())可以使用,之后会详细介绍。

  1. 默认参数

  • 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值

int func(int a, int b = 10, int c = 10) {
    return a + b + c;
}
  • 如果函数声明有默认值,函数实现的时候就不能有默认参数

int func2(int a = 10, int b = 10);
int func2(int a, int b) {
    return a + b;
}
  1. 函数重载

  • 函数重载要在同一个作用域下

#include <iostream>
using namespace std;
int func()
{
    cout << "func 的调用!" << endl;
    return 0;
}
int func(int a)
{
    cout << "func (int a) 的调用!" << endl;
    return 0;
}
void func(double a)
{
    cout << "func (double a)的调用!" << endl;
}
void func(int a, double b)
{
    cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a, int b)
{
    cout << "func (double a ,int b)的调用!" << endl;
}

int main() {

    int a=func();
    int b=func(10);
    func(3.14);
    func(10, 3.14);
    func(3.14, 10);

    system("pause");

    return 0;
}
  • 函数的返回类型不能作为一个重载的条件

  • 函数重载要尽量避免默认参数,以免引起混淆

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

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

相关文章

最少砝码(思维+找规律)

最少砝码 前n个可以表示0~k; 第n1个为x&#xff08;x>k&#xff09;; 最大可测maxnkx; 第n1个和前n个放两边 可测得x-k&#xff1b; 让x-kk1&#xff0c;得到x2k1&#xff1b; maxn3k1&#xff1b; k1 可以用(2k1) - (k-0) 表示 k2 可以用(2k1) - (k-1) 表示 … 2k1 可以用…

Compose 动画 (八) : Compose中的动画差值器 AnimationSpec

1. AnimationSpec是什么 Android Compose中的AnimationSpec用来自定义动画规格。 啥意思呢&#xff0c;其实就是类似于传统View体系中的差值器Interpolator&#xff0c;但是比起差值器&#xff0c;又提供了更多的功能。 根据其不同的子类&#xff0c;可以来控制动画执行时长、…

运维1.12了解集中式日志管理工具 ELK 的基本用法,包括数据采集、搜索和展示

ELK 是一个由三个开源项目组成的日志管理工具&#xff0c;它们分别是 Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个基于 Lucene 的搜索引擎&#xff0c;它可以提供实时的分布式搜索和分析能力&#xff1b;Logstash 是一个日志收集和处理工具&#xff0c;可以实现多…

《白帽子讲Web安全》世界观安全

1.Web安全简史1.1中国黑客简史对于现代计算机系统来说&#xff0c;在用户态的最高权限是root&#xff0c;也是黑客们最渴望能够获取的系统最高权限。不想拿到“root”的黑客&#xff0c;不是好黑客。在现实世界中&#xff0c;真正造成破坏的&#xff0c;往往并非那些挖掘并研究…

10秒去除WPS Office弹窗广告教程(2023.3.31最新)

目录 前言 步骤 1. 右击WPS Office&#xff0c;打开文件所在目录 2. 打开第二个文件夹 3. 进入office 6文件夹 4. 找到文件ksomisc.exe 5. 右击选择以管理员身份运行 6. 打开后是下面的界面&#xff0c;点击“高级(A)...” 7. 按照下图操作 8. 最后点击退出就设置完…

Mybatis配置之属性优化理解【transactionManager、dataSource、properties】

文章目录一.Mybatis配置之属性优化1.1 配置解析1.2 默认配置环境1.2.1 事务管理器&#xff08;transactionManager&#xff09;了解即可。1.2.2 数据源&#xff08;dataSource&#xff09;1.3 属性&#xff08;properties&#xff09;一.Mybatis配置之属性优化 1.1 配置解析 …

PyTorch 深度学习实战 |用 TensorFlow 训练神经网络

为了更好地理解神经网络如何解决现实世界中的问题&#xff0c;同时也为了熟悉 TensorFlow 的 API&#xff0c;本篇我们将会做一个有关如何训练神经网络的练习&#xff0c;并以此为例&#xff0c;训练一个类似的神经网络。我们即将看到的神经网络&#xff0c;是一个预训练好的用…

达梦回滚表空间的空间占用和释放

我们知道DML和DDL的区别之一是DML&#xff08;INSERT、UPDATE、DELETE&#xff09;操作数据库会产生重做日志和回滚日志&#xff0c;DDL不会产生重做日志和回滚日志&#xff0c;本章从系统表和动态视图上来分析达梦数据库DML和DDL对回滚表空间的占用&#xff0c;以及达梦回滚表…

C++11:可变参数模板/lambda表达式

1.可变参数模板 C11的新特性可变参数模板能够让我们创建可以接受可变参数的函数模板和类模板&#xff0c;相比C98和C03&#xff0c;类模板和函数模板中只能含固定数量的模板参数&#xff0c;可变参数模板无疑是一个巨大的改进。可是可变参数模板比较抽象&#xff0c;因此这里只…

vue路由守卫死循环及路由守卫使用

当前业务要求&#xff1a; 通过判断本地sessionstorge判断当前是否需要登陆页面 问题场景&#xff1a;用户登陆进入页面内部&#xff0c;点击退出登录&#xff0c;清除本地用户信息&#xff0c;页面跳转至登陆页面&#xff0c;使用浏览器的回退可以正常返回至项目内部。需要改…

kettle开发篇-更新-Day38

目录 前言&#xff1a; 一、更新组件介绍 1.1界面 1.2废话介绍 1.3重点解释 二、应用案例 2.1转换效果 2.2转换简介 三、总结 前言&#xff1a; 前面我们通过oracle的索引来处理单表超1亿的数据量表的查询问题&#xff0c;通过针对主键&#xff0c;展示的维度做多套索引…

如何使用码匠连接 GaussDB

目录 在码匠中集成 GaussDB 在码匠中使用 GaussDB 关于码匠 GaussDB 是华为推出的一个高性能、高可靠、高安全的分布式数据库管理系统。它采用多活架构&#xff0c;支持全球数据同步&#xff0c;可实现数据的实时同步和容灾备份&#xff0c;可满足不同业务场景下的数据管理…

《钢琴调律原理及应用》 笔记

【第一章 绪论】第一节 钢琴调律的概念 美国人威廉布雷德怀特于 1917 年发表了世界上第一部关于钢琴调律理论与技术的著作&#xff0c;书名为《钢琴调律与相关技术》 福岛琢郎于1950年发表一部名为《钢琴的构造调律修理》的专著 80年代初&#xff0c;在沈阳音院任教的张琨先生…

蓝桥杯正确的解题姿势

在做算法题的过程中最忌讳的就是上来就一顿乱敲&#xff0c;一开始我就是这样&#xff0c;但随着不断的刷题和老师的指导&#xff0c;总结了自己的刷题方法 示例题目 三角回文数 问题描述 对于正整数 n, 如果存在正整数 k使得 n123...kk(k1)/2 , 则 n 称为三角数。例如, 66066 …

弱监督实例分割 Box-supervised Instance Segmentation with Level Set Evolution 论文笔记

弱监督实例分割 Box-supervised Instance Segmentation with Level Set Evolution 论文笔记一、Abstract二、引言三、相关工作3.1 基于 Box 的实例分割3.2 基于层级的分割四、提出的方法4.1 图像分割中的层级模型4.2 基于 Box 的实例分割在 Bounding Box 内的层级进化输入的数据…

CentOS7+LAMP+DVWA靶机搭建

一、什么是DVWA Damn Vulnerable Web Application (DVWA)(译注&#xff1a;可以直译为&#xff1a;"该死的"不安全Web应用程序)&#xff0c;是一个编码差的、易受攻击的 PHP/MySQL Web应用程序。 它的主要目的是帮助信息安全专业人员在合法的环境中&#xff0c;练习…

【自动化】selenium配置步骤 | 备份本地资源

1、安装jdk 2、设置环境变量 .1、CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar .2、JAVA_HOME C:\Program Files\Java\jdk1.8.0_231 .3、PATH 新增 %JAVA_HOME%\bin 3、安装chrome 版本&#xff1a;85.0.4183.83 4、禁用chrom…

AOP配置管理

AOP配置管理4&#xff0c;AOP配置管理4.1 AOP切入点表达式4.1.1 语法格式4.1.2 通配符4.1.3 书写技巧4.2 AOP通知类型4.2.1 类型介绍4.2.2 环境准备4.2.3 通知类型的使用前置通知后置通知环绕通知基本使用注意事项返回后通知异常后通知通知类型总结知识点1&#xff1a;After知识…

基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

本文目录前言做项目的三大好处强强联手(天狗组合)专栏作者简介专栏的优势后端规划1. SpringBoot 和 SpringCloud 的选择2. Mybatis 和 MybatisPlus 和 JPA 的选择3. MySQL 和 Mongodb 的选择4. Redis 和 RocketMQ5. 后端规划小总结后端大纲提前掌握的知识点一期SpringBoot二期S…

经典文献阅读之--LOCUS 2.0(LiDAR为中心的多传感器LSLAM)

0. 简介 在20年DARPA地下挑战赛中CoSTAR队伍提出了LOCUS这个深度学习模块&#xff0c;在两年后LOCUS2.0出世&#xff0c;LOCUS 2.0包括一种新的基于法线的广义迭代最近点&#xff08;GICP&#xff09;公式&#xff0c;该公式减少了点云对齐的计算时间&#xff0c;一种自适应体…