函数重载
函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性。
C++的多态性又被直观地称为“一个名字,多个函数”。源代码只指明函数调用,而不说明具体调用哪个函数。编译器的这种连接方式称为动态联编或迟后联编。在动态联编中,直到程序运行才能确定调用哪个函数(动态联编需要虚函数的支持)。如果编译器在编译时,能根据源代码调用固定的函数标识符,并用物理地址代替它们,这就称为静态联编或先期联编。静态联编是在程序被编译时进行的。
函数模板
1.引入函数模版 由于函数在设计时没有使用实际的类型,而是使用虚拟的类型参数,故其灵活性得到加强。当用实际的类型来实例化这种函数时,就好像按照模版来制造新的函数一样,所以称这种函数为函数模板。将函数模版与某个具体数据类型连用,就产生了模板函数,又称这个过程为函数模板实例化,这种形式就是类型参数化。
template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表) { 函数体 }
使用显式规则和关键字typename C++专门定义一个仅仅用在模板中的关键字typename,它的用途之一是代替template参数列表中的关键字class。
template <typename T> //定义一个抽象的数据类型T T myMax(T a, T b) { //声明函数模板 return a > b ? a : b; } int main () { int a = 2; int b = 3; std::cout<<myMax(a, b)<<std::endl; //动态生成函数 int myMax(int , int) float c = 2.0f; float d = 3.0f; std::cout<<myMax(c, d)<<std::endl; //动态生成函数 flota myMax(float, float) }
2.函数模板的参数 对于一个默认调用,能从函数参数推断出模板参数的能力是其中最关键的一环。要想省去显式调用的麻烦,条件是由这个调用的函数参数表能够惟一地标识出模板参数的一个集合。
类模板
有函数当然就有类模板,格式为template <类模板参数> class 类名{//类体};
template<class 形参名,class 形参名,…> class 类名 { ... };
类模板定义对象的一般格式如下:
类名<模板实例化参数类型> 对象名(构造函数实参列表);
类名<模板实例化参数类型> 对象名;//默认或者无参数构造函数