C++ 类模板与成员函数模板示例解析
码小方 人气:0类模板
前面以函数模板为例,介绍了具体化与实例化。那么对于类模板,有什么不同呢?
类包括成员变量和成员函数,他们都可以包含类模板的模板参数。而成员函数本身也可以是函数模板。看下面的两个类:
// 类模板 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被调用的情况来决定到底实例化出多少个成员函数。
加载全部内容