IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【跟学C++】C++的函数(Study6) -> 正文阅读

[C++知识库]【跟学C++】C++的函数(Study6)


?============================ 【说明】 ===================================================
??大家好,本专栏主要是跟学C++内容,自己学习了这位博主【 AI菌】的【C++21天养成计划】,讲的十分清晰,适合小白,希望给这位博主多点关注、收藏、点赞。
??主要针对所学内容,通过自己的理解进行整理,希望大家积极交流、探讨,多给意见。后面也会给大家更新,其他一些知识。若有侵权,联系删除!共同维护网络知识权利!
?=======================================================================================

1、函数

1.1 认识函数

??谈到函数,大家可能在中学、大学数学都学过。而C++中的函数与数学中的函数有相同之处,都表示一种映射关系(C++中为逻辑关系),也有对应输入与输出。
??在C++中,函数时一组一起执行一个任务的语句(或语句块)。每个程序至少有一个函数,在之前程序中main()就是一个函数,称为主函数,程序从主函数开始执行。
??在平时学习,或者小型程序中,我们可以在主函数main()中实现。但是,当遇到大型项目时,main()函数就不能保持程序易读且逻辑清晰,所以函数就必须要使用了。函数能够划分和组织程序的执行逻辑。使用函数可以将原本复杂冗长的程序划分为依次调用的程序块。

1.2 函数定义及声明

(1) 函数定义
??C++中,函数定义的基本形式如下:

return_type function_name(parameter list)
{
	函数主体;
}

??return_type:返回类型,表示函数返回值的数据类型,函数一般有返回值,但也可以只执行某些操作不返回任何值,返回类型则为void
??function_name:这是函数的名称,根据定义规则以及易读易懂规则进行自定义。
??parameter list:参数列表,参数即占位符,当调用函数时,向参数传递某个值,该值称为实参(实际参数)。参数列表包括函数参数类型、顺序、数量。其中,参数是可选的,可以包含参数、也可以不包含。
??函数主体:函数主体结构,执行某些操作的语句或语句块。
通过一个案例来理解函数,计算圆的面积。

#include <iostream>
using namespace std;

const double PI = 3.14;
double Circle_Area(double r) {

	return PI * r*r;

}

int main() {
	cout << "请输入圆的半径:" << endl;
	double radius = 0;
	cin >> radius;
	cout << "圆的面积为:" << Circle_Area(radius) << endl;
	return 0;

}

在这里插入图片描述
(1) 函数声明
??函数声明会告诉编译器函数名称以及函数该如何调用。函数调用的形式为:

return_type function_nama(parameter list);

??函数定义与函数声明差不多,区别是函数声明,语句末尾加上分号。我们可以声明函数为:

double Circle_Area(double r); 

??当然,我们也可以只保留参数类型,不写参数名:

double Circle_Area(double ); 

??平时编程时,个人觉得还是将参数名写上去比较好,算是一种编程习惯。
??
??函数声明有两种情形:
??1) 了解C++的应该知道,上面案例中没有声明函数也是可以正常执行。这就是其中一种情形,如果函数定义在main()函数之前那么函数声明可以省略。如果函数声明在main()之后,那么必须要函数声明。例如:

#include <iostream>
using namespace std;
double Circle_Area(double r);

const double PI = 3.14;


int main() {
	cout << "请输入圆的半径:" << endl;
	double radius = 0;
	cin >> radius;
	cout << "圆的面积为:" << Circle_Area(radius) << endl;
	return 0;
}
//函数定义在main()之后
double Circle_Area(double r) {

	return PI * r*r;
}

??2) 如果在一个源文件中定义函数,另一个文件需要调用时,函数时必须要声明的。

1.3 函数调用

??C++在定义函数时,函数的主要功能就是解决某一问题或完成某一任务,例如计算面积、周长等等。然后通过调用函数的形式来完成该任务。调用函数时,传递所需参数,如果函数返回一个值,则可以存储该函数返回的值。同样以计算圆形的面积为例:

#include <iostream>
using namespace std;
double Circle_Area(double r);

const double PI = 3.14;

int main() {
	cout << "请输入圆的半径:" << endl;
	double radius = 0;
	cin >> radius;
	cout << "圆的面积为:" << Circle_Area(radius) << endl;
	return 0;
}
//函数定义在main()之后
double Circle_Area(double r) {
	S=PI * r*r
	return S;//函数返回值,可以存储该值
}

在这里插入图片描述

1.4 形参与实参

??形参:如果函数要使用参数,那么必须声明接受参数值的变量,即上述案例中的半径r,这个参数称之为形式参数。形式参数与局部参数类似,在进入函数(调用函数)时创建,退出函数则销毁。
??实参:在调用函数时,我们需要用到实参,编译器会自动将实参传递给形参,然后执行函数体。上述案例中,实参值为用户输入的半径,然后编译器将半径值传递给形参,执行函数。

2、函数默认参数

??前面案例中,圆周率是固定的,所以定义为不可变常量。如果我们想提高圆面积的精度,那么小数点两位是不够的。这边可以利用默认参数,来解决该问题,在函数Circle_Area()中新增默认参数PI。例如:

double Circle_Area(double r, double Pi=3.14);

??由于PI是默认参数,用户在调用函数时,可选也可不选,若不选默认值即为3.14。如果想提高计算精度,我能可以在调用函数时,重新指定PI值,例如:

//调用函数
Circle_Area(radius, 3.1415);

??因此,之前的案例可以更新一下:

#include<iostream>
using namespace std;

double Circle_Area(double r, double Pi = 3.14); //函数声明 
int main()
{
	cout << "请输入圆形的半径radius:";
	double radius = 0, area = 0; //初始化半径 、面积 
	cin >> radius;     //输入半径 
	area = Circle_Area(radius);  //将函数的返回值给area 
	cout << "使用默认值Pi,该圆的面积是:" << area << endl;

	area = Circle_Area(radius, 3.1416);
	cout << "指定Pi=3.1416后,该圆的面积是:" << area << endl;
	return 0;
}

double Circle_Area(double r, double Pi)
{
	double S = Pi * r*r;  //就算圆的面积 
	return S;  //返回面积S 
}

在这里插入图片描述

3、递归函数

??斐波那契数列应该比较熟,这是一个典型的递归函数案例。说通俗点,就是函数自己调自己,我们称之为递归函数。递归函数必须要有退出条件,即达到一定条件,退出函数。那么斐波那契函数即:Fn=Fn-1+Fn-2,F1=F2=1。我们通过C++完成斐波那契数列。

//斐波那契数列
int Fibonacci(int n) {
	if (n==1||n==2)
	{
		return 1;

	}
	else
	{
		return Fibonacci(n - 1) + Fibonacci(n - 2);
	}
}

int main() {
	int n = 0;
	cout << "请输入Fibonacci要输出的第几个数:" << endl;
	cin >> n;
	cout <<"Fibonacci第 "<<n<<" 个数为:" <<Fibonacci(n);
	return 0;
}

在这里插入图片描述

4、处理不同类型数据

??在上述案例中,调用函数大多用的是一些整型、浮点型数,其实在函数传递时,可以传递数组等数据。

4.1 参数为数组

??我们来定义一个函数,这个函数第一个参数为数组,第二参数为数组的长度,保证数组不溢出。

void Arr(int NumArr[],int length);

??通过调用,来显示一个整型数组和一个字符数组:

#include<iostream>
using namespace std;

void ShowArr(int NumArr[], int length)
{
	for (int i = 0; i < length; i++)
		cout << NumArr[i] << " ";
}

void ShowArr(char CharArr[], int length)
{
	for (int i = 0; i < length; i++)
		cout << CharArr[i] << " ";
}

int main()
{
	int numarr[5] = { 1,2,3,4,5 };
	ShowArr(numarr, 5);
	cout << endl;
	char chararr[6] = { 'w','o','r','l','d','\0' };
	ShowArr(chararr, 6);
	return 0;
}

在这里插入图片描述

4.2函数重载

??你们是否发现,上面案例中,定义了相同的函数。其中,函数名称、返回类型都一样,但是就是参数不同。这样的函数我们称之为函数重载
??在实际程序中,如果需要使用不同的参数调用具有相同名称和返回类型的函数,重载函数将很实用。
??我们可以通过计算圆的面积和圆柱的面积来熟悉一下。圆的面积仅需要半径,而圆柱面积还需要参数高h。这两个函数的返回数据类型都一样,且都是面积。那么我们可以定义一个同名函数Area(),其中第一个函数仅有参数半径,另一隔个函数包括半径和高。

#include<iostream>
using namespace std;

const double PI = 3.14;
double Area(double r);
double Area(double r, double h);

double Area(double r) {
	double S = PI * r*r;
	return S;

}

double Area(double r, double h) {
	double S = 2 * PI*r*h + PI * r*r;
	return S;
}

int main() {
	int r = 0, h = 0;
	cout << "请输入圆的半径和圆柱的高:";
	cin >> r >> h;
	cout << "圆的面积为:" << Area(r)<<endl;
	cout << "圆柱的面积为:" << Area(r, h) << endl;
	return 0;

}

在这里插入图片描述

4.3 引用的方式传递参数

??根据程序需要,我们想将函数内修改的参数能在函数外也可以用,因此,可以将形参的类型声明为引用&
??&,编译器知道,不会将这个参数复制给函数,而是将指向该实参的引用传递给参数。

#include<iostream>
using namespace std;

const double Pi=3.14;
void Area(double r, double& result) //result为将要返回的值的引用
{
	result=Pi*r*r;
}

int main()
{
	cout<<"输入半径radius:";
	double radius=0;
	cin>>radius;
	double GetResult=0;//定义
	Area(radius,GetResult);
	cout<<"圆的面积是:"<<GetResult<<endl;
	return 0;
}

??因此,该函数的返回类型是void,因为该函数不再通过返回值提供计算得到的面积,而是按引l用以输出参数的方式提供它。

5、总结

??最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,我也会及时更新,来督促自己学习进度。一开始提及的博主【AI菌】,个人已关注,并订阅了相关专栏(对我有帮助的),希望大家觉得不错的可以点赞、关注、收藏

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:26:01  更:2022-05-18 17:27:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 18:34:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码