美文网首页
网易云C++第五周笔记(GeekBand)

网易云C++第五周笔记(GeekBand)

作者: 林小七Raul | 来源:发表于2016-08-14 11:17 被阅读0次

    1.C++模板
    C++模版是C++泛型编程的基础,一个模版就是一个创建类或函数的公式,比如我们在比较大小时,一般要根据不同数据类型定义不同的函数,比如int 型,double型,char型等,我们要定义三个函数


    屏幕快照 2016-08-14 09.56.40.png

    以上两个函数基本相同,只是型参类型不同而已。如果每一个这样功能的函数都一一定义显然不符合实际,我们可以使用模板来完成这一工作。


    屏幕快照 2016-08-14 10.08.53.png
    在使用时,传入不同类型的参数即可
    屏幕快照 2016-08-14 10.10.39.png

    可以看出,函数模板类似于一个抽象类,具有自动识别的功能,当我们分别传入int和double类型参数时,compare会根据不同类型的参数,进行相应的编译,编译器会推断出模板的参数,我们将这一过程称之为实例化函数模板。
    函数模板需要编译两次,第一次是在没有实例化前,编译器检查语法是否错误,第二次是在实例化期间,检查调用是否合法。
    在编译过程中,多参数要进行推导,类型是由实参决定,而且不允许自动转换,必须要进行强制转换或者指定转换

    屏幕快照 2016-08-14 12.29.15.png 屏幕快照 2016-08-14 12.30.57.png

    2.C++类模板
    类模板是用来生成类的公式,与函数模板不同的是,编译器不能为类模板推断模板参数的类型,同时,为了使用类模板,我们必须在模板名后的尖括号中提供额外的信息,用来代替模板参数的模板实参列表。


    屏幕快照 2016-08-14 15.44.25.png

    在Blob模板中,有一个T类型参数,用来表示Blob保存的元素类型。我们将元素访问操作的反=返回类型定义为T &。当用户实例化Blob时,T就会被替换为特定的模板实参类型。

    2.实例化类模板
    当使用一个类模板时,我们必须要提供额外的信息,就是显式模板实参,它们被绑定到模板参数,编译器使用这些模板实参来实例化特定的类
    比如:


    屏幕快照 2016-08-14 16.07.38.png

    a和a1使用相同的特定类型版本的Blob,当Blob模板实例化出一个类时,他会重写Blob模板,将模板参数T的每一个实例替换为模板的实参。

    3.模板的特化
    类模板的特化就是对模版的某些类模板参数类型做特化,特化的好处就是对于一些特殊的类型,可以做一些特别的优化或者是不同的实现,同时也可以避免在实例化类的时候引起一些可能产生的诡异行为。特化一个类模板的时候意味着需要特化其所有数化的成员函数
    特化一个类,需要使用如下写法:


    屏幕快照 2016-08-16 21.28.27.png

    先申明一个template<>的空参数列表类,然后在类名称后面的尖括号中显式指明参数类型。
    在类模板中可以进行偏特化,可以理解为部分特化,比如一个类模板定义如下

    屏幕快照 2016-08-16 21.41.27.png

    他的几种偏特化模板如下:

    屏幕快照 2016-08-16 21.41.33.png

    4.容器
    容器vector是标准库表示对象的集合,集合中每一个对象都有一个与之对应得索引,索引用于访问对象。容器的基本用法如下:

    屏幕快照 2016-08-21 20.14.08.png

    还有一些操作就不一一举例,在vector使用后应该要进行内存清理,vector的一种内存清理如下:


    屏幕快照 2016-08-21 20.17.06.png

    相关文章

      网友评论

          本文标题:网易云C++第五周笔记(GeekBand)

          本文链接:https://www.haomeiwen.com/subject/rbyesttx.html