博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++函数声明和定义
阅读量:4303 次
发布时间:2019-05-27

本文共 2197 字,大约阅读时间需要 7 分钟。

在上一节,我们已经学会了如何阅读函数原型和如何调用一个函数。然而,仅靠系统给出的标准库函数是不够用的。我们有时候要根据我们的实际要求,写出一个合适自己使用的函数。

那么,我们如何来自己动手编写一个函数呢?


首先,我们要告诉电脑,我们自己编写了一个函数,即这个函数是存在的,这叫作函数的声明(Declaration)。其次,我们要告诉电脑这个函数是怎么运作的,这叫作函数的定义(Definition)。显然,函数的声明和函数的定义是两个不同的概念。
声明表示该函数存在,而定义则是表示该函数怎么去运行。


我们平时做事都是要有先后顺序的,如果把次序颠倒了可能会惹些麻烦出来。编写函数的时候也一样。我们必须在调用一个函数之前就告诉电脑这个函数已经存在了,否则就成了“马后炮”。
所以,我们一般把函数的声明放在主函数前面。

函数的声明

在C++中,函数原型就是函数的声明。所以,函数原型除了向用户说明如何使用一个函数以外,还告诉电脑存在这样一个可以使用的函数。


我们已经介绍了函数原型的结构,只不过“产生结果类型”这个名称是为了方便理解而起的。它应该称为“返回值类型”,用任意一种数据类型来表示,比如int或者char等等,当然还包括空类型void。多个参数则构成了“参数表”,表示运行这个函数需要哪些数据。于是,函数原型的结构就是:

  
  返回值类型函数名(参数表);

函数声明同变量的声明一样,是一句语句。所以在语句结束要加上分号。函数名、参数名的规则和注意事项同变量名一样。


关于“返回”的概念稍后再作介绍,我们先来说说参数表。我们知道,在声明函数的时候,会写一些参数,而在调用函数的时候需要一一对应地填入这些参数。虽然它们都叫参数,但在不同的情况下,它们的含义是不同的。
在声明一个函数的时候,参数是没有实际值的,只是起到一个占位的作用,所以称为形式参数,简称“形参”;在调用一个函数的时候,参数必须有一个确定的值,是真正能够对结果起作用的因素,所以称为实际参数,简称“实参”。
我们拿数学中的函数作为例子,g(x,y)=x/4+y中的x和y就是形式参数,而g(4,1)=4/4+1=2中的4和1就是实际参数;如果令a=4、b=1,那么g(a,b)中的a和b也是实际参数。

函数的定义

说完了函数的声明,我们来说函数的定义。其实函数的定义对大家来说是比较熟悉的。因为我们之前所写的程序都是对主函数的定义。函数定义的格式为:

没有分号结尾的函数原型
{
    语句块;
}


我们把函数定义中没有分号结尾的函数原型称为函数头,把之后的语句块称为函数体。任何一个函数的定义不能出现在另一个函数体内。但函数体内可以调用任何一个函数,包括其本身。

下面我们先来看一个例子,你就会对函数定义有些了解了。(程序6.2.1)




运行结果:

5

程序在运行的时候从main函数开始,遇到调用一个用户定义的函数max,则去查找这个max函数的定义,然后运行max函数。运行完了以后,回到调用max函数的地方,继续后面的语句,直到程序结束。所以整个程序的运行过程如箭头所示。

不要使用相同的变量和参数

如果在一个班级里有两个同名同姓的同学,那么老师上课点名将是件麻烦事。因为大家都搞不清到底是在叫谁。可是,如果两个不同的班级有两个同名同姓的同学,就不会发生这种尴尬,因为老师在不同的教室点相同的名字,会有反应的只有一个同学。


我们把这个问题套用到函数上来。如果在同一个函数有两个名字相同的变量,那么电脑将无法分清到底要使用哪个变量,导致错误发生。而在不同的函数中,即使有相同名称的变量,由于在某一个函数中该变量的名称是唯一的,电脑也能方便的识别要使用哪个变量。因此,我们得到这样一个结论:
一般情况下,在同一个函数中,不能有名称相同的变量或参数;在两个不同的函数中,可以有名称相同的变量或参数。


下面就让我们来看一个实例:(程序6.2.2)

#include "iostream.h"

int max(int a,int b,int c);//求三个整数的最大者

int min(int a,int b,int c);//求三个整数的最小者

void output(int a);//输出功能

int main()

{

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

   output(max(a,b,c));//把max函数的返回值作为output函数的实参

   output(min(a,b,c));

   return 0;

}

int max(int a,int b,int c)//不在同一个函数中,参数名重复没关系

{

   if (a>=b && a>=c) return a;

   if (b>=a && b>=c) return b;

   return c;//一旦执行了前面的return,这句就不会被执行到

}

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

{

   if (a<=b && a<=c) return a;

   if (b<=a && b<=c) return b;

   return c;

}

void output(int a)

{

   cout <<a <<endl;

   return;//返回空类型

}

运行结果:

4

2

要注意,一旦函数运行结束,那么该函数中声明的参数和变量都将消失。就像下课了,同学们都回家了,老师叫谁都是叫不应的。

转载地址:http://zilws.baihongyu.com/

你可能感兴趣的文章
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Mysql出现Table 'performance_schema.session_status' doesn't exist
查看>>
MySQL innert join、left join、right join等理解
查看>>
vivado模块封装ip/edf
查看>>
sdc时序约束
查看>>
Xilinx Jtag Access/svf文件/BSCANE2
查看>>
NoC片上网络
查看>>
开源SoC整理
查看>>
【2020-3-21】Mac安装Homebrew慢,解决办法
查看>>
influxdb 命令行输出时间为 yyyy-MM-dd HH:mm:ss(年月日时分秒)的方法
查看>>
已知子网掩码,确定ip地址范围
查看>>
判断时间或者数字是否连续
查看>>
docker-daemon.json各配置详解
查看>>
Docker(一)使用阿里云容器镜像服务
查看>>
Docker(二) 基础命令
查看>>
Docker(三) 构建镜像
查看>>
Spring 全家桶注解一览
查看>>
JDK1.8-Stream API使用
查看>>
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
查看>>
vue中的状态管理 vuex store
查看>>