C++(三):函数(一)

2015-01-27 10:19:08 · 作者: · 浏览: 29

C++函数概述

一个较大的程序不可能完全由一个人从头至尾地完成,更不可能把所有的内容都放在一个主函数中。为了便于规划、组织、编程和调试,一般的做法是把一个大的程序划分为若干个程序模块(即程序文件),每一个模块实现一部分功能。不同的程序模块可以由不同的人来完成。在程序进行编译时,以程序模块为编译单位,即分别对每一个编译单位进行编译。如果发现错误,可以在本程序模块范围内查错并改正。在分别通过编译后,才进行连接,把各模块的目标文件以及系统文件连接在一起形成可执行文件。

在一个程序文件中可以包含若干个函数。无论把一个程序划分为多少个程序模块,只能有一个main函数。程序总是从main函数开始执行的。在程序运行过程中,由主函数调用其他函数,其他函数也可以互相调用。在C语言中没有类和对象,在程序模块中直接定义函数。可以认为,一个C程序是由若干个函数组成的,C语言被认为是面向函数的语言。C++面向过程的程序设计沿用了C语言使用函数的方法。在C++面向对象的程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以通过类对象调用类中的函数。无论是C还是C++,程序中的各项操作基本上都是由函数来实现的,程序编写者要根据需要编写一个个函数,每个函数用来实现某一功能。

函数”这个名词是从英文function翻译过来的,其实function的原意是“功能”。顾名思义,一个函数就是一个功能。

在实际应用的程序中,主函数写得很简单,它的作用就是调用各个函数,程序各部分的功能全部都是由各函数实现的。主函数相当于总调度,调动各函数依次实现各项功能。

开发商和软件开发人员将一些常用的功能模块编写成函数,放在函数库中供公共选用。程序开发人员要善于利用库函数,以减少重复编写程序段的工作量。

例3.1】在主函数中调用其他函数。

#include 
  
   
using namespace std;
void printstar(void)   //定义printstar函数
{
    cout<<″****************************** ″<
   
    运行情况如下:
    
******************************
Welcome to C++!
******************************

从用户使用的角度看,函数有两种:

    系统函数,即库函数。这是由编译系统提供的,用户不必自己定义这些函数,可以直接使用它们。用户自己定义的函数。用以解决用户的专门需要。
    从函数的形式看,函数分两类:
      无参函数。调用函数时不必给出参数。有参函数。在调用函数时,要给出参数。在主调函数和被调用函数之间有数据传递。

      C++函数的定义和调用

      定义无参函数的一般形式为:
      类型标识符 函数名([void])
      {
      声明部分
      语句
      }
      例3.1中的printstar和print_message函数都是无参函数,用类型标识符指定函数的类型,即函数带回来的值的类型。

      定义有参函数的一般形式为:
      类型标识符 函数名(形式参数表列)
      {
      声明部分
      语句
      }
      例如:
      int max(int x,int y)  //函数首部,函数值为整型,有两个整型形参
      {
          int z;  //函数体中的声明部分
          z=x>y?x:y; //将x和y中的大者的值赋给整型变量z
          return (z);//将z的值作为函数值返回调用点
      }

      C++函数参数和返回值

      形式参数和实际参数

      在调用函数时,大多数情况下,函数是带参数的。主调函数和被调用函数之间有数据传递关系。前面已提到:在定义函数时函数名后面括号中的变量名称为形式参数(formal parameter,简称形参),在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为实际参数(actual parameter,简称实参)。

      【例3.2】调用函数时的数据传递。
      #include 
             
              
      using namespace std;
      int max(int x,int y)  //定义有参函数max
      {
         int z;
         z=x>y?x:y;
         return(z);
      }
      
      int main( )
      {
         int a,b,c;
         cout<<"please enter two integer numbers:";
         cin>>a>>b;
         c=max(a,b);//调用max函数,给定实参为a,b。函数值赋给c
         cout<<"max="<
              
               运行情况如下:
               
      please enter two integer numbers:2 3?
      max=3

      有关形参与实参的说明:
      1) 在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参数,表示它们并不是实际存在的数据,只有在发生函数调用时,函数max中的形参才被分配内存单元,以便接收从实参传来的数据。在调用结束后,形参所占的内存单元也被释放。

      2) 实参可以是常量、变量或表达式,如max(3, a+b);但要求a和b有确定的值。以便在调用函数时将实参的值赋给形参。

      3) 在定义函数时,必须在函数首部指定形参的类型(见例3.2程序第3行)。

      4) 实参与形参的类型应相同或赋值兼容。例3.2中实参和形参都是整型,这是合法的、正确的。如果实参为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换。例如实参a的值为3.5,而形参x为整型,则将3.5转换成整数3,然后送到形参b。字符型与整型可以互相通用。

      5) 实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在调用函数时,编译系统临时给形参分配存储单元。

      请注意:实参单元与形参单元是不同的单元。图3.3表示将实参a和b的值2和3传递给对应的形参x和y。

      \
      调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。例如,若在执行max函数过程中形参x和y的值变为10和15,调用结束后,实参a和b仍为2和3,见图4.4。

      函数的返回值

      1) 函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。

      return语句后面的括号可以要,也可以不要。return后面的值可以是一个表达式。

      2) 函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。

      3) 如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准,即函数类型决定返回值的类型。对数值型数据,可以自动进行类型转换。

      C++函数的调用及函数原型

      函数调用的一般形式

      函数调用的一般形式为:
      函数名([实参表列]);
      如果是调用无参函数,则“实参表列”可以没有,但括号不能省略。如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配(相同或赋值兼容)。实参与形参按顺序对应,一对一地传递数据。但应说明,如果实参表列包括多个实参,对实参求值的顺序并不是确定的。

      函数调用的方式

      按函数在语句中的作用来分,可以有以下3种函数调用方式: 函数语句
      把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定的操作。如例3.1中的printstar( );函数表达式
      函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如c=2*max(a, b);函数参数
      函数调用作为一个函