c++类模板的使用

一,概述

c++中类模板其实与函数模板类似,建立一个通用的类,如果希望成员变量的类型是任意的,用类模板实现。
 类模板不是一个实际的类型,是虚拟的,和ppt模板一样,实例化的时候才会构建类。

二,类模板的定义

在定义模板时我们常用class, 但是你也可以为了区分类模板与函数模板运用typename。

template<class 类型名1,typename 类型名2 ,...>//clss与typename的作用是相同的
class 类名
{
  模板中定义的类型名1  变量1;
  模板中定义的类型名2  变量2;

}

 类模板的实现注意类模板不可以自行类型推导,须显式指定类型,所以我们需要加<>

并且 类模板在定义template时候,可以加上默认参数。

template<class T1,class T2=string>
 类名<类型> 变量名(参数)

三,类模板对象当做函数的参数

类模板对象当做参数有三种传参方式

1,直接传入模板对象

void fun(person<string, int>& per)

 2.类模板传入方式

template <class T1,class T2>
void fun3(person<T1,T2>& per)

3.整个类模板化

template <class T>
void fun4(T& per)

 这里要注意传参的时候要传入类的引用,并且除了整个类的模板化不需要显式指定类型外,其他两个都需要。

四,类模板的继承

类模板的继承分为两种:普通类继承类模板,类模板继承类模板,

1.普通类继承类模板:普通类继承模板时,继承的模板类必须确定类型,否则无法通过编译。因为普通类编译时需要确定基类的类型,而基类却无法确定,所以必定报错。

class 子类:public 父类<指定类型>

实例;

#include <iostream>

using namespace std;
template<class T>
class father
{
public:
T m_age;
T m_name;

father(T m_age,T m_name):m_age(m_age),m_name(m_name){}
~father(){}
};

class son:public  father<int>//father后一定要跟上一个指定类型
{
    int age;
    int name;
};


2.类模板继承类模板:类模板继承类模板不像普通类继承类模板那样,不需要写确定的类型,所以类模板继承要比普遍继承使用更加方便,因为类模板继承后仍是类模板,所以只需要写上T类型的即可,以便在被调用时通过子类模板确定基类模板。

实例:

#include <iostream>

using namespace std;
template<class T>
class father
{
public:
T m_age;
T m_name;

father(T m_age,T m_name):m_age(m_age),m_name(m_name){}
~father(){}
};

template<class T>
class son:public father<T>
{
    int age;
    int name;
};

五,类模板成员函数类外实现

 在类模板中,函数的声明和定义都应该在h文件或者在mian的cpp中,在类中声明,在类外定义需要加上模板的类限定符。

template <class T1,class T2>
class myson :public person<T1, T2>
{
public:int display(T1 x);
};
template <class T1,class T2>
int myson<T1, T2>::display(T1 x){}	
}

分文件编译时函数类外实现注意的问题: 类模板中成员函数的创建时机是在调用阶段,导致分文件编译时连接不到。

解决办法1:直接包含.cpp文件(一般不常使用)

解决办法2:将声明和实现写到同一个文件中,并且更改后缀名为.hpp文件, .hpp并不是强制这么写,至少一种约定俗成的名称。

实例:

在.hpp文件中-------------------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;
template<class T1,class T2>
class person
{
public:
    person(T1 name,T2 age);
    void showperson();
    T1 m_name;
    T2 m_age;
};

template<class T1,class T2>
person<T1,T2>::person(T1 name,T2 age)
{
this->m_aname=name;
this->m_aage=age;
}

template<class T1,class T2>
void person<T1,T2>::showperson()
{
    cout<<this->m_name<<"   "<<this->m_name<<endl;
}

void test1()
{
    person<string,int>p("danny",18);
    p.showperson();
}

在.cpp文件中-----------------------------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;
#include<文件名.hpp>
void test1()
{
    person<string,int>p("danny",18);
    p.showperson();
}


int main(int argc, char *argv[])
{
    
    test1();
    cout << "Hello World!" << endl;
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中的模板是一种通用的类模板,可以定义具有通用行为的,用于处理各种不同型的数据。下面是使用C++模板的基本方法: 1. 定义模板使用关键字`template`和模板参数列表来定义一个模板模板参数列表可以包含型参数和非型参数。 ```cpp template <typename T> class TemplateClass { // 的成员和方法定义 }; ``` 2. 实例化模板: 在使用模板之前,需要根据实际需要对其进行实例化来创建特定型的对象。 ```cpp TemplateClass<int> obj1; // 实例化一个存储int型数据的对象 TemplateClass<double> obj2; // 实例化一个存储double型数据的对象 ``` 3. 使用模板的成员和方法: 可以像使用普通一样使用模板的成员和方法。 ```cpp obj1.memberVariable = 10; // 设置成员变量的值 int value = obj1.memberFunction(); // 调用成员函数并获取返回值 ``` 4. 特化模板(可选): 如果需要针对特定型提供不同的实现,可以使用模板的特化来为特定型定义特定的行为。 ```cpp template <> class TemplateClass<char> { // 特定型char的特化实现 }; ``` 注意事项: - 模板的定义通常放在头文件中,以便在需要的地方进行包含。 - 模板的成员函数的实现通常也需要放在头文件中,以避免链接错误。 - 模板可以有多个模板参数,可以使用模板元编程技术进行更高级的操作。 - 在使用模板时,编译器会根据实例化的型生成对应的代码。每个型的实例化都会生成不同的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值