3.5 C++高级编程_类模板

对于代码相似的函数,我们可以使用函数模板

类似的,对于那些代码相似的,我们也可以使用类模板

类模板

修改代码,首先声明一个类模板AAA。

template<typename T>
class AAA {
private:
    T t;
public:
    void test_func(const T &t);
    void print(void);
};

这个类模板中有一个私有成员t,它的数据类型由传入的模板参数T决定。

还有两个公有的成员函数test_func和print。

分别实现这两个函数。

test_func函数

设置私有成员t的值。

template<typename T>
void AAA<T>::test_func(const T &t)
{
    this->t = t;
}

print函数

输出私有成员t的值。

template<typename T>
void AAA<T>::print(void)
{
    cout << this->t << endl;
}

在main函数中分别定义两个类,T分别是int和double。

main函数

int main(int argc, char **argv)
{
    AAA<int> a;

    a.test_func(1);
    a.print();

    AAA<double> b;

    b.test_func(1.23);
    b.print();

    return 0;
}

编译测试,可以看到使用了AAA模板成功创建了两个对象。

使用类模板

类模板的使用可以分为两种:

  1. 用到时再实例化;
  2. 事先实例化;

上面的测试代码,使用的就是用到时再实例化

在main函数中,只有使用 AAA<int> a 语句的时候,编译器才通过类模板,创建了a对象;对于a对象的成员函数,编译器只有在使用到的时候,才会去创建对应的函数。

也可以在使用前,事先实例化。

即先使用:

template AAA<int>;

再使用:

AAA<int> a;

(事先实例化部分存疑,可能是我的理解有误,在代码中添加 template AAA<int>; 编译会报错)

重载/定做类模板

C++可以重载函数,类似的,也可以重载类模板,也叫作定做类模板。

修改代码,重载类模板AAA。

注意只是重载了T为int时的类模板,T为其他类型时模板还是会使用原来的AAA。

template <>
class AAA<int> {
public:
    void test_func_int(const int & t)
    {
        cout << t << endl;
    }

    void print_int(void);
};

void AAA<int>::print_int(void)
{
    cout << "for test" << endl;
}

main函数

int main(int argc, char **argv)
{
    AAA<int> a;

    a.test_func_int(1);
    a.print_int();

    AAA<double> b;

    b.test_func(1.23);
    b.print();

    return 0;
}

编译测试如下,可以看到T为int时,重载了类模板AAA,T为double时,没有影响。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值