【C++程序设计】——利用函数实现指定功能(三)

在这里插入图片描述


👨‍💻个人主页@开发者-削好皮的Pineapple!

👨‍💻 hello 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 削好皮的Pineapple! 原创

👨‍💻 收录于专栏C++程序设计


请添加图片描述

请添加图片描述


⭐前言⭐

宝宝们,继续来到函数的第三Part,学好函数可以收获🤞

  • 省去编写重复代码的苦闷
  • 让程序模块化,提高代码可读性
  • 方便后期修改、完善
  • 隐藏了实现的细节
  • 一起来学习吧 go go go~

🎶一、函数模板


🌰:求三个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数的重载方法。
源代码如下:

#include<iostream>
using namespace std;

int max(int a, int b, int c) {
	int max_value = a;
	if (b > max_value) max_value = b;
	if (c > max_value) max_value = c;
	return max_value;
}

double max(double a, double b, double c) {
	double max_value = a;
	if (b > max_value) max_value = b;
	if (c > max_value) max_value = c;
	return max_value;
}

long max(long a, long b, long c) {
	long max_value = a;
	if (b > max_value) max_value = b;
	if (c > max_value) max_value = c;
	return max_value;
}

int main() {
	int i1, i2, i3, i;
	cin >> i1 >> i2 >> i3;
	i = max(i1, i2, i3);
	cout << "max1=" << i << endl;

	double d1, d2, d3, d;
	cin >> d1 >> d2 >> d3;
	d = max(d1, d2, d3);
	cout << "max2=" << d << endl;

	long g1, g2, g3, g;
	cin >> g1 >> g2 >> g3;
	g = max(g1, g2, g3);
	cout << "max3=" << g << endl;

	return 0;
}

运行结果如下图:
在这里插入图片描述
在该例子中,我们不难发现,程序中的三个函数的函数体是完全相同的,只是形参的类型不同,也分别要定义。为解决该问题,C++提供了函数模板
所谓函数模板,实际上是建立一个通用的函数,其函数的类型和形参类型不具体指定,用一个虚拟的类型来代表。
例如,以上例子改写成用函数模板来展示:
源代码如下:

#include<iostream>
using namespace std;
template<typename T>//模板声明,其中T为类型参数
T max(T a,T b,T c) 
{	int max_value = a;
		if (b > max_value) max_value = b;
		if (c > max_value) max_value = c;
		return a;
}

int main() {
	int i1, i2, i3, i;
	cin >> i1 >> i2 >> i3;
	i = max(i1, i2, i3);
	cout << "max1=" << i << endl;

	double d1, d2, d3, d;
	cin >> d1 >> d2 >> d3;
	d = max(d1, d2, d3);
	cout << "max2=" << d << endl;

	long g1, g2, g3, g;
	cin >> g1 >> g2 >> g3;
	g = max(g1, g2, g3);
	cout << "max3=" << g << endl;

	return 0;
}

运行结果如下图:
在这里插入图片描述
定义函数模板的一般形式为:

template
通用函数定义


template
通用函数定义


🎶二、有默认参数的函数


一般情况下,在函数调用时形参从实参那里取得值,因此实参的个数应与形参相同。当用同样的实参多次调用同一函数时,C++提供了简单的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了。
1.如有一函数声明

float area(float r=6.5);

指定的默认值为6.5,如果在调用此函数时,确认r的值为6.5,则可以不必给出实参的
值,如

area();
//相当于area(6.5);
如果不想使形参取此默认值,则通过实参另行给出。如
area(7.5);
这种方法比较灵活,可以简化编程,提高运行效率。//形参得到的值为7.5,而不是6.5

2.如果有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分形参不指定默认值。如有一个求圆柱体体积的函数,形参h代表圆柱体的高,r为圆柱体半径。函数原型如下:

float volume(float h,float r=12.5);//只对形参r指定默认值12.5
函数调用可以采用以下形式:
volume(45.6);//相当于volume(45.6,12.5)

简单来个换汤不换药的例子:
求两个或三个正整数的最大数,用带有默认参数的函数实现。

#include<iostream>
using namespace std;
int max(int a, int b, int c = 0);
int main() {
	int a, b, c;
	cin >> a >> b >> c;
	cout << "max(a,b,c)=" << max(a, b, c) << endl;
	cout << "max(a,b)=" << max(a, b) << endl;
	return 0;
}
int max(int a, int b, int c) {
	if (b > a) a = b;
	if (c > a) a = c;
	return a;
}

运行结果如下图:
在这里插入图片描述


🎶三、局部变量和全局变量

(一)局部变量
在函数内部定义的变量是局部变量,它只是在本函数范围内有效,这就是局部变量
在这里插入图片描述

(二)全局变量
在函数内定义的变量是局部变量,而在函数之外定义的变量是外部变量,称为全局变量
在这里插入图片描述
变量的有效范围称为变量的作用域(scope)
归纳起来,变量有4种不同的作用域:文件作用域(file scope)、函数作用域(function scope)、块作用域(block scope)和函数原型作用域(function prototype scope)。文件作用域是全局的,其他三者是局部的。
除了变量之外,任何以标识符代表的实体(如函数、数组、结构体、类等)都有作用域,概念与变量的作用域类似。



🎶四、变量的存储类别

(一)动态存储方式和静态存储方式
动态存储方式:通过调用 new 和 delete 操作符在堆(heap)上动态分配和释放内存的方式。这种存储方式的变量生命周期由程序员控制,适用于需要灵活管理内存的情况。
静态存储方式:指在程序运行期间始终存在的存储方式。静态存储方式的变量在程序启动时分配空间,在程序结束时释放,其生命周期不受函数调用或程序块的限制。
(二)自动变量
自动变量是在函数内部声明的变量,默认存储类别为自动存储。它们在函数被调用时分配内存,在函数结束时释放内存。作用域仅限于声明它们的块或函数。
(三)用static声明静态局部变量
静态局部变量使用 static 关键字声明。与自动变量不同,静态局部变量在程序的整个执行过程中都存在,而不是仅在函数被调用时才存在。静态局部变量的生命周期从程序开始到结束,但作用域仅限于声明它们的函数内部。
(四)用register声明存储器变量
register 关键字用于声明寄存器变量,它建议编译器将该变量存储在CPU的寄存器中,以便快速访问。但是,现代编译器通常会忽略 register 关键字,因为编译器能够更好地优化寄存器的使用。
(五)用extern声明外部变量
extern 关键字用于声明一个变量是在其他文件中定义的全局变量。通过 extern 声明,可以在当前文件中引用其他文件中定义的全局变量,而无需重新定义它。
(六)用static声明静态外部变量
static 关键字还可以用于声明文件作用域的静态变量,这种变量的作用域仅限于声明它的文件。与普通的全局变量不同,静态外部变量只能在声明它的文件内部访问,其他文件无法访问。



🎶五、变量属性小结

一个变量除了数据类型以外,还有3种属性:
(1)存储类别:C++允许使用auto,static,register,extern4种存储类别。
(2)作用域:指在程序中可以引用该变量的区域。
(3)存储期:指变量在内存的存储周期。


请添加图片描述

结束语🥇

以上就是C++程序设计
持续更新C++程序设计教程,欢迎大家订阅系列专栏🔥C++程序设计你们的支持!

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值