C++类模板

C++类模板和模板类

类模板

所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表。使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从而实现了不同类的功能。

定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括起来的模板参数,然后是类名,其格式如下:

template <typename 类型参数>
class 类名{
       类成员声明 
};

或者

template <class 类型参数>
class 类名{
       类成员声明 
};

(1)template:是一个声明模板的关键字,它表明声明一个模板
(2)类型参数:通常用C++标识符表示,如T、Type等,实际上是一个虚拟的类型名,现在未指定它是哪一种具体的类型,但使用类模板时,必须将类型参数实例化。

(3)typename和class的作用相同,都是表示其后面的参数是一个虚拟的类名(即类型参数).

在类声明中,欲采用通用数据类型的数据成员、成员函数的参数或返回类型前面需要加上类型参数。

如建立一个用来实现求两个数最大值的类模板

template<typename T>    //模板声明,其中T为类型参数
    class Compare{
      public:
       Compare(T i,T j)
       {
        x = i;
        y = j;
       }
       T max()
       {
        return (x>y)?x:y;
       } 
      private:
       T x,y; 
    };

用类模板定义对象时,形式为:
类模板名<实际类型名>对象名[(实参表列)];举例如下:

#include <iostream>

using namespace std;
template<typename T>
class compare{
public:
    compare(T i, T j)
    {
        x=i;y=j;
    }
    T max(){
        return (x>y)?x:y;
    }
private:
    T x,y;
};

int main()
{
    compare<int>com1(3,2);
    compare<double>com2(12.34,56.78);
    compare<char>com3('a','x');
    cout<<"1  "<<com1.max()<<endl;
    cout<<"2  "<<com2.max()<<endl;
    cout<<"3  "<<com3.max()<<endl;

    return 0;
}

类模板中的成员函数,可以在类模板外定义,如果成员函数中有参数类型存在,那么:

  • 需要在成员函数定义前进行模板声明
  • 在成员函数名前加上 类名<类型参数>
    举例如下:
template<typename 类型参数>
  函数类型  类名<类型参数>::成员函数名(形参表)
  {
  函数内容;
  }

具体如下:

#include <iostream>

using namespace std;
template<typename T>
class compare{
public:
    compare(T i, T j)
    {
        x=i;y=j;
    }
    T max();
private:
    T x,y;
};
template <class T>
T compare<T>::max()
{
    return (x>y)?x:y;
}
int main()
{
    compare<int>com1(3,2);
    compare<double>com2(12.34,56.78);
    compare<char>com3('a','x');
    cout<<"1  "<<com1.max()<<endl;
    cout<<"2  "<<com2.max()<<endl;
    cout<<"3  "<<com3.max()<<endl;

    return 0;
}

当有多个参数时,举例如下:

#include <iostream>

using namespace std;
template<typename QQ, typename T>
class Myclass{
public:
    Myclass(QQ a ,T b);
    void show();
private:
    QQ x;
    T y;
};

template <typename QQ, typename T>
Myclass<QQ,T>::Myclass(QQ a, T b)
{
    x=a;
    y=b;
}
template <typename QQ, typename T>
void Myclass<QQ,T>::show()
{
    cout<<"x= "<<x<<" y= "<<y<<endl;
}
int main()
{
    Myclass<int ,double>m1(20,0.25);
    Myclass<int,char*>m2(20,"test.");

    m1.show();
    m2.show();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值