C++从零开始(七)――何谓函数(二)

2014-11-24 13:20:07 · 作者: · 浏览: 40
数执行后都要返回一个数字(后面将说明),而对于不用返回数字的函数,则可以定义返回类型为void,这样就可以保证语法的严密性。应当注意,任何类型的数字都可以转换成void类型,即可以( void )( 234 );或void( a );。
注意上面函数修饰符中可以一个抽象修饰符都没有,即void ABC();。它等效于void ABC( void );,表示ABC这个函数没有参数且不返回值。则它们的抽象声明符为void()或void(void),进而可以如下:
long* ABC( long*(), long(), long[10] );
由函数修饰符的意义即可看出其和引用修饰符一样,不能重复修饰类型,即不能void A()(long);,这是无意义的。同样,由于类型修饰符从左朝右的修饰顺序,也就很正常地有:void(*pA)()。假设这里是一个变量定义语句(也可以看成是一声明语句,后面说明),则表示要求编译器在栈上分配一块4字节的空间,将此地址和pA映射起来,其类型为没有参数,返回值类型为void的函数的指针。有什么用?以后将说明。


函数定义

下面先看下函数定义,对于前面的机器手控制程序,可如下书写:
void Move( float x, float y, float z )
{
float temp;
// 根据x、y、z的值来移动焊枪
}
int main()
{
float x[200], y[200], z[200];
// 将200个点的坐标放到数组x、y和z中
for( unsigned i = 0; i < 200; i++ )
Move( x[ i ], y[ i ], z[ i ] );
return 0;
}
上面定义了一个函数Move,其对应的地址为定义语句float temp;所在的地址,但实际由于编译器要帮我们生成一些附加代码(称作函数前缀――Prolog,在《C++从零开始(十五)》中说明)以获得参数的值或其他工作(如异常的处理等),因此Move将对应在较float temp;之前的某个地址。Move后接的类型修饰符较之前有点变化,只是把变量名加上以使其不是抽象声明符而已,其作用就是让编译器生成一映射,将加上的变量名和传递相应信息的内存的地址绑定起来,也就形成了所谓的参数。也由于此原因,就能如此书写:void Move( float x, float, float z ) { }。由于没有给第二个参数绑定变量名,因此将无法使用第二个参数,以后将举例说明这样的意义。
函数的定义就和前面的函数的声明一样,只不过必须紧接其后书写一个复合语句(必须是复合语句,即用“{}”括起来的语句),此复合语句的地址将和此函数名绑定,但由于前面提到的函数前缀,函数名实际对应的地址在复合语句的地址的前面。
为了调用给定函数,C++提供了函数操作符“()”,其前面接函数类型的数字,而中间根据相应函数的参数类型和个数,放相应类型的数字和个数,因此上面的Move( x[ i ], y[ i ],