为什么要有模板(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. cpu io disk mem监控 python

    import psutil def cpu_information(): #scputimes(user=26.9, nice=0.1, system=50.27, idle=8551.89, iow ...

  2. redis 基础操作教程

    1.linux 安装redis : Linux 下安装 下载地址:http://redis.io/download,下载最新稳定版本. 本教程使用的最新文档版本为 2.8.17,下载并安装: $ wg ...

  3. 新手第一次在GitHub上提交代码完整教程

    提交步骤: 1.创建github repository(仓库) 2.安装git客户端 3.为Github账户设置SSH key 4.上传本地项目到github 一.创建github repositor ...

  4. layui数据表格固定头部和第一列、colspan合并列

    刚看到原型图的时候,纳尼?不是跟我开玩笑吧,小女子资历尚浅,还真没做过像这样的功能,然后就是各种找度娘,可是都没有找到合适的,很多都是行合并,真的是头疼呀!再纠结是用VUE实现还是用layui实现好, ...

  5. Laravel Vuejs 实战:开发知乎 (2)用户登录

    1.安装一个给用户提示的扩展包: 二选一: https://github.com/laracasts/flash [我选的这个]https://github.com/oanhnn/laravel-fl ...

  6. c++写入注册表

    一.说明:      注册表是Windows重要组成部分,注册表记录了大量有关电脑软硬件的信息.注册表中的值通过其名称标识.值名称由与键名相同的字符组成.值本身可以是字符串.二进制数据或者是32位无符 ...

  7. 【C语言】判断某一正整数是否为完数

    什么是完数? 如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”). 例如,6的因子为1.2.3,而 6=1+2+3,因此6是“完数”. 程序框图:m  问题分析 根据完数的定义,解决本题的 ...

  8. Flex:实例

    目的: 代码: <!--pages/index/index.wxml--> <view class="container"> <view class= ...

  9. C# DataTable去重,根据列名去重保留其他列

    //去掉重复行 DataView dv = table.DefaultView; table = dv.ToTable(true, new string[] { "name", & ...

  10. linux开机启动项问题。6版本与7版本不同之处 。

    参考 网址:https://blog.csdn.net/weixin_41909810/article/details/82775247