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++的伤痛:
---------------------Base.h头文件-------------------- /* * Base.h * * Created on: 2010-12-7 * Author: Administrator */ #ifndef BASE_H_ #define BASE_H_ #include "Derive.h" class Base { public: Base(); virtual ~Base(); private: Derive derive; }; #endif /* BASE_H_ */ -------------Base.cpp源文件----------- /* * Base.cpp * * Created on: 2010-12-7 * Author: Administrator */ #include "Base.h" Base::Base() { // TODO Auto-generated constructor stub } Base::~Base() { // TODO Auto-generated destructor stub }
另外一个文件跟它存在相互引用关系.
/* * Derive.h * * Created on: 2010-12-7 * Author: Administrator */ #ifndef DERIVE_H_ #define DERIVE_H_ #include "Base.h" class Derive{ public: Derive(); virtual ~Derive(); private: Base* base; }; #endif /* DERIVE_H_ */ -----------------下面是源文件--------- /* * Derive.cpp * * Created on: 2010-12-7 * Author: Administrator */ #include "Derive.h" Derive::Derive() { // TODO Auto-generated constructor stub } Derive::~Derive() { // TODO Auto-generated destructor stub }
上述会报一个错误, 无论是VS平台或者是GCC平台, 这个错误都显得莫名其妙, 实质上, Base和Derive已经相互include对方的头文件. 这个问题, 在VS平台上已经有人做了总结, 下面给出链接:
error C2146:和error C4430:的错误
造成事态非常严重, 解决的方案是, 用class的声明代替#include. 但是 ,并不是永远有效, Base如果只是持有Derive的指针, 那么用class 的declaration是没问题的. 如果是持有对象的话, 这个问题就是死结了. 原因是在头文件中声明的对象要分配空间, 所以, 务必要找到定义, 即找到头文件. 同理, 假如Derive是Base的派生类, Dervie也必须依靠include 而非declaration搞定, 因为继承的时候也需要在头文件中决定空间分配, 必须用到include. 那么什么是一个完美方案呢?
1. 尽量用指针定义属性
2. 不要相互引用, 相互引用实质上是一个极其恶劣的编程习惯.