4-2类模板概念,定义、类模板的成员函数、非类型模板参数

 

概述

用类模板实例化一个特定的类。

编译器不能为类模板推断模板参数类型,所以为了使用类模板,我么必须在模板后边用<>来提供额外的信息,这些信息其实就是对应着模板参数列表中的参数。例如:vector<int>

目的:同一套代码可以应付不同的  数据类型,这样就精简多了。

类模板定义

template<typename 形参名1, typename 形参名2, .....typename 形参名n>
class 类名
{
 
};

我们实例化类模板时,必须要又类的全部信息,包括类模板中成员函数函数体。

#ifndef MYVECTOR_HPP_INCLUDED
#define MYVECTOR_HPP_INCLUDED

template <typename T>
class myvector
{
public:
    typedef T* myitrator;  //迭代器
public:
    myvector(); //构造函数
    myvector<T>& operator = (const myvector<T>&);//赋值运算符重载
                                             //内部可以不用添加<T>
public:
    myitrator mybegin();//迭代器起始位置
    myitrator myend();//最后一个元素的末尾位置
public:
    void myfunc();  //{} //把成员函数体(函数具体实现)放在了类模板的定义中
}

//普通函数
template <typename T>
void myvector<T>::myfunc()
{
    return;
}

//构造函数
template <typename T>
myvector<T>::myvector()
{
}

template <typename T>
myvector<T>& myvector<T>::operator=(const myvector&)
{
    return *this;
}

#endif // MYVECTOR_HPP_INCLUDED
#include <iostream>
#include "myvector.hpp"
#include "test.h"
using namespace std;

int main()
{
    myvector <int> tmpvec;//使用的时候才会实例化

    cout << "Hello world!" << endl;
    return 0;
}

myvector 是一个类模板名,不是一个他不是一个类名,类模板是用来实例化类(类型)用的。

myvector<int>才是类型名。

所以,一个实例化的类型总会用尖括号<>包含着模板参数

一个类模板虽然可能有很多成员函数,但是当你实例化模板之后,如果你后续没有使用到某个成员函数,则这个成员函数不会被实例化,说白了,就是一个实例化的模板,它的成员函数只有在使用的时候才被实例化。

 

类模板的成员函数

类模板成员函数,可以写在类模板定义中{};那么这种写在类模板定义中的成员函数会被隐式声明为 inline 函数。

类模板一旦被实例化之后,那么这个模板的每个实例都会有自己的成员函数。所以,类模板的成员函数具有和这个类模板相同的模板参数(这句话的核心意思是:类模板的成员函数是有模板参数的)

如果把类模板成员函数的的定义卸载(函数体)外边,那么这个成员函数的模板参数就体现出来了。

定义在类模板之外的成员函数必须以关键字template开始,后边接类模板参数列表,同时在在类名后边要用<>把模板参数列表的所有来模板参数名列出,如果是多个模板参数,用“,”分割。
 

非类型模板参数


#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
using namespace std;
template <typename T , int size = 10>
class myArray
{
  private :
     T myarr[size];
  public:
    void myfunc();
};
template<typename T ,int size>
void myArray<T,size>::myfunc()
{
    cout << size <<endl;
    return ;
}

#endif
#include <iostream>
#include "myvector.hpp"
#include "test.h"
using namespace std;

int main()
{
    //非类型模板参数
    myArray<int ,100> temarr;
    temarr.myfunc();//100
    myArray<int> temarr2;
    temarr2.myfunc();//10
    
   
    cout << "Hello world!" << endl;
    return 0;
}

非类型模参数的局限性

1、浮点型数据不能做非类型模板参数。比如:double,float

2、类类型也不允许做非类型模板参数

class A {};
 
template<typename T, A a>  //不可以,报错
class myclass
{
 
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值