BZ易风

导航

 

类模板

语法:template <T…> 紧跟着是类

区别:

  • 与函数模板区别,可以有默认类型参数
  • 函数模板可以进行自动类型推导,而类模板不可以

类模板中的成员函数 一开始不会创建出来,而是在运行时才去创建

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

//类模板
template<class NameT, class AgeT=int> //类模板可以有默认类型
class Person
{
public:
    Person(NameT name, AgeT age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }

    NameT m_Name;
    AgeT m_Age;
};
void test01()
{
    //1.类模板不支持 自动类型推导
    //Person p("孙悟空", 100);       //error
    //2.显示类型指定
    Person<string, int> p("孙悟空", 100);
}

int main()
{
    test01();
    system("Pause");
    return 0;
}

成员函数运行时才创建

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

//类模板
template<class NameT, class AgeT=int> //类模板可以有默认类型
class Person
{
public:
    Person(NameT name, AgeT age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }

    NameT m_Name;
    AgeT m_Age;
};
void test01()
{
    //1.类模板不支持 自动类型推导
    //Person p("孙悟空", 100);       //error
    //2.显示类型指定
    Person<string, int> p("孙悟空", 100);
}

class Person1
{
public:
    void showPerson1()
    {
        cout << "Person1显示" << endl;
    }
};
class Person2
{
public:
    void showPerson2()
    {
        cout << "Person2显示" << endl;
    }
};
template<class T>
class myClass
{
public:
    T obj;
    void func1()
    {
        obj.showPerson1();
    }
    void func2()
    {
        obj.showPerson2();
    }
};
//成员函数 一开始不会创建出来 而是运行时才会被创建出来
void test02()
{
    myClass<Person1> m; //此时运行 不会报错
    m.func1();          //正常
    //m.func2();          //error  只有运行到这才会报错
}
int main()
{
    test02();
    //test01();
    system("Pause");
    return 0;
}

结果:

 

调用func2时才会报错

 

 结果:

 

posted on 2021-08-24 15:59  BZ易风  阅读(178)  评论(0编辑  收藏  举报