c++ 浙大翁恺老师 面向对象程序设计听课笔记收录(三十四)模板一
《课时34 模板 I》
什么是templates?
有两种东西,它们结构相同,类型不同
泛类嘛!但是这样不安全。
泛型编程,重用源代码,类型成为参数
1,function template函数模板,是一种模板(用来做出函数)
2,class template类模板,是一种模板(用来作出类)
3,template function使用template作出的 function
eg: sort function(你要sort不同类型)
a template function is an instantiation实例化 of a function template
4,template class使用template作出的 class
eg: containers such as stack, list, queue,容器的具体操作与类型无关
比如排序函数,就是函数模板,参数类型不同
swap function template
template<class T> // template 与 class关键字,template关键字往下一行那个东西就是
void swap(T& x, T& y) { // template,如果下一行是函数, 那个函数就是template
T temp = x; // 如果下一行是类, 那个类就是template; 用T将来可以是任意类型
x = y;
y= temp;
}
注意下图中关于template与 class 与 T的关键字的含义:
可以声明变量,代表返回类型等等
模板是一种声明,而不是定义,编译器只是记下模板,然后知道了具体的类型才定义。
编译器会为你zone一个函数定义出来,tempate function 就是 function template的instantiation/实例化(这个发生在你调用这个函数的时候)。
std::string s(“string”);
函数调用的顺序:
函数实例化 Function Instantiation
编译器推断模板类型从实际的形参类型推断;
也可以在尖括号显式地表达参数的类型
template
void foo(void)
foo();
foo();
类模板
类模板class templates
classes parameterized by types
abstract operations from the types being operated upon
define potentially infinite set of classes
another step toward reuse
typical use: container uses
Vector<int> v1(100) // 尖括号int为T, 圆括号为构造函数参数
类模板的成员函数怎么写:每一个都是函数模板
问答补充:
1.如果没有template,能做自动类型转换时是会做的。但是一旦有了模板之后,就不再做自动类型转换了。
因为模板其实就是个模具,它没那么智能,它只是直接填充。
2.
1.首先会检查唯一的函数匹配
2.检查唯一的函数模板匹配
3.如果上述都没有完全匹配的,就按照普通的函数重载,参数类型转换进行就可以了。
1.0是double,没有加f后缀的带小数点的数是double而不是float。这个知识点容易忘掉。
笔记来源:
https://study.163.com/note/noteIndex.htm?id=271005&type=0#/noteIndex?resType=0&resId=394177&sortType=0