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

Nora ·
更新时间:2024-05-15
· 276 次阅读

目录

类模板

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

类模板

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

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

// 类模板 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被调用的情况来决定到底实例化出多少个成员函数。

以上就是C++ 类模板与成员函数模板示例解析的详细内容,更多关于C++ 类模板成员函数模板的资料请关注软件开发网其它相关文章!



c+ 示例 模板 函数 类模板 C++

需要 登录 后方可回复, 如果你还没有账号请 注册新账号