C++模板-33-类模板和函数模板的区别

亦凉 2023-02-17 02:29 82阅读 0赞

这篇开始学习类模板相关知识,本篇主要学习什么是类模板,还有类模板和函数模板的区别

1.类模板语法

  1. template <class T>

模板声明下面是函数就是函数模板,如果是类就叫类模板

2.一个类模板例子

下面写一个Person类 类模板,看看如何定义和如何使用类模板

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. //类模板
  5. template <class TypeName, class TypeAge>
  6. class Person
  7. {
  8. public:
  9. Person(TypeName name, TypeAge age)
  10. {
  11. this->m_Name = name;
  12. this->m_Age = age;
  13. }
  14. TypeName m_Name;
  15. TypeAge m_Age;
  16. void showInfo()
  17. {
  18. cout<< "Name: " << m_Name << " Age: " << m_Age << endl;
  19. }
  20. };
  21. void test01()
  22. {
  23. Person<string, int> p1("张三", 18);
  24. p1.showInfo();
  25. }
  26. int main()
  27. {
  28. test01();
  29. system("pause");
  30. return 0;
  31. }

3. 类模板和函数模板区别

现在我们学习了类模板和函数模板,语法格式都差不多,第一行是template开头,后面跟着如果是函数,就叫函数模板,如果跟着是类,就叫类模板。那么类模板和函数模板有什么区别呢?

3.1 类模板不支持参数自动推导

前面学习过函数模板中参数,支持参数类型自动推导,这个在类模板中就不行,必须要明确给出参数类型才可以,否则报错。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1NDE5NDY_size_16_color_FFFFFF_t_70

上面29行语法是正确,30行编译不过去,会提示模板参数缺失。

3.2 类模板在模板参数列表可以有默认参数

上面的类模板代码中,模板参数列表有两个,下面代码修改一下,把int设置默认参数,调用类模板的使用可以不写int,代码如下

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. //类模板
  5. template <class TypeName, class TypeAge = int>
  6. class Person
  7. {
  8. public:
  9. Person(TypeName name, TypeAge age)
  10. {
  11. this->m_Name = name;
  12. this->m_Age = age;
  13. }
  14. TypeName m_Name;
  15. TypeAge m_Age;
  16. void showInfo()
  17. {
  18. cout<< "Name: " << m_Name << " Age: " << m_Age << endl;
  19. }
  20. };
  21. void test01()
  22. {
  23. Person<string> p1("张三", 18);
  24. p1.showInfo();
  25. }
  26. int main()
  27. {
  28. test01();
  29. system("pause");
  30. return 0;
  31. }

如果给定了第二个参数是int类型,所以第29行在模板参数列表中可以写成上面样子。这里设置了默认,如果模板参数不写,自然就是采用默认的int类型,如果模板参数传入了,就使用模板参数中传入的类型。

发表评论

表情:
评论列表 (有 0 条评论,82人围观)

还没有评论,来说两句吧...

相关阅读