Boolan C++ 笔记四

泛型编程

泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。STL以迭代器(Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型迭代器(iterators)、泛型容器(containers)以及函数对象(function objects)。STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。

泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。

关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。

泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象,这样的事情;熟悉一些其它面向对象的语言的人应该知道,如Java里面这是通过在List里面存放Object引用来实现的。Java的单根继承在这里起到了关键的作用。然而单根继承对C++这样的处在语言链底层的语言却是不能承受之重。此外使用单根继承来实现通用容器也会带来效率和类型安全方面的问题,两者都与C++的理念不相吻合。

conversation function,转换函数

Boolan C++ 笔记四_第1张图片
上面的是通过操作符重载完成了类型转换,比如Fraction f(3,5),当执行double b = 4+f时,编译器推导f的类型为double,调用重载函数

发现课件上一个问题 :课件上写的是return (double)(m_numerator/m_denominator),实际上运行代码发现并没有得到预期的浮点数,3/5,返回了0.

我觉得是先执行了()中的代码将值存在了int大小的空间(寄存器)这时候已经有数据截断了.再(double)就有问题了

explicit

C++提供了关键字explicit,可以组织不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用

pointer-like classes 关于智能指针

记住连个关键的操作符重载


Boolan C++ 笔记四_第2张图片
px 是私有的成员变量

pointer-like classes 关于迭代器

相对于智能指针要实现更全面的操作符重载

所谓仿函数

就是重载operator ()

template

Boolan C++ 笔记四_第3张图片
类模板


Boolan C++ 笔记四_第4张图片
函数模板


Boolan C++ 笔记四_第5张图片
成员模板

需要注意成员模板要注意继承关系,涉及拷贝构造的问题


Boolan C++ 笔记四_第6张图片
模板特化


Boolan C++ 笔记四_第7张图片
模板偏特化 个数偏


Boolan C++ 笔记四_第8张图片
模板偏特化 范围偏



Boolan C++ 笔记四_第9张图片
template template parameter

通过代码 cout<<__cplusplus<


Boolan C++ 笔记四_第10张图片
数量不定的模板

auto(since C++11)

实质上是通过左右式进行类型推导

ranged-base for (since C++11)

这个类比objective c 里的for in

for(decl : coll){

statement

}

reference

在编译器层面上理解reference就是指针

注意值传递与引用传递的不同,还有函数里面

double imag(const double& im){}

double imag(const double im{}

视为same signature


总结:模板的各种例子还有c++11的特性还需要多写代码熟悉熟悉

你可能感兴趣的:(Boolan C++ 笔记四)