前言:C++最初诞生时,仅仅被称做带类的C。这说明C和C++是一衣带水的关系,随后C++扩充了不少特性,成为了面向对象的一个语言,真正成了扛把子。那么C++有什么优点呢?举个例子类比,一个C代码项目就像是一个冰柜,全部的东西都装在一块,且不说会不会“窜味儿”,看起来很没条理。而C++就像是一个冰箱,有冷藏室冷冻室,冷藏室还有放鸡蛋的地方,放蔬菜的地方...固然这只是其中最先的一个好处:封装性。可是C语言无法写出C++的特性,这就依赖于下面要介绍的C++的其余特性。ios
C++扩展了一些新的特性,其中最主要的包括如下几个:c++
接下来会简单介绍一下每个特性,最后看一下STL的主要的容器。算法
经过抽象,类把一类东西的属性和方法封装到了一块儿。这就是美其名曰“面向对象”的概念。就是代码的组织再也不是流程控制,而是对象的组织。C语言的流程控制是经过判断条件来跳转执行的,而C++对象的组织则是经过继承,多态等方式组织的。编程
class Test { public: int x_; void init(int x, int y,int z); void display() { cout<< x_ << endl; }; private: int y_; protected: int z_; };
上面是一个类的典型定义,从中能够看出把数据和函数封装到了一块,并经过关键字public,private,protected来限制访问权限。数组
从上面的定义看,跟C中的结构体也能够实现相似的功能,可是C语言无法设置访问权限,也有一些人喜欢把C写成C++风格的。数据结构
咱们上面提到过,C语言是组织流程,因此,代码中处处都是条件判断和流程处理。可是在C++中,要组织的倒是一个个对象。要先抽象,定义出对象的雏形。然而,还有一个问题必须解决,C++面向的是对象,可世间对象千千万,大千世界最不缺的就是差别,那么千千万不一样的种类以及实例化的对象该怎么管理呢?答案就是继承和多态。继承解决相同的部分,多态解决差别的部分。这一节就先介绍继承。函数
继承使得新的类没必要彻底从新定义,而是借助于已有的类定义,这大大的减轻了建立管理类的工做。继承可使得新类从基类中获取属性和方法(public继承时)。this
class base{ public: void cacl(int n) {printf("good");} private: int i,j; }; class next : public base{ public: void mix(int m) {printf("well");} };
关于建立新的类时是否须要采用继承的办法,须要注意:若是新类时基类的一种,如,哈士奇是狗的一种,哈士奇还有其余一些属性和方法,如卖萌;这个时候,哈士奇类能够继承狗这个类。另外一种状况是,眼睛是头的一部分,但不能说眼睛是基类,头是派生类,由于头显然没有看东西这个功能。这个时候,建立头这个类时,应该在头这个类种包含眼睛这个类,而不是继承。spa
class head{ public: void cacl(void); class eye eyes; private: int len; };
好了,要建立新类,先抽象找共性,经过继承新的类创建起来了,然而,很快就会遇到一个问题:类的行为千差万别,即便对于同一个方法也会有不一样的表现,如对于吃饭,印度人是手抓着吃,中国人是用筷子,欧美人是用刀叉。这种状况下,若是定义一个基类,要不要定义吃饭这个方法呢?若是不定义,那么各个派生类类就得定义本身的吃饭方法,更要命的是,一个类和另外一个类可能不光吃饭不相同,几乎全部的方法实现起来都不相同...好比,睡觉,休闲,运动都不相同。那么各个派生类都去定义本身的一套,继承不就成了摆设了么?说好的代码重用呢?设计
这就是多态的用处,多态能够实现对于每一个派生的类,当调用同一个方法时,实现不一样的行为,即调用到本身的方法实现。C++的多态能够分为两种:
所谓的静态多态就是经过函数重载的办法实现的,重载能够针对操做符也能够针对函数。用重载时,函数名字相同,参数和返回值不一样,其实是在编译阶段根据参数的类型来肯定使用哪一个函数。
而动态多态是经过虚函数的方式实现的,也就是在基类中先定义虚函数,而后在派生类中定义本身的方法,而后覆盖基类的方法。
#include<iostream> using namespace std; class Base { public: virtual Base* FunTest() { cout << "victory" << endl; return this; } }; class Derived :public Base { public: virtual Derived* FunTest() { cout << "yeah" << endl; return this; } }; int main() { Base b; Derived d; b.FunTest(); d.FunTest(); return 0; }
为了提升C++的开发效率,对代码可以作到重用,STL诞生了,它一开始并非C++的一部分,STL实际上提供了泛型编程在C++上的实现。STL考虑的事情是:对于一个排序功能,不管使用哪一种数据结构,数组也好,链表也好;不管哪一种数据类型,int也好,float也好,都应该可以实现排序功能。为了这个目标,STL在实现时,划分红了三个部分实现
容器提供了经常使用的数据结构,set,map,list,vector等;算法提供了排序等几十种算法;而迭代器呢?迭代器实际上就是要匹配容器和算法,根据不一样的容器元素类型,采用对应的排序实现。如,数组排序和链表排序。
那么再回过头来看,STL是标准模版库的简写。模版是什么?咱们前面说到过STL是为了提供泛型支持,回想一下会发现,函数重载是否是也解决了部分问题?(函数重载经过实现多个参数不一样的原型,也能提供部分泛型支持)。可是,一直重载函数也不是一个有效的办法来解决泛型支持问题,因此,模版诞生了。固然,这里一直没有说类模版,只提到了函数模版。模版的典型定义以下:
template<typename(或class) T> T fuc(T x, T y) { T x; //…… }
接下来简单介绍一下STL提供的几种容器:
c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector相似,可是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。
vector - 须要包含#include<vector>
list - 须要包含#include<list>
map - 须要包含头文件#include<map>
<key,value>
对儿的结构,并自动排序。主要的操做是:
C++提供了面向对象的设计方法,不少特性都是围绕着类和对象的建立,管理,使用展开的。本文只简单介绍了C++中的一些关键东西,还有更多细节的东西,如构造函数,析构函数,智能指针等暂时略去不表。可是只要掌握了C++的核心内容,细节使用随着经验积累,天然会心中有天地。