学习:类模板

守給你的承諾、 提交于 2019-12-05 07:36:33

类模板的使用:

类模板作用:

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

在自己看来是给自己创建的类来使用的模板

语法:

template<typename T>

解释:

template --- 声明创建模板

typename --- 表面其后面的符号是一种数据类型,可以用class代替

T --- 通用的数据类型,名称可以替换,通常为大写字母

示例代码

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

template<class NameType, class AgeType>  //定义一个类模板
class Person {
public:
    Person(NameType name, AgeType age) {
        this->age = age;
        this->name = name;
    }

    void showinfo() {
        cout << this->age << endl;
        cout << this->name << endl;
    }
public:
    NameType name;
    AgeType age;
};

void test01() {
    Person<string, int>p1("adexx", 18);
    p1.showinfo();

}


int main() {
    test01();
    system("pause");
    return 0;

}

类模板和函数模板的区别:

1、类模板不会自动推导的使用方式,也就是调用的时候需要自己指定类型
2、类模板在模板参数列表中可以有默认参数,下面的代码中会有体现

示例代码:

#include<iostream>
#include<string>

using namespace std;

template<class NameType, class AgeType = int>  //定义一个类模板,我们还可以对传参进行指定默认参数
class Person {
public:
    Person(NameType name, AgeType age) {  
        this->age = age;
        this->name = name;
    }

    void showinfo() {
        cout << this->age << endl;
        cout << this->name << endl;
    }
public:
    NameType name;
    AgeType age;
};

int main() {
    //Person p1("adexx", 18); //直接生成不行,需要指定类型
    //Person<string, int>p1("adexx", 18); //可以
    Person<string>p1("adecc", 19);//对上面指定了默认参数 只需要指定一个类型string就可以
    system("pause");
    return 0;
}

总结:

1、类模板使用只能用显示指定类型方式
2、类模板中的模板参数列表可以有默认参数


类模板中成员函数创建时机:

类模板中成员函数和普通类中成员函数创建时机是有区别的:

1、普通类中的成员函数一开始就可以创建
2、类模板中的成员函数在调用时才创建

示例代码:

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

class Person1
{
public:
    void showPerson1()
    {
        cout << "Person1 show" << endl;
    }
};

class Person2
{
public:
    void showPerson2()
    {
        cout << "Person2 show" << endl;
    }
};

template<class T>
class Myclass {
public:

    T obj;
    void func1() {
        obj.showPerson1();
    }

    void func2() {
        obj.showPerson2();
    }
};


int main() {
    Myclass<Person1> m;
    m.func1();
    //m.func2();  两条一起执行就会报错, 但是注释掉一条就不会报错,所以说明了类模板中的函数调用的时候只有调用的时候才创建,要不然不创建
    system("pause");
    return 0;

}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!