为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢?

  1. 定义基类?可以实现,很多情况下可能不够简明的表达设计思想
  2. 克隆代码(写一段X关于list的定义,再写一段Y关于list的定义)但是后期无法统一对其管理
  3. 做一个void*类型的list,缺点是类型不安全

比较好的解决方案就是Templates

函数模板:是一种模板,用来做出函数,比如sort排序函数、swap交换函数等等

类模板:也是一种模板,用来做出类,比如list、map等这些类

函数模板例子:swap函数 ====> swap函数模板

//swap函数
void swap(int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
//swap函数模板
template <class T>
void swap(T& x, T& y)
{
T temp = x;
x = y;
y = temp;
}

上边的T可以是int、float这种已有的类型,也可以是用户自己定义的类型。

int i=;
int j = ;
swap(i, j); //这里编译时,编译器会帮我们按照之前templates定义的规则制造一个swap(int,int)函数 float k = 4.5;
flaot m = 3.7;
swap(k, m); //这里编译器会给我们再做出一个 swap(flaot,flaot)函数 与上边的swap(int,int)是函数重载的关系

注意1:

swap(int,int);  //ok
swap(double, double); //ok
swap(int, double); //error! 并不会把double转为int

注意2:

//函数模板的另一种写法
template <class T>
void foo(void) {/*...*/}
foo <int>(); //foo(int)
foo<float>(); //foo(float)

模板中使用用多个类型:

template <class K, class V>
class HashTable
{
const Value& lookup(const K&) const;
const install(const K&, const V&);
...
};

模板中使用参数:

template<class T, int bounds=>  //注意这里的bounds变量,有缺省的值,也可以在后边定义类对象的时候赋值
class FixedVector
{
public:
FixedVector();
//...
T& operator[] (int);
private:
T element[bounds]; //fixed size array!
}; FixedVector<int, > v1; //种出一个50个单元的int的FixedVector
FixedVector<int> v2; //默认100个单元

类模板例子:

template <class T>
class Vector
{
public:
Vector(int);
~Vector();
Vector(const Vector&);
Vector& operator=(const Vector&);
T& operator[] (int);
private:
T* m_elements;
int m_size;
}; //使用
Vector<int> v1(); //Vector中的T是int
Vector<Complex> v2(); //Complex 可以是float等类型 v1[] = ;
v2[] = v1[]; //ok if int->Complex 如果int能转换为Complex(向上造型)

T某个成员变量的类型,T做成员函数的返回类型

函数模板遇到继承会怎样?

某个类继承了某个模板种出来的类,什么叫“种”,就是在编译的时候,编译器根据我们定义的模板来给你生成了一段真实的类的代码

template <class A>
class Derived:public Vector<A> {...}; //Vector借用上一段代码 

目录

  1. c++(翁恺浙大公开课) 笔记0
  2. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
  3. c++对象初始化(翁恺c++公开课[10])
  4. c++构造函数的初始化列表(翁恺c++公开课[13])
  5. c++继承:公有、私有、保护
  6. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
  7. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
  8. c++多态性及多态的内部实现(翁恺c++公开课[23-24])
  9. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
  10. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
  11. c++模板(翁恺c++公开课[34-35]学习笔记)
  12. 最好不要在头文件中写函数定义

c++模板(翁恺c++公开课[34-35]学习笔记)的更多相关文章

  1. c++中的Exceptions异常处理(翁恺c++公开课[36])

    Exceptions用于处理Run-time Error: //文件读取的异常捕获伪代码 try{ open the file; determine its size; allocate that m ...

  2. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)

    这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...

  3. c++多态性及多态的内部实现(翁恺c++公开课[23-24])

    多态是在父类函数的前面加上 “virtual” 关键字,使子类与父类同名的函数产生一种联系: 多态会用到两个特性:向上造型.动态绑定 向上造型是指:拿一个子类对象当作父类来看待,比如下边代码中的子类E ...

  4. c++构造函数的初始化列表(翁恺c++公开课[13])

    初始化列表形式: class Point { private: const float x,y; Point(float xa = 0.0, flato ya = 0.0):y(ya),x(xa) { ...

  5. c++对象初始化(翁恺c++公开课[10])

    c++对象初始化 就是去调用构造函数来完成初始化操作: 构造函数有无参数的构造函数.有参数构造函数.默认构造函数(编译器给我们实现的)...(拷贝构造函数之后说) 注意:默认构造函数只有在我们自己没有 ...

  6. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)

    关于类的继承有三种:public继承.private继承.protected继承 首先说明,关于类的成员变量.函数的权限有三种(public.private.protected) 我们通常会让所有的成 ...

  7. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)

    上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑

  8. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)

    运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...

  9. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)

    static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数):c\c++中静态变量.对象 ...

随机推荐

  1. Subroutine 子程序 Perl 第四章

    子程序的定义是全局的,不需要事先声明.若重复定义子程序,后面的覆盖前面的. sub marine { $n +=1; print " Hello ,sailor number $_ ! &q ...

  2. Git的安装和使用(转载)

    转载博客连接:https://www.cnblogs.com/qijunjun/p/7137207.html 实际项目开发中,我们经常会用一些版本控制器来托管自己的代码,今天就来总结下Git的相关用法 ...

  3. 1010 Radix

    1010 Radix 注意点 如111 1 1 10类似情况下,若n为个位数,如果本身比另一个数小,则多少的进制都是没有用的(可能会造成空循环而超时),不过好像没有这么一个测试用例 进制应该比最少数据 ...

  4. 循环select和取赋值

    bootstrap: <!--列表容器--> <div class="panel-body" style="position:relative;&quo ...

  5. Idea 工具快捷合集

    官方下载地址 https://www.jetbrains.com/idea/download/#section=windows 商业版 与 社区版,商业版具有更多的功能 快捷一.修改 terminal ...

  6. 位运算(&、|、^、~、>>、<<)

    1.位运算概述 从现代计算机中所有的数据二进制的形式存储在设备中.即0.1两种状态,计算机对二进制数据进行的运算(+.-.*./)都是叫位运算,即将符号位共同参与运算的运算. 口说无凭,举一个简单的例 ...

  7. Android学习06

    从开始学习Android,已经第5天,今天我换了一种方式,去观望了观望别人以及大佬的博客园,今天来做一下对比和反思,以便为后期的努力方向做好更充足的准备.在这里不得不佩服一下大佬们的学习能力和自我控制 ...

  8. Laravel Vuejs 实战:开发知乎 (4)实现找回密码

    资料 : Resetting Passwords   以及 Episode 35 - The Password Reset Flow 由于之前的实现里默认自带重置找回密码功能,不再复述. 默认的重置页 ...

  9. 同步I/O和异步I/O

    同步I/O包括:阻塞,非阻塞,多路复用 阻塞模型:给你送的外卖到了,给你打电话,你不去取,外卖小哥一直在那等你,直到你来,形成阻塞,当然应该给外卖小哥点赞,哈哈哈哈!! 非阻塞模型:取外卖的主人非常饿 ...

  10. VBA 学习笔记 - 变量与常量

    学习资料:https://www.yiibai.com/vba/vba_variables.html 变量和常量命名规则 必须以字母开头 不能包含空格.句点(.).感叹号(!)或字符@,&,$ ...