C++ 函数模板,类模板初步认识

一、函数模板

1、几个功能相同的函数,比如都是两个数相加,只是参数类型不同(float+float; int+int等)就可以用一个模板函数,简化代码;

2、模板定义:

语法:

template  <typename 虚拟类型名称> 函数返回值  函数名称 (参数列表){函数体}

或者

template  <class 虚拟类型名称> 函数返回值  函数名称 (参数列表){函数体}

例如:

//函数模板  
template <typename I>   //typename I  和 class  I  一样的作用
I add(I a, I b)
{
    return a+b;
}


 template <typename I>    template   <typename[class] 虚拟类型名称>
I add(I a, I b)  //函数返回类型  函数名 (参数1,......)
{
return a+b;
}  //函数体

3、函数模板的使用

    cout<<add(5,5)<<endl<<add(5.2,5.2)<<endl;//
    
    //cout<<add(5,5.2)<<endl;//5和5.2   不明确类型语法有错误
    /*
    F:\mystudy\classtemplate\classtemplate\classtemplate\classtemplate.cpp(32) : error C2782: “I add(I,I)”: 模板 参数“I”不明确
           f:\mystudy\classtemplate\classtemplate\classtemplate\classtemplate.cpp(9) : 参见“add”的声明
            可能是“double”
            或       “int”
    */
    //cout<<add((int)5.2, 5.2); //同上不明确
    cout<<add(5,(int)5.2)<<endl;//这种格式就比较明确
    cout<<add((double)5,5.2)<<endl;

二、类模板

1、类模板声明格式

template <class 虚拟类型参数>

class  类名

{

//类体

构造函数

函数返回值   函数名(虚拟类型参数名)

};

即:

template <class T>

class  A

{

//类体 

public://

A();//构造函数

void test(T a);//函数返回值   函数名(虚拟类型参数名)

};

#ifndef TEMP
#define  TEMP

//类模板(Class templates)


/*
1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。

2) 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如下例中的T)。

3) 在类声明前面加入一行,格式为:
template <class 虚拟类型参数>
如:
template<class T>
class A//A 类型名称    
{
public:
T g(T a, T b);
A();
}; //类体
*/

template<class T>
class A//A 类型名称    
{
public:
    T g(T a, T b);
    A();
};

#endif
//template<class T> A<T>   类型名称
template<class T> 
A<T>::A()
{

}

template <class T> //类模板格式
T A<T>::g(T a, T b)  //T 函数返回值  
{
	return a+b;
}

2、类模板函数的定义

    template<class T> 类型名称::函数名称(参数列表)

    {

        函数体。。。

    }

   即:

    template<class T> A<T>::A()

   {

    }


//template<class T> A<T>   类型名称
template<class T> 
A<T>::A()
{

}

template <class T> //类模板格式
T A<T>::g(T a, T b)  
{
	return a+b;
}
3、对象定义格式

    类模板名<实际类型名> 对象名; 
    类模板名<实际类型名> 对象名(实参表列); (构造函数有参数定义格式)
   

A<int> t;     //此处定义了T的类型为整型,所以类型明确没有语法错误                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

//A b; // 1,error C2955: “A”: 使用类 模板 需要 模板 参数列表 2,error C2133: “b”: 未知的大小 3,error C2512: 
//      “A”: 没有合适的默认构造函数可用
//b.g(5,5);   error C2662: “A<T>::g”: 不能将“this”指针从“A”转换为“A<T> &”
/*  对象定义格式
类模板名<实际类型名> 对象名;    A 对应 类模板名  <int> 对应 <实际类型名> t  对应对象名  A<int> t;
类模板名<实际类型名> 对象名(实参表列);  构造函数有参数定义格式
*/

4、类模板成员函数使用

对象.方法(参数);   

A<int> t;

t.g(5.6,5.2); // 11

//此处定义了T的类型为整型,所以类型明确没有语法错误;就算你给的参数是float  也会按照int解释

使用和类一模一样;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值