auto
存储类型:采用栈堆方式分配内存空间,属于一时性存储,其存储空间能够被若干变量屡次覆盖使用。register
存储类型:存放在通用寄存器中externa
存储类型:所用函数和程序段中均可以引用static
存储类型:在内存中是以固定地址存放的,在整个程序运行期间都有效。定义时使用关键字 inline 的函数叫内联函数,编译器在编译时在调用处用函数体进行替换,节省了参数传递,控制转移等开销,内联函数体内不能有循环语句和 switch 语句,内联函数的定义必须出如今内联函数第一次调用以前,对内联函数不能进行异常接口声明。ios
重载函数的函数名是相同的,但它们的参数的个数和类型不一样,编译器根据实参和形参的类型和个数的最佳匹配,自动肯定调用那一个函数。c++
公有类型成员用public
关键字声明,共有类型定义了类的外部接口;私有类型的成员用private
关键字声明,只容许本类的函数成员来访问,而类外部的任何访问都是非法的,这样,私有成员就整个隐蔽在类中,在类的外部根本就没法被看到,实现了访问权限的有效控制。
数据成员和成员函数均可觉得公有的或私有的,但数据成员最好是声明为私有的。算法
protected
用来声明保护类型的成员,保护类型的性质和私有类型的性质类似,其差异在于继承和派生时派生类的成员函数能够访问基类的保护成员。数组
构造函数的做用就是在对象被建立时利用特定的值构造对象,讲对象初始化一个特定的状态,使此对象具备区别于彼对象的特征,完成的就是一个从通常到具体的过程,构造函数在对象建立的时候由系统自动调用。
析构函数与构造函数的做用几乎正好相反,它是用来完成对象被撤出前的一些清理工做,通常状况下,析构函数是在对象的生存周期即将结束的时刻由系统自动调用,它的调用完成以后,对象也就消失了,相应的内存空间也被释放。安全
拷贝构造函数是一种特殊的构造函数,其形参是本类的对象的引用,其做用是使用一个已经存在的对象,去初始化一个新的同类的对象。在如下三种状况下会被调用:
当用类的一个对象去初始化该类的另外一个对象时;
若是函数的形参是类对象,调用函数进行形参和实参结合时;
若是函数的返回值是类对象,函数调用完成返回时。闭包
普通数据成员属于类的一个具体的对象,只有对象被建立了,普通数据成员才会被分配内存。而静态数据成员属于整个类,即便没有任何对象建立,类的静态数据成员变量也存在。由于类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显示的初始化,必定要在类外进行。外部访问类的静态成员只能经过类名来访问。类的静态成员函数没法直接访问普通数据成员(能够经过对象名间接的访问),而类的任何成员函数均可以访问类的静态数据成员。静态成员和类的普通成员同样,也具备public、protected、private
三种访问级别,也能够具备返回值、const
修饰符等参数。函数
静态成员函数的地址可用普通函数指针储存,而普通成员函数地址须要用 类成员函数指针来储存。静态成员函数不能够调用类的非静态成员。由于静态成员函数不含this指针
。静态成员函数不能够同时声明为 virtual、const、volatile
函数。this
友元是不一样的类之间、类与类外的函数之间的共享数据的机制。使用friend关键字声明,友元函数能够访问相应类的保护成员和私有成员。友元类它的全部成员函数都是相应类的友元函数。友元关系不具备交换性、传递性,也不能被继承。设计
*
称为指针运算符,是一个一元运算符,表示指针所指向的对象的值;&
称为取地址运算符,也是一个一元操做符,是用来获得一个对象的地址。
我的认为它们是一对做用相反的运算符。指针
引用是给另一个变量起别名,因此引用不会分配内存空间。声明方法:(类型标识符 &引用名=目标变量名;(如int &r = num;)
)。指针是一个存放地址的变量,须要分配内存空间,声明方法:(类型标识符 *指针名 = 目标变量地址(int * p = &a;)
)。对于声明后的指针,p指向的是变量a的地址,*p 表示的是变量a的内容。在C++中使用引用代替指针能够提升程序的安全性,但当须要对变量从新赋值以另外的地址或赋值为NULL时只能使用指针。
const int * p1
声明了一个指向整型常量的指针p1,所以不能经过指针p1来改变它所指向的整型值;int * const p2
声明了一个指针型常量,用于存放整型变量的地址,这个指针一旦初始化后,就不能被从新赋值。
(理解方法:主要是参考const
修饰的谁)。
空指针:通常声明一个指针变量赋值为NULL,这就是空指针,各个类型的空指针都存在确确实实的内存地址,可是不会指向任何有效的值的内存地址,对空指针操做,例如访问属性和方法,会抛出空指针异常,由于空指针指向的内存地址没有对应的物理地址。
野指针:指那些释放内存,可是指针赋值为空,这时候的指针指向任意地址,好可怕,例如指向内核地址或不属于本程序的内存地址,程序会被kill,即奔溃。
内存泄漏:分为堆泄露和资源泄露 两种,内存分配失败或者内存分配成功却没有指针指向它(即没法操做该内存),会致使内存分配的愈来愈多,致使系统内存不够而终止程序。
用malloc
或者 new
申请内存以后,应该当即检查指针值是否为 NULL ,防止使用指针值为NULL的内存;
不要忘记数组和动态内存赋初值,防止未被初始化的内存做为右值使用;
避免数组或者指针下标越界,特别要小心“多1”或者“少1”的操做;
动态内存的申请与释放必须配对,防止内存泄露;
用free
或者delete
释放了内存以后,当即将指针设置为NULL,防止产生“野指针”;
首先要明确从基类继承的成员的访问控制属性受两方面因数的影响(一、成员在基类中原来声明的访问控制属性;二、继承方式)。在运用常常关系时,要注意基类的构造函数和析构函数都不能继承,可是在创建派生类对象时基类的构造函数会被自动调用,派生类消亡时,会自动调用基类的析构函数。在多继承的状况下,若是存在公共基类,就会出现成员标识二义性的问题,这是将公共基类做为虚基类继承是一个比较好的解决方案(虚基类继承的语法格式:class 派生类名:virtual 继承方式 基类名
)。
多态是指一样的消息被不一样类型的对象接收时致使彻底不一样的行为,是对类的特定成员函数的再抽象。C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。
带有纯虚函数的类是抽象类,抽象类的主要做用是经过它为一个类族创建一个公共的接口,使它们可以有效的发挥多态特性。抽象类声明了一组派生类共同操做接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类本身给出。但抽象类的派生类并不是必定要给出纯虚函数的实现,若是派生类没有给出纯虚函数的实现,这个派生累仍然是一个抽象类。
在C++中,不能声明虚构造函数,多态是不一样的对象对同一消息有不一样的行为特性,虚函数做为运行过程当中多态的基础,主要针对对象的,而构造函数是在对象产生以前运行的,所以虚构造函数是没有意义的。能够虚析构函数,析构函数的功能是在该类对象消亡以前进行一些必要的清理工做,若是一个类的析构函数是虚函数,那么由它派生而来的全部子类的析构函数也是虚函数,析构函数设置为虚函数以后,在使用指针引用时能够动态连编,实现运行时的多态,保证使用基类的指针就可以调用适当的析构函数针对不一样的对象进行清理工做。
STL的容器库包括7种基本容器:向量(vector)、双向队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。这7种容器能够分为两种基本类型:顺序容器好关联容器。
STL根据迭代器的功能,将它们分为5类:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器。
STL标准模板库中的算法大体分为4类:非可变序列的算法(不会改变容器的内容)、可变序列的算法、排序相关的算法、通用数值算法。
I/O 流类库是一个提供输入/输出功能的、面向对象的类库。
流是对输入/输出的一个抽象表述、程序经过从流中提取字符和向流中插入字符来实现输入输出。通常来讲、流是与实际字符源或目标相关的,例如磁盘文件、键盘或显示器,因此对流进行的提取或插入操做实际上就是对物理设备的操做。
标准输入/输出流对象时链接程序与标准输入/输出设备的,经常使用的标准输入流有cin
,标准输出流有:cout、cerr、clog
。标准流对象都是在<iostream>
中预先声明好的。
当一个函数在执行的过程当中出现了一些不日常的状况,或运行结果没法定义的状况,使得操做不得不被中断时,这就是所谓的异常。异常一般是用throw关键字产生的一个对象,用来代表出现了一些意外的状况。C++的异常处理机制有不少优势,可使的异常的引起和处理没必要在一个函数中,这样底层的函数能够着重解决具体问题,而没必要过多的考虑异常的处理。上层调用者能够在适当的位置设计对不一样类型异常的处理。C++提供了三个关键字来对异常进行处理:
try
:可能抛出异常的程序段必须以try开。紧跟着try的是一段包含在大括号中的程序,这段程序有可能抛出异常。
throw
:异常要经过关键字throw来抛出。异常对象的类型决定那一个catch语句能够捕获这一异常。
catch
:处理异常的程序必须以catch开始。跟随在catch后面的是一段包含在大括号中的程序。
#define
是C语言提供的宏定义命令,其主要目的是使程序编写规范,修改调试容易,并在必定程度上提升程序的运行效率。使用#define
命令将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。该命令有两种格式:一种是简单的宏定义,另外一种是带参数的宏定义。
C++中lambda函数是做为C++11新特新添加到C++中的,其主要是以匿名函数捕获scope内变量的方式构造闭包(closure)。相关标准参考:c++ reference