C++中值得注意的细节地方(逐步更新中)

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;详细用法看我的另一篇文章

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值