1:malloc与free;new与delete
(1)malloc与free是C/C++语言的标准库函数,new/delete是C++运算符。
(2)new自动计算需要分配的空间,malloc手工计算字节数。
(3)new是类型安全的,malloc不是。
int p=new float[2];//编译出错
int p=(int)malloc(2sizeof(double));//无措
(4)new:调用构造函数,delete调用析构函数;
malloc:不调用构造函数,free不调用析构函数。
2:引用
(1)引用必须初始化。
(2)引用不能改变为另一个对象的引用。
(3)sizeof(引用)得到所指对象的大小。
(4)给引用赋值改变的是其所指对象的值。
3:野指针
(1)指针变量创建时,未赋为NULL。
(2)指针调用free或delete释放后,未将其设为NULL(只内存释放,指针本身没有释放).
(3)指针操作超越了变量的作用范围。
4:static作用
(1)隐藏(a.c;main.c)
例:a为全局变量,msg为函数。a.c中定义,main.c中可用;若为static类型,main.c中不可用。
(2)默认初始化为0。
(3)保持变量内容的持久性。
(4)static成员变量:static成员变量实现了同类对象间信息共享;static成员类外存储,求类大小,并不包含在内。
static成员是命名空间属于类的全局变量,存储在data区;static成员只能类外初始化。可以通过类名仿问(无对象生成时亦可),也可以通过对象访问。
(5))static成员函数:1,静态成员面数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。2,静态成员面数只然访问静态数据成员。原因:非静态成员面数,在调用时this指针被当作参数传进。而静态成员面数属于类,而不属于对象,没有this指针。
5:不能为虚函数:非成员函数、静态成员函数、构造函数、友元函数。
(1)非成员函数:只能被重载,不能被覆盖。
(2)静态成员函数:所有对象共享,不归某个具体对象所有,没有动态绑定的必要性。
(3)构造函数:B继承A,若只执行B的构造函数,A的构造函数不执行,A就不能构造。
(4)友元函数:C++不支持友元函数继承。
6:C语言预处理
宏定义与宏替换;文件包含;条件编译
7:const与指针
(1)double *ptr=&value;//ptr是指向一个double类型的指针,ptr的值可变,ptr指向的value的值也可变。
(2)const double *ptr=&value;//ptr是指向一个const double类型的指针,ptr的值可变,不能通过ptr改变value的值。
(3)double *const ptr=&value;//ptr是指向一个double类型的const指针,ptr的值不可变,可通过ptr改变value的值。
(4)const double *const ptr=&value;//ptr是指向一个const double类型的const指针,ptr的值不可变,不能通过ptr改变value的值。
8:函数指针
bool (*pf)(const string &,const string &);
pf为指向函数的指针,它所指向的函数带有2个const string &类型的形参和bool类型的返回值。
9:当类B从类A继承而来,而类A的析构函数不是虚函数,会发生什么?
当基类指针PA指向用new运算符生成的派生类对象B时,delete基类指针时,只会运行基类的析构函数,而不会执行派生类的析构函数,派生类部分没有释放而造成释放不彻底。
10:拷贝构造函数与“=“赋值运算符
Class X
{
public:
X();
X(const X&);//拷贝构造函数
X & operator =(const X &a); //赋值函数
}
例如:
class CExample
{};
int main()
{
CExample e1 = new CExample;
CExample e2 = e1;//调用拷贝构造函数
CExample e3(e1);//调用拷贝构造函数
CExample e4;
e4 = e1;//调用=赋值运算符
}
注:拷贝构造函数的参数必须为引用,若不为引用,则为值传递方式,而值传递方式会调用该类的拷贝构造函数,从而无穷递归的调用拷贝构造函数。
11:浅拷贝与深拷贝
浅拷贝就比如像引用类型,而深拷贝就比如值类型。
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。
举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。
深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。
12:空类
class Empty
{
Empty();//默认构造函数
Empty(const Empty&);//复制构造函数
~Empty();//析构函数
Empty&operator=(const Empty&);//赋值运算符
Empty*operator&();//取址运算符
const Empty*operator&()const;//取址运算符const
}