c++模板(翁恺c++公开课[34-35]学习笔记)
为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢?
- 定义基类?可以实现,很多情况下可能不够简明的表达设计思想
- 克隆代码(写一段X关于list的定义,再写一段Y关于list的定义)但是后期无法统一对其管理
- 做一个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借用上一段代码
目录
- c++(翁恺浙大公开课) 笔记0
- static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
- c++对象初始化(翁恺c++公开课[10])
- c++构造函数的初始化列表(翁恺c++公开课[13])
- c++继承:公有、私有、保护
- c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
- c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
- c++多态性及多态的内部实现(翁恺c++公开课[23-24])
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
- c++模板(翁恺c++公开课[34-35]学习笔记)
- 最好不要在头文件中写函数定义
c++模板(翁恺c++公开课[34-35]学习笔记)的更多相关文章
- c++中的Exceptions异常处理(翁恺c++公开课[36])
Exceptions用于处理Run-time Error: //文件读取的异常捕获伪代码 try{ open the file; determine its size; allocate that m ...
- c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...
- c++多态性及多态的内部实现(翁恺c++公开课[23-24])
多态是在父类函数的前面加上 “virtual” 关键字,使子类与父类同名的函数产生一种联系: 多态会用到两个特性:向上造型.动态绑定 向上造型是指:拿一个子类对象当作父类来看待,比如下边代码中的子类E ...
- c++构造函数的初始化列表(翁恺c++公开课[13])
初始化列表形式: class Point { private: const float x,y; Point(float xa = 0.0, flato ya = 0.0):y(ya),x(xa) { ...
- c++对象初始化(翁恺c++公开课[10])
c++对象初始化 就是去调用构造函数来完成初始化操作: 构造函数有无参数的构造函数.有参数构造函数.默认构造函数(编译器给我们实现的)...(拷贝构造函数之后说) 注意:默认构造函数只有在我们自己没有 ...
- c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
关于类的继承有三种:public继承.private继承.protected继承 首先说明,关于类的成员变量.函数的权限有三种(public.private.protected) 我们通常会让所有的成 ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数):c\c++中静态变量.对象 ...
随机推荐
- 【C语言】判断学生成绩等级
方法一:if-else #include<stdio.h> int main() { printf("请输入成绩:\n"); float score; scanf_s( ...
- layui+ajax+select
1.看效果 2.前端代码 <div class="layui-form-item"> <label class="layui-form-label&qu ...
- 自定义控件之绘图篇(四):canvas变换与操作
具体操作见下面链接: http://blog.csdn.net/harvic880925/article/details/39080931/
- 手写webpack配置文件
webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理,它能有Grunt或Gulp所有基本功能. We ...
- queue 官方运用
import threading import random,time import queue q_init = queue.Queue(maxsize=5) import logging logg ...
- ubuntu mysql新增用户并开启远程连接
1.首先用root用户登录mysql mysql -u root -p 输入密码后登录成功 2.新建用户 use mysql; select host,user from user;(查看现有用户) ...
- 新手第一次在GitHub上提交代码完整教程
提交步骤: 1.创建github repository(仓库) 2.安装git客户端 3.为Github账户设置SSH key 4.上传本地项目到github 一.创建github repositor ...
- ES6-三点运算符
首先理解一下函数总的arguments变量,这个变量是函数内部自动生成的,他用来保存传入函数的实参,是一个伪数组. 例: function fun(a,b){ console.log(argument ...
- debug assertion failed问题解决
运行过程中出现上述问题,后来发现是vector越界问题....解决办法:不要越界就好了...
- Python学习(四)—— 列表和元组的类中方法
列表 list:用中括号括起来,用“,”分割每个元素,列表中的元素可以是 数字.字符串.列表.布尔值......所有东西,可以说就是一个“集合” li = [1,3,5,'alex','age',[' ...