3.5 函数定义
前面介绍的每个程序都有一个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