2025年4月1日 星期二 乙巳(蛇)年 正月初二 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

C++函数模板的重载

时间:01-05来源:作者:点击数:844

当需要对不同的类型使用同一种算法(同一个函数体)时,为了避免定义多个功能重复的函数,可以使用模板。然而,并非所有的类型都使用同一种算法,有些特定的类型需要单独处理,为了满足这种需求,C++ 允许对函数模板进行重载,程序员可以像重载常规函数那样重载模板定义。

在《C++函数模板》一节中我们定义了 Swap() 函数用来交换两个变量的值,一种方案是使用指针,另外一种方案是使用引用,请看下面的代码:

  • //方案①:使用指针
  • template<typename T> void Swap(T *a, T *b){
  • T temp = *a;
  • *a = *b;
  • *b = temp;
  • }
  • //方案②:使用引用
  • template<class T> void Swap(T &a, T &b){
  • T temp = a;
  • a = b;
  • b = temp;
  • }

这两种方案都可以交换 int、float、char、bool 等基本类型变量的值,但是却不能交换两个数组。

对于方案①,调用函数时传入的是数组指针,或者说是指向第 0  个元素的指针,这样交换的仅仅是数组的第 0 个元素,而不是整个数组。数组和指针本来是不等价的,只是当函数的形参为指针时,传递的数组也会隐式地转换为指针,这在《C语言入门教程》中的《数组和指针绝不等价,数组是另外一种类型》《数组在什么时候会转换为指针》两节中做了详细讲解,不了解的读者请猛击链接深入学习。

对于方案②,假设传入的是一个长度为 5 的 int 类型数组(该数组的类型是 int [5]),那么 T 的真实类型为int [5]T temp会被替换为int [5] temp,这显然是错误的。另外一方面,语句a=b;尝试对数组 a 赋值,而数组名是常量,它的值不允许被修改,所以也会产生错误。总起来说,方案②会有两处语法错误。

交换两个数组唯一的办法就是逐个交换所有的数组元素,请看下面的代码:

  • template<typename T> void Swap(T a[], T b[], int len){
  • T temp;
  • for(int i=0; i<len; i++){
  • temp = a[i];
  • a[i] = b[i];
  • b[i] = temp;
  • }
  • }

在该函数模板中,最后一个参数的类型为具体类型(int),而不是泛型。并不是所有的模板参数都必须被泛型化。

下面是一个重载函数模板的完整示例:

  • #include <iostream>
  • using namespace std;
  • template<class T> void Swap(T &a, T &b); //模板①:交换基本类型的值
  • template<typename T> void Swap(T a[], T b[], int len); //模板②:交换两个数组
  • void printArray(int arr[], int len); //打印数组元素
  • int main(){
  • //交换基本类型的值
  • int m = 10, n = 99;
  • Swap(m, n); //匹配模板①
  • cout<<m<<", "<<n<<endl;
  • //交换两个数组
  • int a[5] = { 1, 2, 3, 4, 5 };
  • int b[5] = { 10, 20, 30, 40, 50 };
  • int len = sizeof(a) / sizeof(int); //数组长度
  • Swap(a, b, len); //匹配模板②
  • printArray(a, len);
  • printArray(b, len);
  • return 0;
  • }
  • template<class T> void Swap(T &a, T &b){
  • T temp = a;
  • a = b;
  • b = temp;
  • }
  • template<typename T> void Swap(T a[], T b[], int len){
  • T temp;
  • for(int i=0; i<len; i++){
  • temp = a[i];
  • a[i] = b[i];
  • b[i] = temp;
  • }
  • }
  • void printArray(int arr[], int len){
  • for(int i=0; i<len; i++){
  • if(i == len-1){
  • cout<<arr[i]<<endl;
  • }else{
  • cout<<arr[i]<<", ";
  • }
  • }
  • }

运行结果:

99, 10
10, 20, 30, 40, 50
1, 2, 3, 4, 5
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门