100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 关于C++类模板template<typename T>的使用

关于C++类模板template<typename T>的使用

时间:2018-11-19 00:32:52

相关推荐

关于C++类模板template<typename  T>的使用

template是C++11引入的关键字模板。

在阅读代码中遇到,因此展开了相关的学习。

template的使用方式有两种。

template <typename 类型参数>class 类名{类成员声明 };或者template <class 类型参数>class 类名{类成员声明 };

两种表达方式是没有区别的。

类型参数,在调用函数时候可以替换为需要的数据类型,例如:int,char,string等等。

我理解的这样做的好处是可以灵活的改变类成员的数据类型,避免因为数据类型,重复书写类。这种的想法,和函数重载有所类似。

需要注意的是,当成员函数中包含有类型参数,且在类外对函数进行定义时,需要在函数定义前对类模板进行声明

下面按步骤示例一个包含一个类模板的程序

①定义类模板和一个类

#include <iostream>///template<typename *> 或者 template<class *> 同理///只使用一个模板类,在模板外定义函数template<typename T>class Student{public :Student(T v1,int v2); //构造函数void print(); //成员函数private:std::string name;int score;};

可以看出,Student(T v1,int v2)中,我们可以定义第一个形参是T类型,第二个形参是int类型。在后续调用该函数的时候,T的类型是可以由我们自己决定的。

②下面让我们来写定义类中的函数。

template<typename T>void Student<T>::print() {std::cout<<name <<":"<<score;}template<typename T>Student<T>::Student(T v1,int v2) {name = v1;score=v2;}

首先,我们进行了声明,每一个函数前都要进行声明。基本格式就是:

返回类型 类名<类型参数>函数名(形参)

③创建对象,使用函数

int main() {Student<std::string>student1("Jake",100);student1.print();return 0;}

可以看出,在示例代码中,我们使用了string类型。以上就是一个简单的、完整的应用过程。完整代码贴出:

#include <iostream>///template<typename *> 或者 template<class *> 同理///只使用一个模板类,在模板外定义函数template<typename T>class Student{public :Student(T v1,int v2); //构造函数void print(); //成员函数private:std::string name;int score;};template<typename T>void Student<T>::print() {std::cout<<name <<":"<<score;}template<typename T>Student<T>::Student(T v1,int v2) {name = v1;score=v2;}int main() {Student<std::string>student1("Jake",100);student1.print();return 0;}

※两个类型参数的类模板举例

///使用两个类模板,可以解决两个参数类型都需要变化的情况。可以想象,如果只有一个类模板,除非固定了一个其他类型的形参,不然形参的类型都是一种template<typename T1,typename T2>class Student{private:T1 name;T2 score;public:Student(T1 a, T2 b);void print();};template<typename T1,typename T2>Student<T1,T2>::Student(T1 a, T2 b) {name=a;score=b;}template<typename T1,typename T2>void Student<T1,T2>::print(){std::cout<< name <<": "<<score <<std::endl;}int main(){Student<std::string , int> lan("Jack",100);lan.print();return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。