顺序容器分三种:vector,list,deque;为定义一个容器类型的对象,必须先在头文件中包含此容器。所有容器都是类模板,都有默认构造函数,用于创建指定对象的空容器。
容器内定义的类型一般都有统一的接口,使用前加作用域操作符。
容器内类型必须满足两个基本约束:1 可赋值;2 元素可复制;因此引用类型不可作容器元素(不可赋值),容器可作容器元素,即多维容器。
迭代器相当于指针,指向容器中元素。vector和deque容器中的迭代器支持一般算术操作符。迭代器的定义:vector<int>::iterator iter = vec.begin() + vec.size()/2;
此句获得容器对象vec中点位置。
迭代器范围:左闭合区间[beg,end);end指向超出范围元素的下一个位置。
一些容器操作会改变容器内元素的位置状态,此时,原指向元素的迭代器就会失效,失效的迭代器和悬垂指针一样危险
每种顺序容器都定义了一组有用的类型和操作,如size_type,iterator;操作有c.begin(),c.end(),返回指向容器c第一个元素的迭代器和超出最后一个元素的下一个位置的迭代器。
容器支持使用关系运算符比较。
vector中元素是连续存储的,因此随机访问较方便可直接定位,list中元素离散存储,插入元素不影响其他元素位置较方便,deque中在始末位置添加元素较方便。
string可看成一种字符容器,支持一般容器的很多类型和操作。
stack、queue和priority_queue称为容器适配器。
pair类型也是一种标准库定义的类模板,pair<string,string> line
; 用line.first和line.second直接访问两个元素。
关联容器有map,set等,支持顺序容器的大部分操作。
泛型算法用于解决各类容器除容器操作外的更复杂问题,它本身不执行容器操作,通过迭代器和迭代器操作实现。如find函数,fill函数,find_first_of函数等。使用泛型算法必须包含algorithm头文件。使用泛型算术算法必须包含numeric头文件。这些函数的头两个参数是迭代器范围。算法有共同的设计基础,一般不使用重载函数。
friend:友元关键字,用于类或外部函数访问类的私有成员的授权声明。
类中的复制构造函数、析构函数和赋值操作符统称为复制控制,编译器自动实现这些操作,我们也可以定义自己的版本。实现复制控制操作最困难的部分,在于何时我们应自定义覆盖默认版本,最常见的是类中含有指针成员时,依赖于默认定义会带来灾难。
面向对象编程基于三个基本概念:数据抽象(通过类实现)、继承(通过类派生)和动态绑定(编译器在运行时决定使用基类函数还是派生类函数)。
除了构造函数之外,任意非static成员函数都可以是虚函数,前面加关键字virtual,虚函数是派生类中需要重新定义的函数。引入虚函数是为了解决多重继承带来的多义性问题。
只允许除自身外继承类访问的成员用访问标号:protected标记,为了定义派生类,使用派生列表指定基类:class classname : access-label base-class {}
其中,access-label是public,protected,private之一,规定公有继承,私有继承和受保护继承。
如何设计句柄类。C++面向对象编程时指针和引用的调用根据它们所绑定的类型而动态确定,所以不能使用对象实现面向对象编程,必须使用指针或引用。C++中通过定义句柄类技术,存储和管理基类指针。
对类成员初始化可以在构造函数初始化列表阶段完成,也可以在构造函数函数体中通过赋值完成,但const成员,无默认构造函数的类类型成员以及引用类型成员不能通过赋值,只能在初始化列表中完成初始化。
类中的static成员是类的组成部分但不是对象的组成部分,也即static成员不能通过this指针调用。
可以在const成员函数中定义mutable成员,它的值可以修改。
类的static成员在类中声明,类体外定义,它不属于任何特定对象,因此不能通过this指针显式或隐式调用,调用和定义时加类型名称限定符::。static类成员体现了其保持封装性的同时实现独立于特定对象外的调用。类中声明时加关键字static,类体外定义不需要,例如:static double interestRate;//类中声明
,可以是私有也可以为公有 double Acccout::interestRate = initial(); //类体外定义并初始化。
注意类外定义时其作用域仍位于类内,所以可以不加限定地使用类成员变量和函数。static类成员类型可以是自身类类型,而常规类成员只能被限定为自身类类型的引用或指针。例外:const static整型类成员可以在类内部定义并用常量表达式初始化。
当类已经定义,类的数据成员才能被指定为该类类型,否则只能是该类型的指针或引用。因此,在类体中,由于类名出现即认为该类已声明,所以可以定义指向该类型的指针或引用的数据成员。
const类对象只能调用类的const成员函数,这也是很多类必须重载const成员函数版本的原因。不论是const成员函数还是非const成员函数都可以使用类的所有数据成员。良好的编程习惯是:将不修改数据成员的成员函数统一定义为const成员函数。