模板类与类模板的区别以及模板类的友元重载

本文探讨了模板类与类模板的区别,指出类模板是一种模式,可生成针对不同类型的类,而模板类是类模板实例化的结果。类模板如同制作饼干的模子,实例化时的类型决定最终类的特性。同时,文章还介绍了模板类中的友元重载,揭示了如何在模板类中实现友元函数的灵活性。

1、模板类与类模板的区别

一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默认成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。
如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。

模板类是类模板实例化后的一个产物。!!!说个形象点的例子吧。我们把类模板比作一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做豆沙饼干,这些饼干的除了材料不一样外,其他的东西都是一样的了。

另外:函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。模板函数的生成就是将函数模板的类型形参实例化的过程。

2、模板类的友元重载

#include <iostream>
using namespace std;

template <class T>
class Test;//声明

template <class T>
ostream& operator<<(ostream& out,const Test<T> &obj);//声明

template <class T>
class Test
{
private:
    int num;
public:
    Test(int n=0){num=n;}
    Test(const Test <T> & copy){num=copy.num;}
    //将模板类的重载函数,声明为友元
    friend ostream& operator<< <>(ostream& out,const Test<T> &obj); 
    //在<<后加上<>表明这是个函数模板!!!
};

template <class T>
ostream& operator<<(ostream& out,const Test<T> &obj)
{//对操作符“<<”重载
    out<<obj.num;
    return out;
}

int main()
{
    Test<int> tt;
    cout<<tt;//对操作符“<<”重载后,使之可以接受类的对象,进而输出其数据
             //成员
    cout<<endl;
    Test<int> t(2);
    cout<<t;

    return 0;
}

结果:

0
2
Process returned 0 (0x0)   execution time : 0.189 s
Press any key to continue.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值