C++基础问题

来源:互联网 发布:审美差异知乎 编辑:程序博客网 时间:2024/06/07 00:49

1、为什么说类是一种关于对象的封装?
将变量放在保护区,外部调用者无法随意改变它的值,也就是提高了封装性。

2、结构与类有哪些相同点和不同点?
相同点:都是通过new来实例化。
不同点:
1)类是引用类型,存储在堆中,结构是值类型,存储在栈中。
2)类要比结构功能强,性质多:类支持继承,结构不支持继承,只记录了物体的一些性质。
3)类通过class声明,结构通过struct声明。
4)结构不能定义无参数的构造方法。
5)默认的成员访问权限不同:struct中的变量被默认为public的,而class中默认为private的。

3、全局变量、局部变量、静态变量和动态变量的异同?
1)全局变量就是对全局起作用,局部变量只对某一程序段起作用,他们主要是作用范围不同。
2)静态变量与动态变量的生命周期不同,静态变量在程序运行期间一直存在于存储空间内,执行过程中不自动释放,并且仅在应用程序启动运行前被初始化一次;动态变量在执行时根据需要临时分配空间,再次调用不会记录上次执行结果。另外,本质的不同是动态变量保存在栈中,静态变量保存在程序的数据段中。

4、什么情况下运算符重载不用定义为友元函数?
1)运算符的第一个参数不是要操作的类自己(例如重定向运算符<<,左操作数是一个stream类)。
2)该重载必须访问私有或保护数据。

5、数据结构-常见的存储结构包括:
顺序(数组)、链式(线性表-地址连续)、索引和散列。

【注1】浅拷贝与深拷贝参考:
http://blog.csdn.net/feitianxuxue/article/details/9275979
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

【注2】线性表特例(操作受限):栈;循环队列
<1>栈:运算只在表的一端进行,也称为“下推表”;栈顶元素是唯一可访问的元素,元素的插入称为“入栈”,元素的删除称为“出栈”。
顺序栈使用向量实现,本质是顺序表的简化,关键是确定哪一端作为栈顶;链式栈用单链表方式存储,其中指针的方向是从栈顶向下链接。
顺序栈和链式栈比较:时间效率上,所有操作都只需常数时间,顺序栈和链式栈在时间效率上难分伯仲;空间效率上顺序栈须说明一个固定的长度,链式栈的长度可变,但增加结构性开销;实际应用中,顺序栈比链式栈用的更广泛,因为顺序栈容易根据栈顶位置,进行相对位移,速度定位并读取栈的内部元素,而顺序栈读取内部元素的时间为O(1),而链式栈则需要沿着指针链游走,虽然慢,读取第k个元素需要时间为O(k)。

<2>队列:运算只在表的两段进行,先进先出,按照到达的顺序来释放元素,所有的插入在表的一端进行,所有的删除操作在表的另一端进行。主要元素是队头和队尾。

6、数据结构-逻辑结构包括线性和非线性两类:
线性结构包括:散列表、堆栈、队列。
非线性结构包括:树、图。

7、二维数组在内存中是如何排列的?
当二维数组存储字符串时,3个字母的字符串必须留出4个位置,因为字符串必须以‘\0’结尾。对于二维数组来说,第2维是比较重要的,第2维代表着这个字符串换的长度,这个长度确定下来以后,其物理排列方式就定下来了,所以2维数组也可以写成char monthName[] [4]={“Jan”,”Feb”};

8、一维数组名可以当指针使用,二维数组名能用做双指针来使用吗?
可以,如果把数组名当作参数传递给函数,那么编译器将认为传递的是指针,不管它是多少维数组。比如:

int iArray[10];
void f1(int *p1);
如果这样调用f1(iArray),那么p1[0]等于iArray[0]……
int iArray[10][10];
void f2(int *p2);
如果这样调用f2((int *)iArray),那么p2[0]等于iArray[0][0]……

9、链表与数组相比有哪些优缺点?
(1)链表的插入删除方便,并且可以动态删除,数组的插入删除需要移动大量元素。
(2)链表可以动态应用内存,数组的大小是预先定义的,定义过大会浪费空间,过小会导致内存溢出。
(3)数组采用顺序存储方式,占用连续内存;而链表每个节点没有相对固定的位置关系。

10、递归函数的调用过程实际上就是栈的一个应用,用基于栈的算法来描述递归算法的实现过程。举例:
int fun(int a)
{
if(a==1) return 1;
else
{
a=a*fun(a-1);
return a;
}
}