1.static的作用
static对于函数来说,只有隐藏的作用,即把本函数设置为本文件可见。
static对于变量来说,不仅可以隐藏,还让变量存放在静态存储区域,具有永久性和默认为零。
2.struct与类的大小
在对struct和类用sizeof()取大小时,会遵循对齐原则(尽可能地凑4和凑8)
例如:
class X { int i; char p; char j ; double k;}; sizeof() = 16
解释: 前三个占用6字节,最后一个占用8字节,但是由于凑合,前三个剩下的两字节系统自动填充,所以是16字节
class X { int i; char p; char j ;}; sizeof() = 8
解释:凑8,两个字节自动填充
class X { int i; char p; int j ; double k;}; sizeof() = 24
解释:前三个是9,超出了8,所以前两个填充至8,后面的话分别是4和8,尽量凑8,所以第三个占用8个字节,总共24字节
3.栈、堆、常量区、代码区
栈:局域变量的存放区域,系统会自动申请与释放,大小为2M
堆:程序员自己申请的区域,要自己释放
常量区:常量存放的区域,默认值是0
代码区:代码存放区域
注:
char string[10]=“abc”; 与 char* str1=“abc”;是有区别的。前者存放在栈区域,而后者的指针放在栈,值存放在常量区域,而且string【10】无效,而str1【10】(指向一个步不知的地方)有效。
4.strlen与sizeof的区别
前者的参数是char*,去到/0才结束,而sizeof则根据实际内存大小取值
5.
string foo( );
void bar(string & s);
那么下面的表达式将是非法的:
bar(foo( ));
bar("hello world");
原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。
引用型参数应该在能被定义为const的情况下,尽量定义为const 。
6. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?
从定义上来说:
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义复类虚函数的方法。
从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func.对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!
重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。
7. 多态的作用?
主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。
8. New delete 与malloc free 的联系与区别?
都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor.
9.class和struct做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
10.当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Autodesk)
答案:肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。
11.sizeof()与strlen()的区别
两者的主要区别是前者是计算占用内存大小,后者是计算字符串的长度,所以后者只能用char*作为参数,而且到\0就停止计算.
前者是一个算符,后者是一个函数.
12.STL中容器的概述
序列容器: vector 动态数组、内存连续存放,支持【】符号
deque 队列、内存连续存放、支持【】符号
list 链表、内存不连续、不支持【】符号
关联容器 set\multiset 红黑树、传进的值已排列
map\multimap 红黑树、有一个键值
适配器:由容器实现的容器,没有迭代器,而且一次不允许插入或删除多个元素
stack 堆栈,默认由vector实现,也可以由deque和list实现
queue 队列,默认由deque实现,也可以由list和vector实现
priority_queue 有优先级的队列,默认先访问头一个(即优先级最高)元素,当元素优先级相同时才用先进先出。元素按有序顺序排列,默认用vector实现,也可以 用deque,但是不能用list,因为list不能快速访问元素,而priority_queue要求对元素进行快速访问以便排序。
注:priority_queue默认以大顶堆的形式存放数据,如果要以小顶堆的形式存放则要另外定义,如下:
priority_queue<int, vector<int>, greater<int> > q;详细用法看我的另一篇文章