—————————————————————————————————

13,数组和指针的区别?

数组使用的是一块连续的内存空间;

指针存储的是某个变量存储空间的地址。

注意:
a,数组指针:指向数组的指针。
1维:
申请:int *p = new int[10]
释放: delete[] p
2维:
申请:int *p[10] = new int[10][10]
释放:delete[] p
3维:
申请:int (*p)[10]10] = new int[10][10][10]
释放:delete[] p
b,指针数组:一个数组里放的是相同类型的指针。如int *a[10],整体就是一个指针数组。
初始化:a[1] = new int[num]
释放:delete a[1]

14,数组和链表的区别?

数组里的元素是连续存放的,优点是访问方便,缺点是对空间的利用率低;

链表里的元素是不连续存放的,优点是对空间的利用率高,缺点是对元素的访问相对数组比较麻烦。

当我们只是对元素访问的时候,且使用的空间不大时,考虑数组;

当我们需要频繁插入删除元素的时候,且使用的空间相对比较多时,考虑链表。

注意:
链表和数组,本身和C++没有关系,因为很多语言都可以实现它们。

15,静态库和动态库(共享库)的区别?

库是已经写好的,可以复用的代码。

程序编辑->预编译->编译->汇编->链接->程序执行

静态库:

windows系统上是.lib后缀,linux系统上是.a后缀,发生阶段是“链接”;

在链接阶段,静态库和汇编产生的.o文件以及引用一起被链接到可执行文件当中,那么可执行文件就显得“臃肿”;

优点:因为静态库在编译时已经链接了函数库,所以程序执行上不需要函数库,可移植性强。

需要打包工具。

动态库:

windows系统上是.dll后缀,linux系统上是.so后缀,发生阶段是“执行”;

动态库在函数执行时被载入到内存中,和其他程序共享,所以又叫共享库。

优点:避免了对空间的浪费。

不需要打包工具,软件可实现。

详细可看参考6。

16,重载和重写的区别?

重载(overload):函数名相同,参数不同。

重写(override,又叫覆盖):子类重新定义父类中的虚函数,名称和参数相同,但是实现不同。

重写注意:
1,不能是static类型,只能是virtual类型;
2,函数名称必须相同,参数也必须相同;
3,重写函数的访问权限可以不同,即可以是public,也可以是protected。

重定义(redefining):子类重新定义父类中的非虚函数,名称必须相同,参数可以不同。

class Base {
private:
virtual void display() { cout<<"Base display()"<<endl; }
void say(){ cout<<"Base say()"<<endl; }
public:
void exec(){ display(); say(); }
void f1(string a) { cout<<"Base f1(string)"<<endl; }
void f1(int a) { cout<<"Base f1(int)"<<endl; } //overload,两个f1函数在Base类的内部被重载
};

class DeriveA:public Base{
public:
void display() { cout<<"DeriveA display()"<<endl; } //override,基类中display为虚函数,故此处为重写
void f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; } //redefining,f1函数在Base类中不为虚函数,故此处为重定义
void say() { cout<<"DeriveA say()"<<endl; } //redefining,同上
};


class DeriveB:public Base
{
public:
void f1(int a) { cout<<"DeriveB f1(int)"<<endl; } //redefining,重定义
};

代码来源:参考7

17,堆和栈的区别?

C++中,内存分为5个区:堆,栈,自由存储区,全局/静态存储区,常量存储区。

堆:是由new分配的内存块,程序员自己代码释放,编译器不管,如果程序员没有释放,在程序结束后,系统会自己回收资源。

栈:是程序需要时自动分配,不需要时自动清除的变量存储区。主要放局部变量,函数参数等。

自由存储区:由malloc等申请的存储空间,和堆相似,由free释放。

全局/静态存储区:全局变量和静态变量被分配到同一块内存中。

常量存储区:里面放常量,不容许修改。

详细请看参考8

18,指针和引用有什么区别?

指针其实是个变量,只是存储的是指针,引用是变量的别名,和变量本身没什么区别。

a,引用不可以为空,被定义时就需要被初始化,但是指针不需要被初始化;

b,可以const指针,但是没有const引用;

c,指针可以有多级,但是引用只有一级;

d,引用在初始化后,不可以改变,就是那个变量的别名了,但是指针可以改变;

e,sizeof(引用)结果是变量本身的大小,sizeof(指针)结果是指针的长度;