C++中函数重载和函数模板的理解


第二遍看C++Primer Plus。。泪目啊。。C++真心难,第一遍是我一年前看的。现在再看感觉好像全新的一样。。。

好了,简单介绍下函数重载,学过编程的都对这个重载很熟悉了。函数重载的判断标识是它的函数参数列表,而不是返回值来判断的。所以像 

 
  1. long gronk(int n, float m);  
  2. double gronk(int , float m);  

是会报错的。这没有函数重载。

接下来是函数模板。

函数模板类似

 
  1. template<class Any>  
  2. void swap (Any &a, Any &b)  
  3. {  
  4.     Any temp;  
  5.     temp = a;  
  6.     a = b;  
  7.     b = temp;  
  8. }   

接下来介绍下函数模板里非常重要的具体化和实例化。

其实,在使用函数模板时,编译器会自动把模板实例化,称为隐式实例化,类似 

 void swap (int &a, int &b);  

就是实例化成了这样一个函数, 只不过是隐式的。

显示实例化类似

 template void swap<int>(int &a,int &b);  

显示具体化类似

 template <> void swap<int>(int &a,in t &b);  

两者的差别是template后面的括号。

具体化将会覆盖常规模板,非模板函数将会覆盖具体化和常规模板。

在我的理解就是,显式具体化和显示实例化都是讲某一特定类型的模板函数进行实例化,调用它们时将不会调用模板函数的定义。所以同一编程单元中,同一类型不能同时存在显示具体化和显示实例化。否则二义了。

好了,先介绍这里。明天开始我网络方面的可靠数据传输协议还要看看,C++的类和对象还要复习下,争取把const和引用的关系整理出来,也写一下。

相关阅读:

C++中函数建立临时变量的机制(const)

C Primer Plus(第五版)中文版[PDF+源代码]下载

相关内容