后台开发:核心技术与应用实践1.2 函数

简介:

1.2 函数


1.?函数的定义


一个C程序是由若干个函数组成的,C语言被认为是面向函数的语言,而C++面向过程的程序设计也沿用了C语言使用函数的方法。在C++面向对象的程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以通过类对象调用类中的函数。无论是C还是C++,程序中的各项操作基本上都是由函数来实现的,程序编写者要根据需要编写一个个函数,每个函数用来实现某一功能。因此,读者必须掌握函数的概念以及学会使用和设计函数。

定义函数的一般格式是:

返回值类型 函数名([形参])

{

    函数体

}

在定义函数时函数名后面括号中的变量名称是形参。在主调中调用一个函数时,函数名后面括号中的参数是实参。

【例1.2】 函数、形参、实参的使用举例。

#include<iostream>

using namespace std;

int min(int a,int b){              // 这里的min就是函数名,a、b是形参,

                                  // 返回值是一个int整型

    if(a<b)return a;

    else return b;

}

int main(){

    int a=10,b=1;

    cout<<min(a,b)<<endl;            // 这里的a、b是实参

    return 0;

}

函数的执行结果是:

1

例1.2中定义了一个函数,有2个整型的参数,且返回值是整型的,在main函数中调用min函数时,传入的是实参。

形参与实参的区别是:形参只有被调用时才分配内存单元,在调用结束时,立即释放所分配的内存单元。实参与形参的类型应相同或赋值兼容。

2.?函数重载

C++允许用同一函数名定义多个函数,但这些函数必须参数个数不同或类型不同,这就是函数重载。例1.3说明了函数重载的使用方法。

【例1.3】 求不同类型的数中的最小者。

#include<iostream>

using namespace std;

int min(int a, int b, int c){

    if(a>b)a=b;

    if(a>c)a=c;

    return a;

}

long long min(long long a,long long b, long long c){

                                  // 与上面那个函数的差别是参数的类型不同

    if(a>b)a=b;

    if(a>c)a=c;

    return a;

}

double min(double a, double b){      // 这个函数与以上的差别是只有2个参数

    if(a-b>(1e-5))a=b;

    return a;

}

int main(){

    int a=1,b=2,c=3;

    cout<<min(a,b,c)<<endl;

    long long a1=100,b1=200,c1=300;

    cout<<min(a1,b1,c1)<<endl;

    double a2=1.1,b2=2.2;

    cout<<min(a2,b2)<<endl;

    return 0;

}

程序的执行结果是:

1

100

1.1

这里分别需要比较3个整数、3个长整数和2个浮点数,并获得各组中的最小值。例1.3中分别定义了3个函数,而且函数名都是一样的,不过参数个数不一样或者参数类型不一样,这就是使用了函数重载来实现功能。

在使用函数重载时,同名函数的功能应当相同或相近,不要用同一函数名去实现几个完全不相干的功能,这样虽然程序能运行,但是可读性不好,会让人觉得莫名其妙。

3.?函数模板

函数模板,实际上是建立一个通用函数,其函数类型和形参不具体指定,而用一个虚拟的类型来代表,这个通用函数就是函数模板。凡是函数体相同的函数都可以用这个模板来代替,而不用定义多个函数,实际使用时只需在模板中定义一次就可以了。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。

定义函数模板的一般格式是:

template<typename T>

下面的程序说明了函数模板的使用方法。

【例1.4】 函数模板使用举例。

#include<iostream>

using namespace std;

template<typename T>

T min(T a,T b,T c){

    if(a>b)a=b;

    if(a>c)a=c;

    return a;

}

int main(){

    int a=1,b=2,c=3;

    cout<<min(a,b,c)<<endl;

    long long a1=1000000000,b1=2000000000,c1=3000000000;

    cout<<min(a1,b1,c1)<<endl;

    return 0;

}

程序输出结果:

1

1000000000

例1.4中定义了一个函数模板,用来获得3个数中的最小者。若传入3个整型的,函数就将虚拟类型T转成int去执行;若传入3个长整型的,函数就将T转化成long long去执行。这样就可以不用定义类型不同的函数了,只需一个函数模板即可搞定。

在编写函数模板时,可以先写一个函数,然后把其中的变量类型都替换成虚拟类型即可。可以看到,用函数模板比函数重载更方便,但是它只适用于函数个数相同而类型不同的情况。

相关文章
|
2月前
|
新零售 供应链 数据挖掘
推三返一系统开发|成熟案例|源码部署
“新零售”的商业生态构建将涵盖网上页面
|
前端开发 算法
如何玩转新技术栈!高德大前端演进历程
高德技术开放日已经顺利落幕,我们准备了精彩的视频回放。这次放出的是由高德工程技术中心 郭忍东 为大家带来的《如何玩转新技术栈!高德大前端演进历程》。
663 0
如何玩转新技术栈!高德大前端演进历程
|
前端开发
|
机器学习/深度学习 存储 算法
前端智能化实践——可微编程
研究者表示,由于广泛的科学计算和机器学习领域在底层结构上都需要线性代数的支持,因此有可能以可微编程的形式,创造一种新的编程思想。下面,我们就一起进入这个全新的领域。
284 0
前端智能化实践——可微编程
|
前端开发 JavaScript 关系型数据库
5 个可以拓展全栈技能的开源项目
在过去的几年里,开源项目一直是现代 WEB 开发背后的重要驱动力,刚开始,jQuery 可以说是世界上最受欢迎的项目。
422 0
5 个可以拓展全栈技能的开源项目
|
SpringCloudAlibaba 监控 Java
getway极简落地入门
在spring cloud netflix时使用zuul作为官网,但是随着zuul2.0的多次跳票和getway异军突起。getway已经是一款主流的产品了,同时springcloud alibaba官网的推荐网关也是getway,所以在选型时不需要犹豫。干就完了。同时getway使用了webflux,较第一代网关更优秀。
395 0
getway极简落地入门
|
开发者 容器 机器学习/深度学习
来,你认为应用架构的核心使命是什么? | 开发者必读(053期)
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》!
894 0