C++ 05模板

模板技术

C++中一种代码复用技术

1.函数模板

函数模板针对仅参数类型不同的函数,对仅参数不同的函数进行代码复用

基本语法形式
template <typename T> //typename 可以替换成class
T add(T a,T b)
{
    return (a+b);
}

2.类模板

类模板针对仅数据成员和成员函数类型不同的类,对仅参数不同的类进行代码复用

基本语法形式
template <typename T>    //typename 可以替换成class
class Array
{
private:
    T *data;
    int len;
    int index;
public:
    Array(int len=20)
    {
        data=new T[len];
        this->len=len;
        this->index=-1;                
    }
    T at(int index)
    {
        if(index<0 || index > this->index)
        {
            return -1;        
        }    
        return data[index];
    }
}

eg:

using namespace std;

#if 1
template <typename T>
class A
{
private:
    T val;

public:
    A(T x = 0) : val(x)            //构造函数
    {
    }
    void set_val(T x)                //普通成员函数
    {
        val = x;
    }
    void print_val()            
    {
        cout << "val:" << val << endl;
    }

    A operator+(const A &obj)        
    {
        return A(this->val + obj.val);
    }


    //通过友元函数 实现运算符重载 方法2
    template <typename T2>
    friend ostream &operator<<(ostream &out, const A <T2> &obj);

#if 0
    //通过友元函数 实现运算符重载 方法1
    friend ostream& operator<<(ostream &out, const A &obj)
    {
        out<<obj.val;
        return out;
    }
#endif
};
#endif

template <typename T>
ostream &operator<<(ostream &out, const A <T> &obj)
{
    out << obj.val;
    return out;
}
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
#if 0
template <typename T>
class A                //分开写的方法
{
private:
    T val;
public:
    A(T x = 0 );
    void set_val(T x);
    void print_val();
};

template <typename T>
A<T>::A(T x ): val(x)
{

}

template <typename T>
void A<T>::set_val(T x)
{
    val = x;
}

template <typename T>
void A<T>::print_val()
{
    cout << "val:" << val << endl;
}
#endif

int main(void)
{

#if 0
    A<int> a1(34);
    A<double> a2(6.4);

    a1.print_val();
    a2.print_val();
#endif

    A<int> a1(34);

    A<int> a2(84);

    A<int> a3 = a1 + a2;
    a3.print_val();

    cout << a3 << endl; //   operator<<(cout,a3)

    A<double> a4(33.3);

    
    cout << a4 << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值