函数签名是指函数的参数个数,参数类型以及参数的顺序。重载的定义是:在同一做用域内函数签名不一样但函数名相同的函数互为重载。函数
// 如下几个函数互为重载 void print(); void print(int a); void print(double a, int b); void print(int a, double b); void print(string a, double b);
参数的不一样也能够是经过const
区分的。this
// 如下两个函数一样造成函数重载 void print(int &a); void print(const int &a);
// 声明成员函数为const即指定this指针为const,一样能够构成重载 class LiF { public: void print(); void print() const; };
函数的形参名不一样或返回值类型不一样并不构成重载,而且编译报错,由于这类函数被编译器识别为相同函数。指针
// 重定义print,编译报错 void print(int a); void print(int b);
// 重定义print,编译报错 void print(int a); int print(int a);
在C++的编译期,编译器会根据参数列表对函数进行重命名,在函数名中按顺序加入参数类型以区分重载的函数。在函数调用时,则会根据实参类型逐个匹配重载的函数,失配则报错。也就是说,重载只是语法上的重载,重载的函数在编译后仍然是不一样的函数。这也就解释了为何只有函数签名不一样的函数才能构成重载。在编译完成以后,函数的重载也就肯定了。所以能够说,重载提供的多态性是静态的,或者说重载提供了编译期的多态性。code