【C++核心】函数的应用和提高详解

news/2025/1/15 17:16:45/

一. 函数

1.1 概述

作用: 将一段经常使用的代码封装起来,减少重复代码。一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。

1.2 函数的定义

函数的定义一般主要有5个步骤:
1、返回值类型
2、函数名
3、参数表列
4、函数体语句
5、return 表达式

语法:

返回值类型 函数名 (参数列表)
{函数体语句return 表达式
}
  • 返回值类型 :一个函数可以返回一个值。在函数定义中
  • 函数名:给函数起个名称
  • 参数列表:使用该函数时,传入的数据
  • 函数体语句:花括号内的代码,函数内需要执行的语句
  • return表达式: 和返回值类型挂钩,函数执行完后,返回相应的数据

示例: 定义一个加法函数,实现两个数相加

//函数定义
int add(int num1, int num2)
{int sum = num1 + num2;return sum;
}

1.3 函数的调用

功能: 使用定义好的函数

语法: 函数名(参数)

示例:

#include<iostream>
using namespace std;//函数定义
int add(int num1, int num2) //定义中的num1,num2称为形式参数,简称形参
{int sum = num1 + num2;return sum;
}int main() {int a = 10;int b = 10;//调用add函数int sum = add(a, b);//调用时的a,b称为实际参数,简称实参cout << "sum = " << sum << endl;a = 100;b = 100;sum = add(a, b);cout << "sum = " << sum << endl;return 0;
}

总结:函数定义里小括号内称为形参,函数调用时传入的参数称为实参

1.4 值传递

  • 所谓值传递,就是函数调用时实参将数值传入给形参
  • 值传递时,如果形参发生,并不会影响实参

示例:

#include<iostream>
using namespace std;void swap(int num1, int num2)
{cout << "交换前:" << endl;cout << "num1 = " << num1 << endl;cout << "num2 = " << num2 << endl;int temp = num1;num1 = num2;num2 = temp;cout << "交换后:" << endl;cout << "num1 = " << num1 << endl;cout << "num2 = " << num2 << endl;//return ; 当函数声明时候,不需要返回值,可以不写return
}int main() {int a = 10;int b = 20;swap(a, b);cout << "mian中的 a = " << a << endl;cout << "mian中的 b = " << b << endl;return 0;
}

总结: 值传递时,形参是修饰不了实参的

1.5 函数的常见样式

常见的函数样式有4种:

  1. 无参无返
  2. 有参无返
  3. 无参有返
  4. 有参有返

示例:

#include<iostream>
using namespace std;//函数常见样式
//1、 无参无返
void test01()
{//void a = 10; //无类型不可以创建变量,原因无法分配内存cout << "this is test01" << endl;//test01(); 函数调用
}//2、 有参无返
void test02(int a)
{cout << "this is test02" << endl;cout << "a = " << a << endl;
}//3、无参有返
int test03()
{cout << "this is test03 " << endl;return 10;
}//4、有参有返
int test04(int a, int b)
{cout << "this is test04 " << endl;int sum = a + b;return sum;
}

1.6 函数的声明

作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。函数的声明可以多次,但是函数的定义只能有一次

示例:

#include<iostream>
using namespace std;//声明可以多次,定义只能一次
//声明
int max(int a, int b);
int max(int a, int b);
//定义
int max(int a, int b)
{return a > b ? a : b;
}int main() {int a = 100;int b = 200;cout << max(a, b) << endl;return 0;
}

1.7 函数的分文件编写

作用: 让代码结构更加清晰

函数分文件编写一般有4个步骤

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义

示例:

//swap.h文件
#include<iostream>
using namespace std;//实现两个数字交换的函数声明
void swap(int a, int b);
//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;
}
//main函数文件
#include "swap.h"
int main() {int a = 100;int b = 200;swap(a, b);return 0;
}

二. 函数提高

2.1 函数默认参数

在C++中,函数的形参列表中的形参是可以有默认值的。
语法: 返回值类型 函数名 (参数= 默认值){}

示例:

#include<iostream>
using namespace std;int func(int a, int b = 10, int c = 10) {return a + b + c;
}//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数
int func2(int a = 10, int b = 10);
int func2(int a, int b) {return a + b;
}int main() {cout << "ret = " << func(20, 20) << endl;cout << "ret = " << func(100) << endl;return 0;
}

2.2 函数占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置。

语法: 返回值类型 函数名 (数据类型){}

示例:

#include<iostream>
using namespace std;//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {cout << "this is func" << endl;
}int main() {func(10,10); //占位参数必须填补return 0;
}

2.3 函数重载

作用: 函数名可以相同,提高复用性

函数重载满足条件:

  • 同一个作用域下
  • 函数名称相同
  • 函数参数类型不同 或者 个数不同 或者 顺序不同

注意: 函数的返回值不可以作为函数重载的条件

示例:

#include<iostream>
using namespace std;//函数重载需要函数都在同一个作用域下
void func()
{cout << "func 的调用!" << endl;
}
void func(int a)
{cout << "func (int a) 的调用!" << endl;
}
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 func(double a, int b)
//{
//	cout << "func (double a ,int b)的调用!" << endl;
//}int main() {func();func(10);func(3.14);func(10,3.14);func(3.14 , 10);return 0;
}

注意:

  • 引用作为重载条件
  • 函数重载碰到函数默认参数

示例:

#include<iostream>
using namespace std;//函数重载注意事项
//1、引用作为重载条件void func(int &a)
{cout << "func (int &a) 调用 " << endl;
}void func(const int &a)
{cout << "func (const int &a) 调用 " << endl;
}//2、函数重载碰到函数默认参数void func2(int a, int b = 10)
{cout << "func2(int a, int b = 10) 调用" << endl;
}void func2(int a)
{cout << "func2(int a) 调用" << endl;
}int main() {int a = 10;func(a); //调用无constfunc(10);//调用有const//func2(10); //碰到默认参数产生歧义,需要避免return 0;
}

http://www.ppmy.cn/news/551933.html

相关文章

从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

1 中断处理程序的基本要求 当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是中断执行完毕后要恢复到原来执行的程序,除了时间流逝外,原来运行的程序应该毫无感知。 具体到Armv…

【工具】Spring 历史官方文档理解(持续更新)

文章目录 [1] Spring Framework 5.2.24CoreAOP 概念AspectJoin pointAdvicePointcutIntroductionTarget objectAOP proxyWeaving Spring AOPAspectJ官方 demo 学习 Pointcut 表达式官方 demo 学习 Advice 声明官方 demo 学习 Introductions &#xff08;接口拓展&#xff09;AO…

5.2.3目录与文件之权限意义

现在我们知道了Linux系统内文件的三种身份&#xff08;拥有者、群组与其他人&#xff09;&#xff0c;知道每种身份都有三种权限&#xff08;rwx&#xff09;&#xff0c; 已知道能够使用chown, chgrp, chmod去修改这些权限与属性&#xff0c;当然&#xff0c;利用ls -l去观察文…

C语言倒计时器

今天用这几天所学知识自己编写一个简易计时器&#xff08;因为过于简单&#xff0c;所以不过多解释&#xff09; #include<stdio.h> #include<Windows.h>//编写一个倒计时器void main() {system("title 倒计时器");//设置标题system("mode con col…

51单片机实现倒计时,按键控制倒计时

基于AT89C52的答辩倒计时。四个按键分别控制倒计时开始&#xff0c;暂停&#xff0c;时间加和减。剩下30S时蜂鸣器响&#xff0c;倒计时结束蜂鸣器响。 #include <REGX52.H>unsigned char min1; unsigned char sec00; sbit KEY1P3^1; sbit KEY2P3^0; sbit KEY3P3^2; sbit…

单片机课设-60秒倒计时器

proteus单片机实现60秒倒计时器 项目要实现的60s秒表倒计时器&#xff0c;用 AT89C51单片机的定时 / 计数器 T0 产生一秒的定时时间&#xff0c;实现 59 到 0秒的循环显示的功能。具体要求&#xff1a; 1&#xff09;按下启动按键后&#xff0c;倒计时器开始工作&#xff0c;从…

基于51单片机的倒计时系统

具体实现功能 系统由STC89C52单片机按键电路复位电路晶振电路LCD1602显示模块构成。 具体功能&#xff1a; &#xff08;1&#xff09;六位LED显示&#xff0c;从59分59秒99开始倒计时&#xff1b; &#xff08;2&#xff09;倒计时精度为0.01秒&#xff0c;能正确地进行倒…

51单片机应用篇-- --倒计时数字钟,矩阵按键可调

开篇先说一句废话 本旺名字叫萨摩耶&#xff0c;&#xff0c;Please 叫我旺财&#xff0c;&#xff0c;&#xff0c;哈哈&#xff0c;招财进宝嘛&#xff01; 项目要求 这篇也和之前那篇文章单片机应用篇-- --数码管60秒计时&#xff0c;独立按键可调 差不多&#xff0c;而且…