c++模板之函数模板

本文详细介绍了模板函数的概念,如何使用模板函数编写与类型无关的代码,并通过实例展示了如何解决传入对象类型时产生的编译错误。重点强调了在模板函数内部重载运算符的重要性,以及传入参数时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

技术是实现目标的手段和方式,模板的存在,是为了让程序猿能编写出与类型无关的代码,而编写与类型无关的代码,则是为了代码的复用,让程序更美观,更容易维护,所有这些,都是为了提高生产效率。

        函数模板的格式

       

template <class 形参1,  class  形参2, .....>  返回类型  函数名(参数列表)
{
函数体
}

       不论何时,都不要忘记template   ,没有它,就不是模板了
      在<>里,是形参,用class 来修饰,也可以用typename 来修饰
    接下来是返回类型,和函数名,这个没什么好说的,非模板的函数也得有这两个东东
    小括号内(),放的是函数的参数,这里既可以放前面中括号里的形参,也可以放其他类型的参数,比如int long
    下面,给出一个函数模板的例子
     
//  如果t1比t2大,就返回true,反之,返回false
template<class T> bool IsBigger(const T& t1,const T&t2)
{
	return t1>t2?true:false;
}
int main()
{
	int i = 8;
	int j = 6;
	if(IsBigger(i,j))
	{
		cout<<"大于"<<endl;
	}
	return 1;
}

      我们前面已经讲过,使用模板技术,是为了编写与类型无关的程序,那么,是否意味着我们传入任意类型的数据都可以呢?看下面这段代码
      
//  如果t1比t2大,就返回true,反之,返回false
template<class T> bool IsBigger(const T& t1,const T&t2)
{
	return t1>t2?true:false;
}

class Data
{
public:
	int iData;
	Data(int i)
	{
		iData = i;	
	}
};


int main()
{
	Data d1(5);
	Data d2(3);
	if(IsBigger(d1,d2))
	{
		cout<<"大于"<<endl;
	}
	return 1;
}

      和第一段代码不同的是,这一次,我们传入的不再是基础数据类型,而是一个对象,然而在编译时,却生成一大堆错误,虽然现在的编译器已经非常智能,但仍然没有办法明确的告知你问题出在哪里。
      问题出在
return t1>t2?true:false;
      如果传入的是基础类型的数据,那么没有任何问题,但如果传入的是对象,对象就必须重载>运算符,否则,模板是不知道该如何比较他们两个之间的大小的,因此修改Data即可
      
class Data
{
public:
	int iData;
	Data(int i)
	{
		iData = i;	
	}

	// 注意,一定要在小括号的后面加const
	bool operator >(const Data& d)const
	{
		return iData>d.iData?true:false;
	}
};
       这里有一处要特殊说明,重载>时,函数体小括号的后面一定要加const 
       注意看我们的模板,传入的两个参数都是引用,且用const来修饰,这就表示,这个模板函数不能修改他们的值,而模板函数内在进行大小比较时又会调用Data重载的>函数,那么,这就要求重载>的函数内,也不能对Data对象的内容进行修改,因此要加上const

       一个类的函数的小括号后面如果加了const,就表示,这个函数体内不能对该类对象的成员变量做任何修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值