C++ 的常见问题和解答[不断更新]

来源:互联网 发布:js正则判断是否为小数 编辑:程序博客网 时间:2024/05/16 18:49

Q1: delete[] 和delete的区别

 

Q2:析构函数怎么写, 什么时候要用虚的析构函数

 

Q2:类对象的生命周期(构造和析构的先后顺序)

 

Q4:预定义系列

 

Q5:typedef系列

 

Q6:优先级和结合顺序

 

Q7:复杂函数的指针系列

 

Q8:int表示数据的范围

 

Q9:几个常用到的CAST语法:

      reinterpret_cast 如:

      OnNAVI_SEV_POIEntityEvent(reinterpret_cast<const NAVI_SEV_POI_EntityEvent&>(rcEvent));

       static_cast 如:

       RG_DEMO_SPEED_AUTO == static_cast<enum RgDemoSpeed>(m_wDemoSpeed);

       这个和强制转换有没有关?

 

Q10: memset导致虚表清空的问题:

         这个问题在实际的项目中, 发生在某个结构体中存在一个String, 当意图初始化这个街头体时, 产生错误, 下面是两个案例:

          案例一:     不当使用memset函数带来的麻烦问题

          案例二:      memset()函数的用法及常见误区

 

Q11:  #include 和 类声明 的作用:

          一般而言, 哪里用到了某个类型, 都会用include去包含, 但这样的话, 会有弱点.

       

        上图就是这样一个现象, 比如SerivceIF中定义了一个enum类型, 这个类型会被Manager类所用到. 这样就遇到了两难的问题, 如何解决问题? 我们就采用了这样一个方式, 不在.h文件中包含全部要用到的头文件, 而尽量在.h使用class XXXclass的方式声明一个类. 而在.c/cpp文件中采用include的方式. 这样, 尽量减少了include的嵌套关系. 以免出现双向引用.

        但上述问题的实质是由于类的设计不合理导致的. 比如上面的enum类型, 应该单独的放置到一个专门的文件中声明和定义. 所有的类之间, 不应该出现双向引用的问题.

       下面将成为一个C++的伤痛:

 

       

 

另外一个文件跟它存在相互引用关系.

 

     

 

     上述会报一个错误, 无论是VS平台或者是GCC平台, 这个错误都显得莫名其妙, 实质上, Base和Derive已经相互include对方的头文件. 这个问题, 在VS平台上已经有人做了总结, 下面给出链接:

         error C2146:和error C4430:的错误

造成事态非常严重, 解决的方案是, 用class的声明代替#include.  但是,并不是永远有效, Base如果只是持有Derive的指针, 那么用class 的declaration是没问题的. 如果是持有对象的话, 这个问题就是死结了. 原因是在头文件中声明的对象要分配空间, 所以, 务必要找到定义, 即找到头文件. 同理, 假如Derive是Base的派生类, Dervie也必须依靠include 而非declaration搞定, 因为继承的时候也需要在头文件中决定空间分配, 必须用到include. 那么什么是一个完美方案呢?

    1. 尽量用指针定义属性

    2. 不要相互引用, 相互引用实质上是一个极其恶劣的编程习惯.

     

    原创粉丝点击