函数简介


到目前为止都只使用一个函数(Function),也就是main主函数,若某些代码经常使用,可以抽出成为新函数以便重复调用,函数用来将程序组织为一个小的、独立的运行单元,一个函数可以接受数据,并运行其中的算法,最后将结果返回。

函数的组成主要包括四个部份:返回值、函数名称、参数列与函数主体。前三者称为函数定义或函数原型(Function prototype),在 C++ 中规定,如果函数是在main之后实现,必须在main之前进行定义,否则会出现编译错误。

函数原型定义了函数的外观,通常定义在独立的标头文件,而被含入每个想调用函数的文件中,以下是一个函数定义的范例:

math.h

int pow2(int); 
int pow(int, int);

如果函数不返回任何值,则定义为void,若不传入任何实参,参数列保持空白即可,虽然也可以使用void来加以注明,不过void注明参数列不使用其实是 C 的风格,而在 C++ 中,参数列空白就表示这个函数不接受任何实参。

标头文件被存储为 .h 文件,接着可以根据函数原型来实现函数主体,例如:

math.cpp

#include "math.h"

int pow2(int num) { 
    return num * num; 
} 

int pow(int n, int p) { 
    int r = 1; 

    for(int i = 0; i < p; i++) {
        r *= n;
    }

    return r; 
}

在含入标头文件时,若标头文件与含入标头文件的文件在同一目录,就使用双引号""来包括标头文件名称,如果是标准或项目专属的标头文件,例如 C++ 的标准头文件,那么使用大括号<>来括住,编译器在寻找时就会从设定的目录寻找。

接着可以在含入标头文件后,直接调用定义的函数。例如:

main.cpp

#include <iostream>
#include "math.h"
using namespace std;

int main() {
    int num = 0;
    int power = 0; 

    cout << "输入数值:"; 
    cin >> num; 

    cout << "输入次方:"; 
    cin >> power; 

    cout << num << " 平方:" << pow2(num) << endl
         << num << " 的 " << power << " 次方:" 
         << pow(num, power) 
         << endl; 

    return 0;
}

执行结果:

输入数值:10
输入次方:2
10 平方:100
10 的 2 次方:100

在编译时期,编译器会检查被调用的函数,若无法根据函数名称、提供的实参类型与函数定义上参数类型来决定被调用的函数,会出现编译错误,这就是必须先作函数定义的原因,这对编译器的检查工作是必要的数据,手动编译指令的方式如下:

g++ -c math.cpp -o math.o
g++ -c main.cpp -o main.o
g++ math.o main.o -o main.exe




展开阅读全文