C++ 类模板与成员函数模板示例解析

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C++ 类模板与成员函数模板示例解析

码小方   2023-02-02 我要评论

类模板

前面以函数模板为例,介绍了具体化与实例化。那么对于类模板,有什么不同呢?

类包括成员变量和成员函数,他们都可以包含类模板的模板参数。而成员函数本身也可以是函数模板。看下面的两个类:

// 类模板
template <typename T>
class A {
private:
    T t;
public:
    void funcA(T t);
};
template <typename T>
void A<T>::funcA(T t) {
    cout << t;
}
// 成员函数模板
class B {
private:
    int t;
public:
    template <typename T>
    void funcB(T t);
};
template <typename T>
void B::funcB(T t) {
    cout << t;
}
int main()
{
    A<int> a1;
    a1.funcA(1);
    A<char*> a2;
    a2.funcA("2");
    B b;
    b.funcB(1);
    b.funcB("2");
}

类模板A中包含成员函数funcA;类B包含一个成员函数模板funcB。我们仔细看下二者的区别。

类模板与成员函数模板的区别

首先,类模版A中的成员函数的类型可以用类模板参数T,而成员函数模板做不到。

其次,在调用成员函数时,类模板A需要先指定一种类型创建一个实例对象(如代码中的a1),然后才能调用成员函数,a1.funcA只能传入int类型参数。如果想传char*类型参数,必须用char*创建一个实例(代码中的a2)。

而对于类B,则创建一个实例对象(b)之后,可以任何类型作为参数来调用funcB。

只要明白了前面讲的模板实例化,这里面的原因也很好理解。对于A来说,整个类是一个模版,当使用int类型生成对象a1时,也会对类模板A进行实例化,生成A类,其中所有的T都会替换为int,因此生成的类只有一个成员函数 void funcA(int)。如果想传入char*,则必须实例化A<char*>这个类。

而对于类B,它本身只是一个普通类,只不过它包含一个成员函数模板。当编译器发现代码中有调用这个成员函数funcB(int),编译时会为funcB实例化;如果也有调用funcB(char*),则会为B生成funcB<char*>成员函数。也就是说,类B的成员函数的数量不是确定的,是根据funcB被调用的情况来决定到底实例化出多少个成员函数。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们