C++-----初始函数模板与类模板

本文介绍了C++中的函数模板,包括隐式和显式实例化,以及模板的匹配规则。同时详细讲解了类模板的语法和使用注意事项,如在类外定义模板函数的方法。

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


提示:以下是本篇文章正文内容,下面案例可供参考

一、函数模板

  函数模板可以理解为用来解决逻辑相同参数类型不同的。编译器通过实参来推断类型,并实例化模板。

(1)语法

template <class T1,class T2.....>              

     返回值类型  函数名 参数列表{}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

(2)隐式实例化和显示实例化

     1.隐式实例化:

编译器通过函数的实参的类型来推导  T类型

template<class T >
	T Add( const T& left,  const T& right)
	{
		return left + right;
	}
	
	int main()
	{
		int a1 = 10, a2 = 20;
		double d1 = 10.0, d2 = 20.0;
		Add(a1, a2);//T是int
		Add(d1, d2);//T是double

2.显式实例化:

我们直接指定T的类型(强转或者<type>)

如果只有一个类型T,但是我们传入了两个不同类型的参数,这时编译器不知道T是int还是double,还有就是函数模板是不支持类型自动转换的,而普通函数可以。比如下面的例子,显式指明Add为int,它就和普通函数一样了,它就可以进行参数的隐式类型转化。

 其实显示实例化的最大的用处是当编译器不能通过实参来判断T的类型的时候,我们通过这样的方式

template<class T>
	 T  sw()
	{ 
		T a = 1;
		T b = 2;
		return  a + b;
	}
int main()
{
int sum=0;
sum=sw<int>();
return 0;

}

 (3)函数模板的匹配规则

如果函数模板名字和另一个函数名相同,它们不会冲突。

template<class T1,class T2>
	 T1 Add( const T1& left,  const T2& right)
	{
		return left + right;
	}
	int ADD(const int& left, const int& right)
	{
		return left + right;
	}
	int main()
	{
		int a1 = 10, a2 = 20;
		double d1 = 10.0, d2 = 20.0;

		Add(a1, a2);//优先匹配非模板
		Add(a1, d1);//匹配模板
}

二、类模板

1.类模板语法

template<T1 class,T2 class,.......Tn class>

class 类模板名 { // 类内成员定义 };

template<class T>
class mystring {

public:mystring(const T* str = " ")
{
	_size = strlen(str);
	_capacity = _size;
	_str = new char[_size + 1];
	strcpy(_str, str);

}
	  ~mystring()
	  {
		  delete[]_str;
		  _str = nullptr;
		  _capacity = 0;
		  _size = 0;
	  }
	  typedef char* vetor;

	  vetor being()
	  {
		  return _str;
	  }
	  vetor end()
	  {
		  return _str + _size;
	  }
	  size_t size();//类外定义
	 
	 
private:
	T* _str;
	int _size;
	int _capacity;

};
template<class T>::size_t size()
{
	return this->_size;
}
int main()
{
	mystring<char> s1("hello linux");
	return 0;}

注意点:我们如果在类模板中进行函数的声明,在类外定义时最好在同一个文件中

    对象s1的数据类型是mystring<char> ,而在普通类它的类型是类名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值