【C++】简单学——模板初阶
模板(template)
泛型编程,让编译器把我们不想干的事情给干了
类似于typedef,解决了typedef使用不方便地原因(虽然看似写少了,其实只是编译器做多了)
例如:
生成两个栈,但是两个栈存储的类型不一样,那就只能写两个class了
函数模板
编译器根据你的需要,按照你的函数模板生成多几份不同的函数
可以类比函数参数,只不过函数参数传的是对象,函数模板传的是类型
格式
规则:
- 必须要让编译器在推演函数模板的时候可以推演出来
- 模板不能声明和定义分离
核心原因:两阶段编译(Two-Phase Lookup)
模板解析阶段
编译器在遇到模板定义时,只会进行语法检查(如括号匹配、关键词正确性),但不会生成具体代码。此时它不知道T
的实际类型。实例化阶段
当代码中实际使用模板(如MyTemplate<int>
)时,编译器才根据具体类型int
生成真正的代码(称为“实例化”)。此时需要完整的模板定义。
- 模板和函数可以同时存在,如果说某种传参两种函数都可以走,调用的规则遵循:有现成先吃现成的------有现成的,但是不够匹配,有模板就吃编译器的-----如果有强制调用模板就选模板
函数模板实例化
隐式实例化:让编译器根据你的传参自己去推演
显示实例化:直接在函数名和参数列表中间加上类型
类模板
不能推演实例化了,只能指定
使用
特点
- 在没有接触模板的情况下,一般类的名字就是对象的类型,但是类模板之后,对象的类型要加上显示实例化后的类,例如Stack<int> s1的类型是Stack<int>
- 如果要做声明和定义分离,要给那个定义加上模板并且指定为显示实例化的函数,因为Stack不认识T
- 声明和定义分离最好不要分离到两个文件,因为会特别挫,要到【C++】简单学——模板进阶讲