• C++类模板


    目录

    简介

    类模板和成员函数创建时机

    类模板对象做函数参数

    类模板与继承

    类模板成员函数类外实现

    类模板分文件编写

    类模板与友元


    简介

    类模板通过建立一个通用类,类中的成员数据类型可以不具体指定,用一个虚拟的类型来代表

    语法

    1. template<typename T>

    案例

    1. #include
    2. using namespace std;
    3. template<class NameType,class AgeType=int>
    4. class Person {
    5. public:
    6. Person(NameType name, AgeType age) {
    7. this->mName = name;
    8. this->mAge = age;
    9. }
    10. void showPerson() {
    11. cout << "name: " << this->mName << "age: " << this->mAge << endl;
    12. }
    13. private:
    14. NameType mName;
    15. AgeType mAge;
    16. };
    17. int main()
    18. {
    19. Person<string,int> p("lll", 10);//这里必须声明类型
    20. p.showPerson();
    21. return 0;
    22. }

    类模板与函数模板的区别

    1.类模板没有自动类型推到的使用方式

    2.类模板在模板参数列表中可以有默认参数

    类模板和成员函数创建时机

    普通类中的成员函数是一开始就可以创建的

    类模板中的成员函数在调用时才可以创建

    案例

    1. #include
    2. using namespace std;
    3. class p1 {
    4. public:
    5. void showp1() {
    6. cout << "show p1" << endl;
    7. }
    8. };
    9. class p2 {
    10. public:
    11. void showp2() {
    12. cout << "show p2" << endl;
    13. }
    14. };
    15. template<class T>
    16. class Person {
    17. public:
    18. T obj;
    19. void fun1() {
    20. obj.showp1();
    21. }
    22. void fun2() {
    23. obj.showp2();
    24. }
    25. };
    26. int main()
    27. {
    28. Person p;
    29. p.fun1();
    30. //p.fun2(); 编译出错说明是函数调用才会创建成员函数
    31. return 0;
    32. }

    类模板对象做函数参数

    一共有三种传入方式

    1.指定传入的类型--直接显示对象的数据类型(最常用)

    2.参数模板化--将对象中的参数变为模板进行传递

    3.整个类模板化--将这个对象类型模板化进行传递

    案例:

    1. #include
    2. using namespace std;
    3. template<class NameType, class AgeType = int>
    4. class Person {
    5. public:
    6. Person(NameType name, AgeType age) {
    7. this->mName = name;
    8. this->mAge = age;
    9. }
    10. void showPerson() {
    11. cout << "name: " << this->mName << "age: " << this->mAge << endl;
    12. }
    13. private:
    14. NameType mName;
    15. AgeType mAge;
    16. };
    17. //1.指定传入的类型
    18. void printPerson1(Personint>& p) {
    19. p.showPerson();
    20. }
    21. //2.参数模板化
    22. template<class T1, class T2>
    23. void printPerson2(Person& p) {
    24. p.showPerson();
    25. }
    26. //3.整个类模板化
    27. template<class T>
    28. void printPerson3(T & p){
    29. p.showPerson();
    30. }
    31. int main()
    32. {
    33. Personint> p("a", 10);
    34. printPerson1(p);
    35. printPerson2(p);
    36. printPerson3(p);
    37. return 0;
    38. }

    类模板与继承

    注意事项

    1.当子类继承的父类是一个模板类时,子类在声明的时候,要指定出父类中T的类型

    2.如果不指定,编译器无法给子类分配内存

    3.如果想要灵活指定出父类中T的类型,子类也需变为类模板

    案例

    1. #include
    2. using namespace std;
    3. template<class T>
    4. class Base {
    5. T m;
    6. };
    7. class son :public Base<int>
    8. {
    9. };
    10. template<class T>
    11. class son2 :public Base {
    12. };
    13. int main()
    14. {
    15. son s;
    16. son2<int> s2;
    17. return 0;
    18. }

    类模板成员函数类外实现

    类模板中成员函数类外实现的时候需要加入模板参数列表

    1. #include
    2. using namespace std;
    3. template<class T1, class T2>
    4. class Person {
    5. public:
    6. //成员函数类内声明
    7. Person(T1 name, T2 age);
    8. void showPerson();
    9. public:
    10. T1 m_Name;
    11. T2 m_Age;
    12. };
    13. template<class T1,class T2>
    14. Person::Person(T1 name, T2 age) {
    15. this->m_Name = name;
    16. this->m_Age = age;
    17. }
    18. template<class T1,class T2>
    19. void Person::showPerson() {
    20. cout << "姓名:" << this->m_Name << "年龄:" << this->m_Age << endl;
    21. }
    22. int main()
    23. {
    24. Personint> p("hehe", 10);
    25. p.showPerson();
    26. return 0;
    27. }

    类模板分文件编写

    将声明和实现写到同一个文件中,并更名为.hpp,.hpp是约定俗成的名字,不是强制

    .hpp头文件

    1. #pragma once
    2. #include
    3. using namespace std;
    4. template<class T1, class T2>
    5. class Person {
    6. public:
    7. //成员函数类内声明
    8. Person(T1 name, T2 age);
    9. void showPerson();
    10. public:
    11. T1 m_Name;
    12. T2 m_Age;
    13. };
    14. template<class T1, class T2>
    15. Person::Person(T1 name, T2 age) {
    16. this->m_Name = name;
    17. this->m_Age = age;
    18. }
    19. template<class T1, class T2>
    20. void Person::showPerson() {
    21. cout << "姓名:" << this->m_Name << "年龄:" << this->m_Age << endl;
    22. }

    .cpp文件

    1. #include
    2. using namespace std;
    3. #include"person.hpp"
    4. int main()
    5. {
    6. Personint> p("hehe", 10);
    7. p.showPerson();
    8. return 0;
    9. }

    类模板与友元

    全局函数类内实现-直接在类内声明友元即可

    全局函数类外实现-需要提前让编译器知道全局函数的存在

    案例

    1. #include
    2. using namespace std;
    3. template<class T1, class T2> class Person;
    4. //如果声明了函数模板,可以将实现写到后面,否则需要将实现体写到类的前面让编译器提前看到
    5. template<class T1, class T2> void show2(Person & p);
    6. //这里由于show2在类之前实现所以前面要先声明Person 如过在Person类之后实现则不用
    7. template<class T1,class T2>
    8. class Person {
    9. public:
    10. Person(T1 name, T2 age) {
    11. this->m_name = name;
    12. this->m_age = age;
    13. }
    14. //1.全局函数友元类内实现
    15. friend void show1(Person& p) {
    16. cout << p.m_name << " " << p.m_age << endl;
    17. }
    18. //2.全局函数友元类外实现
    19. friend void show2<>(Person& p);
    20. private:
    21. T1 m_name;
    22. T2 m_age;
    23. };
    24. template<class T1, class T2>
    25. void show2(Person& p) {
    26. cout << p.m_name << " " << p.m_age << endl;
    27. }
    28. int main()
    29. {
    30. Personint> p("aa", 10);
    31. show1(p);
    32. show2(p);
    33. return 0;
    34. }

  • 相关阅读:
    Linux系列之查找命令
    看到这个应用上下线方式,不禁感叹:优雅,太优雅了!
    更快更强更稳定:腾讯向量数据库测评
    多语言在线客服系统源码-自动识别中英环境-私有化部署完美支持跨境电商网站...
    玩转ChatGPT:参考文献速查
    Python批量统计pdf中“中文”字符的个数
    idea连接kerberos认证的hive
    MySQ 学习笔记
    基于java(springboot)简历系统源码成品(java毕业设计)
    怎样做音乐相册?这篇文章教会你
  • 原文地址:https://blog.csdn.net/l_ethan/article/details/126082767