STL教程-函数模板与模板编译机制与类模板

STL教程-函数模板与模板编译机制与类模板,第1张

001函数模板基本语法


这时候如果有个long类型也要添加,而且维护成本很高,这时候可以通过模板技术来解决

模板技术

类型参数化,可以忽略类型
为了让 编译器区分是普通函数和模板函数,需要与普通函数有点不同

template < class T123>
template
template < typename T>
void 函数名(T ,T){…}

这两种都可以,遇到几个参数就写几个参数
写下以后告诉编译器如果碰到奇怪的东西,不要大惊小怪,然后下面紧跟的函数遇到参数是用T代替
下面这个是自动类型推导

1、自动类型推导

2、显示定义类型

在调用函数前加上<>里面加上类型表示定义的类型

002函数模板和普通函数的区别
  • 函数模板不允许自动类型转化
  • 普通函数能够自动进行类型转化

    所以看到模板函数不允许类型转换。所以总结如下
模板函数和普通函数在一起的调用规则

1、函数模板可以像普通函数那样被重载
2、c++编译器优先考虑普通函数
3、如果函数模板可以产生一个更好的匹配,那么选择模板
4、可以通过空模板实参列表的语法限定编译器只能通过模板匹配,比如myadd<>(a,b);

1、重载模板函数

2、c++编译器优先考虑普通函数

3、如果函数模板可以产生一个更好的匹配,那么选择模板

4、非要调用模板函数

003模板编译机制 1、普通函数编译过程
  **cpp->预编译器(.i)->编译器(.s)->汇编器(.obj或者linux的.o)->链接器(.exe)**

第一步:在linux上新建一个cpp

第二步:预编译

第三步:编译
g++ -S test.i -o test.s
查看内容

第四步:汇编

这时候文件里的内容已经看不懂了

第五步:链接

2、函数模板编译过程


1、新建一个函数

2、编译
g++ -S test.cpp -o test.s
查看编译的内容

3、总结

1、编译器并不是把函数模板处理成能够处理任何类型的函数
2、函数模板通过具体类型产生不同的函数
3、编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译

上面第三条的意思是第一次编译仅仅生成一个函数头,第二次编译则是在函数调用时根据模板的类型参数列表具体的实现这个模板对应的类型的函数实例,注意这里是根据类型参数列表来实现,而不是根据调用次数

004类模板

1、模板类派生普通类

c++编译器需要知道父类的具体类型是什么样的,才能分配具体大小的内存

template<class T>
class Person 
{
public:
	Person()
	{
		m_age = 0;
	}

private:
	T m_age;
};

class sonPerson : public Person<int>  //这里不加,会生成失败
{

};

2、类模板派生模板类

这时候可以不声明类型

template<class T>
class Person 
{
public:
	Person()
	{
		m_age = 0;
	}

private:
	T m_age;
};



template<class T>
class SonPerson2:public Person<T>
{
public:
	SonPerson2() {};
	~SonPerson2() {};
private:
};

原因是在调用这个被派生的模板类时,我们需要先声明类型,所以此时编译器知道如何申请内存

SonPerson2<int>();

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1325251.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-12
下一篇2022-06-12

发表评论

登录后才能评论

评论列表(0条)

    保存