目录类模板类模板与成员函数模板的区别类模板 前面以函数模板为例,介绍了具体化与实例化。那么对于类模板,有什么不同呢? 类包括成员变量和成员函数,他们都可以包含类模板的模板参数。而成
前面以函数模板为例,介绍了具体化与实例化。那么对于类模板,有什么不同呢?
类包括成员变量和成员函数,他们都可以包含类模板的模板参数。而成员函数本身也可以是函数模板。看下面的两个类:
// 类模板
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++ 类模板成员函数模板的资料请关注编程网其它相关文章!
--结束END--
本文标题: C++ 类模板与成员函数模板示例解析
本文链接: https://lsjlt.com/news/176550.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0