摘要:
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出。但若以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象(所有的数据)都存放在容器之内,而容器一定需要配置空间以置放资料。为什... 阅读全文
摘要:
前开后闭开区间表示法[)任何一个STL算法,都需要获得由一对迭代器(泛型指针)所标示的区间,用以表示操作范围,这一对迭代器所标示的是个所谓的前闭后开区间,以[first,last)表示,也就是说,整个实际范围从first开始,直到last-1.迭代器last所指的是“最后一个元素的下一位置”。这种o... 阅读全文
摘要:
前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行了,因为它最多只支持两个参数,那还有什么办法呢?这时就需要使用boost库里强大的绑定器bind了。... 阅读全文
摘要:
increment/dereference操作符在迭代器的实现上占有非常重要的地位,因为任何一个迭代器都必须实现出前进(increment,operator++)和取值(dereference,operator*)功能,前者还分为前置式(prefix)和后置式(Postfix)两种。有写迭代器具备双... 阅读全文
摘要:
如果class内含const static integral data member,那么根据C++标志规格,我们可以在class之内直接给予初值。所谓integral泛指所有的整数型别(包括浮点数),不单只是指int,下面是一个例子:#includeusing namespace std;temp... 阅读全文
摘要:
所谓临时对象,就是一种无名对象。它的出现如果不在程序员的预期之下(例如任何pass by value操作都会引发copy操作,于是形成一个临时对象),往往造成效率上的负担。但有时候刻意制造一些临时对象,却又是使程序干净清爽的技巧。刻意制造临时对象的方法是,在型别名称之后直接加一对小括号,并可指定初值... 阅读全文
摘要:
在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。(3)只授予对类模板或函数模板的特定实例的访问权的友元声明。(1)普通友元:templateclass A{ friend void f... 阅读全文
摘要:
关键字 typename在C++标准化过程中,引入关键字typename是为了说明;模板内部的标识符可以是一个类型。譬如下面的例子:templateclass MyClass{ typename T::SubType *ptr; ...}; 上面的程序中,第2个typename被用来说... 阅读全文
摘要:
对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数。在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定。但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化。非类型... 阅读全文
摘要:
---恢复内容开始---感觉C++ templates这本书写的不怎么好,挑写重点记一下:1 与函数模板一样,只能在同一个头文件中声明和定义类。类模板的声明类模板的声明和函数模板的声明很相似:在声明之前,我们先(用一条语句)声明作为类型参数的标志符;我们继续使用T作为标志符;template cla... 阅读全文
摘要:
操作系统:centos 6.4STL源码版本:3.3前言: 要看一个项目的源码,首先要选中切入点。 那么在sgi stl 标准库中,其切入点是什么呢? 答案是:stl_config.h 文件。不同的编译器对C++语言的支持程度不尽相同。为了具备广泛移植能力,SGI STL 定义了一个环境组态文... 阅读全文
摘要:
面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况。不同之处在于:OOP能处理类型在程序运行之前都未知的情况;而在泛型编程中,在编译时就能获知类型了。前面介绍的容器、迭代器和算法都是泛型编程的例子。当我们编写一个泛型程序时,是独立与任何特定类型来编写代码的。当使用一个泛型程序时,我... 阅读全文
摘要:
和其他类一样,位于继承体系中的类也需要控制当其对象执行一系列操作时发生什么样的行为,这些操作包括创建、拷贝、移动、赋值和销毁。 阅读全文
摘要:
每个类都有自己的作用域,在这个作用域内我们定义类的成员。 阅读全文
摘要:
每个类分别控制自己的成员初始化过程,与之类似,每个类还分别控制着成员对于派生类来说是否可访问。受保护的成员如前所述,一个类使用protected关键字来声明那些它希望与派生类分享但是不想被其他公共访问使用的成员。protected说明符可以看做是public和private中和后的产物: 阅读全文
摘要:
纯虚函数和普通的虚函数不一样,一个纯虚函数无须定义。我们通过在函数体的位置(即在声明语句的分号之前)书写=0就可以将一个虚函数说明为纯虚函数。其中,=0只能出现在类内部的虚函数声明语句处。指的注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部。也就是说,我们不能在类的内部为一个=0... 阅读全文
摘要:
如前所述,在C++语言中,当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定。因为我们直到运行时才能知道到底调用了那个版本的虚函数,所以所以虚函数都必须有定义。通常情况下,如果我们不使用某个函数,则无须为该函数提供定义。但是我们必须为每一个虚函数都提供定义,而不管它是否被用到了,这是因为连... 阅读全文
摘要:
定义基类对于基类,我们需要记住的是作为继承关系中根节点的类通常都会定义一个虚析构函数。基类通常都会定义一个虚析构函数,即使该函数不执行任何实际操作也是如此。成员函数和继承派生类可以继承其基类的成员,也可以对基类中的虚函数进行重新定义。换句话说,派生类需要对这些操作提供自己的新定义以覆盖(overri... 阅读全文
摘要:
面向对象程序设计基于四个基本概念:数据抽象、封装、继承和动态绑定。类的基本思想是数据抽象和封装。1 数据抽象数据抽象是一种依赖于接口和实现分离的编程技术。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。2 封装封装实现了类的接口和实现的分... 阅读全文
摘要:
前面我们看到由一个实参调用的非显式构造函数定义了一种隐式的类型转换,这种构造函数将实参类型的对象转换成类类型。我们同样能定义对于类类型的类型转换,通常定义类型转换运算符可以做到这一点。转换构造函数和类型转换运算符共同定义了类类型转换,这样的转换有时也被称作用户定义的类型转换。类型转换运算符类型转换运... 阅读全文