👨💻个人主页:@开发者-削好皮的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++程序设计你们的支持!