函数由函数名、参数个数、参数类型、返回值和调用方式等组成。
函数签名:把函数名去掉之后函数的剩余部分(参数个数、参数类型、返回值和调用方式等)。
顶层函数:在类之外声明并定义的函数称为顶层函数。
成员函数:在类的声明中声明的函数称为类的成员函数。
重载:如果顶层函数有不同的参数,它们的函数名可以相同;在一个类中,成员函数可以有相同的函数名,只要它们的函数签名不同即可,我们将这种情况成为重载。
重载与编译期绑定相对应,不管是成员函数还是顶层函数。
多态函数指的是在运行期进行绑定的函数,在C++中,仅有虚函数是在运行期进行绑定的,因此仅有虚函数才具有真正意义上的多态。
代码用例如下
class C{
public:
C(){/*...*/} //default constructor
C(int x){/*...*/} //convert constructor
};
void f(double d){/*...*/}
void f(char c){/*...*/}
int main(){
C c1; //default constructor called
C c2(26); //convert constructor called
f(3.14); //f(double d) called
f('Z'); //f(char c) called
//...
}
在上面的代码段中,有两个名为f的顶层函数和两个名为c的构造函数。对于这四个函数而言,编译器使用的都是编译期绑定。编译器依据函数签名来进行绑定,因此由于创建对象c1时没有指定初值,编译器调用默认构造函数,而创建对象c2时指定了一个整型的初值,编译器调用转型构造函数。
同样,编译器将下面的调用
f(3.14);
绑定到以单个double型为参数的f函数上,而对调用
f('Z');
则绑定到以单个字符char型为参数的f函数上。
在进行重载时,总是使用编译期绑定,在这方面重载函数(不管是成员函数还是顶层函数)和虚函数是截然不同的,虚函数总是在运行期绑定的。