当前位置: 首页 > 文档资料 > C++大学教程 >

3.5 函数定义

优质
小牛编辑
136浏览
2023-12-01

前面介绍的每个程序都有一个main函数,调用标准库函数完成工作。现在要考虑程序员如何编写自定义函数。

考虑一个程序,用自定义函数,square计算整数1到10的平方(如图3.3)。

// Fig. 3.3: fig03_03.cpp
// Creating and using a progra~er-defined function
#include 

int square( int );  // function prototype(函数原型)
int main()(
  for ( in x = 1; x <= 10; x++ )
  cout<< square( x ) <<  " "  ;

  cout << endl;
  return 0;
}

// Function definition(函数定义)
int square( int y )(
  return y * y;
}

输出结果:

1   4   9   16   25   36   49   64   81   1OO

图 3.3  生成和使用自定义函数

编程技巧3.2

在函数定义之间加上空行,分隔函数和提高程序可读性。

main中调用函数square如下所示:

square(x)

函数square在参数y中接收x值的副本。然后square计算y*y,所得结果返回main中调用square的位置,并显示结果,注意函数调用不改变x的值。这个过程用for重复结构重复十次。

square定义表示square需要整数参数y。函数名前面的关键字int表示square返回一个整数结果。square中的return语句将计算结果返回调用函数,第5行:

int square(int);

是个函数原型(functionprototype)。括号中的数据类型int告诉编译器,函数square要求调用者提供整数值。函数名square左边的数据类型int告诉编译器,函数square向调用者返回整数值。编译器通过函数原型检查square调用是否包含正确的返回类型、参数个数、参数类型和参数顺序。如果函数定义出现在程序中首次使用该函数之前,则不需要函数原型,这种情况下,函数定义也作为函数原型。如果图33中第17行到第20行在main之前,则第5行的函数原型是不需要的。函数原型将在第3.6节详细介绍。

函数定义格式如下:

return-value-type function-name(parameter-list){
  declarations and statements
}

函数名(function-name)是任何有效标识符,返回值类型(return-value-type)是函数向调用者返回值的数据类型,返回值类型void表示函数没有返回值。不指定返回值类型时默认为int。

常见编程错误3.2

如果函数原型指定返回类型不是int,则函数定义中省略返回值类型是个语法错误。

常见编程错误3.3

需要返回值的函数中不返回值是个语法错误。

常见编程错误3.4

返回类型声明为void的函数中返回值是个语法错误。

编程技巧3.3

尽管省略返回类型时默认为int,但最好显式指定返回类型。

参数表是逗号分隔的清单,包含函数被调用时接受的参数声明。如果函数不接受任何值,则参数表为void或空白。函数参数表中的每个参数应显式指定类型。

常见编程错误1.5

同类函数参数应声明为float x,float y而不是float x,y,参数声明float x、y实际上会报告编译错误,因为参数表中的每个参数应显式指定类型。

常见编程错误3.6

将分号放在函数定义中参数表的右括号之后是个语法槽误。

常见编程错误3.7

函数中再次把函数参数定义为局部变量是个语法错误。

编程技巧3.4

向函数传递参数和函数定义中的对应参数可以同名,但最好不要同名,以免引起歧义。

常见编程错误1.8

函数调用中的()实际上是C++中的运算符,使函数可以被调用。如果函数不取参数,则省略函数调用中的()并不是语法错误,但函数可能会在需要的时候不能调用。

花括号中的声明(declaration)和语句(statement)构成函数体(fuction body),函数体也称为块(block),块是包括声明的复合语句。变量可以在任何块中声明,而且块也可以嵌套。任何情况下不能在一个函数中定义另一个函数。

常见编程错误3.9

在一个函数中定义另一个函数是个语法错误。

编程技巧3.5

选择有意义的函数名和有意义的参数名能使程序更易读,避免大量使用注释语句。

软件工程视点3.5

函数应能放在一个编辑器窗口中。不管函数有多长,应该都能很好地完成一个任务。小函数能提高函数的复用性。

软件工程视点3.6

程序应写成一组小函数的集合.使得程序更容易编写、调试、维护和修改。

软件工程视点3.7

需要大量参数的函数可能要完成大量的任务。应把函数分成更小的函数来完成各个任务,函数的首部最好能在一行中放下。

常见编程错误3.10

如果函数原型、函数首部与函数调用的形参和实参的个数、类型、顺序以及返回值类型不相符,则是个语法错误。

将控制返回函数调用点的方法有三种。如果函数不返回结果,则控制在到达函数结束的右花括号时或执行下列语句时返回:

return;

如果函数返回结果,则下列语句:

return expression;

向调用者返回表达式的值。

第二个例子用自定义函数maximum确定和返回三个整数中的最大值(如图3.4)。输入三个整数,然后将整数传递到maximum中,确定最大值。这个值用maximum中的return语句返回main。返回的值赋给变量largest,然后打印。

// Fig. 3.4: fig0304.cpp
// Finding the maximum of three integers
#include 
int maximum( int, int, int );  // function prototype(函数原型)
int main( ){
  int a, b, c;
  cout << "Enter three integers: ";
  cin >> a >> b >> c;
  // a, b and c below are arguments to
  // the maximum function call(函数调用)
  cout << "Maximum is: "<< maximum( a, b, c ) << endl;
  return 0;
}
// function maximum definition
// x, y and z below are parameters to
// the maximum
function definition int maximum( int x, int y, int z ){
  int max = x;
  if ( z > max )
    max = z;
  return max;
}

输出结果:

Enter  three  integers:  22  85  17
Maximum  is:  85
Enter  three  integers:  92  35  14
Maximum  is:  92
Enter  three  integers:  45  19  98
Maximum  is:  98

图3.4  自定义函数maximum