C++模板机制

一、模板(Template):
C++提供了模板机制,即函数模板和类模板。一种参数化类型机制,对应于JAVA和C#的泛型,字面意思来讲即建立一个通用的函数或类,这些函数和类的形参类型是模糊的,可以为任一类型,用虚拟形参表示,这就给代码的重用带来了极大的便利。比如当我们进行比较不同类型的数据的大小时,无需写两段除参数类型不同以外一模一样的代码来实现此功能。
二、语法:
template<模板行参1,模板行参2...>       或        template<模板形参1,模板形参2...>
返回参数 函数名(模板参数表)                         class 类名
{                                                                           {
函数体                                                            
}                                                                            };
提示:在template语句和函数模板定义语句间不能有其它语句。
模板形参:1.表示类型的类型形参,跟在关键字class或typename后声明。
            2.表示常量表达式的非类型形参,允许为整型或枚举型、到对象的指针或函数指针、到对象的引用或            函数引用、成员指针。不允许声明为浮点型、class型、void型。

模板参数:1.允许是另外一个类模板,称为模板的模板参数。例如:

template<template <class T> class X> class A { }; //类模板A的第二个参数是另外一个类模板X
template<class T> class B { };
A<B> a; //模板A的实际使用。其中的B是模板的模板实参
2.模板参数可以给出默认值,但如果一个模板参数给出默认值,则其它的模板参数必须全部给出默认值。例如:

template<class T=char,class U,class V=int> class X { }; //编译出错
3.一个模板的各此声明给出的模板参数的默认值可以累积其效果。例如:

template<class T, class U = int> class A;
template<class T = float, class U> class A;   //前两行不得互换,因为前文第2点
template<class T, class U> class A {
  public:
     T x;
     U y;
};
A<> a; //a.x是float类型,a.y是int类型
4.在同一作用域中不能对同一个模板的同一个参数多次声明其默认值。例如:

template<class T = char> class X;
template<class T = char> class X { };//编译报错。如果在本行中不给出模板参数T的默认值将编译通过
三、实例:
一个简单的判断大小程序,其中模板参数定义了两个不同的类型。

#include "stdafx.h"
#include <iostream>
using namespace std;

template<typename T1,typename T2>
T1 max(T1 x,T2 y)
{
	return x>y? x:y;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a=10;
	double b=22.5;
	cout<<max(a,b)<<endl;  //此时输出为22
	return 0;
}
先来看看模板函数的返回类型定义为了T1,那么在主函数中调用max()函数时返回的类型根据主函数来确定为int类型。当返回类型定义为T2时,则输出为22.5,可以看到返回类型决定着函数调用时的输出类型。而如果返回类型定义为T,则编译器报错,原因在于编译器无法确定函数的返回类型。那么换一种写法:

#include "stdafx.h"
#include <iostream>
using namespace std;

template<typename T1,typename T2>
T1 max(T1 x,T2 y)
{
	cout<< (x>y? x:y)<<endl;
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a=10;
	double b=22.5;
	max(a,b);  //输出为22.5
	return 0;
}
可以看到在换为cout时,函数的调用时返回类型不起任何作用,只会返回最大的值,无论返回类型为T1还是int或double都不影响其值。







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值