c++函数模板和类模版

模版
         C++ 提供了函数模板 (function template) 所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
 
1 C++ 提供两种模板机制: 函数模板、类模板
2 )类属 —— 类型参数化 ,又称参数模板
使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。
总结:
模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属。
模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。
 

#include <iostream>
using namespace std;
//函数模板
//template关键字<类型参数 可以有多个  逗号隔开>  函数返回值类型  函数名 (形参)
template < typename T , typename K > //模板头
void Swap(T& a, K& b) {
    T temp = a;
    a = b;
    b = temp;
}
template < typename T> //模板头
void mySwap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}
int main(){
    //交换 int 变量的值
    int n1 = 100, n2 = 200;
   
    Swap(n1, n2);
    mySwap< int >(n1,n2);
    //当函数调用能自动推导出 T K U所有的类型 可以在函数调用时省略<>
    mySwap(n1, n2);
    //交换 float 变量的值
    float f1 = 12.5, f2 = 56.93;
    Swap(f1, f2);
    cout << f1 << ", " << f2 << endl;
    //交换 char 变量的值
    char c1 = 'A' , c2 = 'B' ;
    Swap(c1, c2);
    cout << c1 << ", " << c2 << endl;
    //交换 bool 变量的值
    bool b1 = false , b2 = true ;
    Swap(b1, b2);
    cout << b1 << ", " << b2 << endl;
    return 0;
}


类模版
  • 类模板用于实现类所需数据的类型参数化
  • 类模板在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响


// 类的类型参数化 抽象的类
// 单个类模板
template<typename T>
class A
{
public:
      A(T t)
      {
            this->t = t;
      }
 
      T &getT()
      {
            return t;
      }
protected:
public:
      T t;
};
{
   // 模板了中如果使用了构造函数 , 则遵守以前的类的构造函数的调用规则
      A<int>  a(100);
      a.getT();
      printAA(a);
      return ;
}

构造函数 没有问题
普通函数 没有问题
友元函数:用友元函数重载 << >>
friend ostream& operator<< <T> (ostream &out, Complex<T> &c3) ;
友元函数:友元函数不是实现函数重载(非 << >>
1 )需要在类前增加 类的前置声明 函数的前置声明
                 template < typename T>
class Complex; 
template < typename T>
Complex<T> mySub(Complex<T> &c1, Complex<T> &c2);
 
2 )类的内部声明 必须写成 :
friend Complex<T> mySub <T> (Complex<T> &c1, Complex<T> &c2);
3 )友元函数实现 必须写成:
                       template < typename T>
         Complex<T> mySub(Complex<T> &c1, Complex<T> &c2)
  {
           Complex<T> tmp(c1.a - c2.a, c1.b-c2.b);
           return tmp;
         }
4 )友元函数调用 必须写成
                       Complex< int > c4 = mySub <int> (c1, c2);
         cout<<c4;
结论:友元函数最好只用来进行 左移 友移操作符重载。
小结:
  • 模板是C++类型参数化的多态工具。C++提供函数模板和类模板。
  • 模板定义以模板说明开始。类属参数必须在模板定义中至少出现一次。
  • 同一个类属参数可以用于多个模板。
  • 类属参数可用于函数的参数类型、返回类型和声明函数中的变量。
  • 模板由编译器根据实际数据类型实例化,生成可执行代码。实例化的函数模板称为模板函数;实例化的类模板称为模板类。
  • 函数模板可以用多种方式重载。
  • 类模板可以在类层次中使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值