成员变量必须在构造函数的初始化列表中完成初始化。SMART pointer members minimize dependencies while allowing exception safety。 通过以指针存储成员变量的方法最小化依赖 // User.h class PointerMember; class RefParam;class User{public:User( const RefParam &inParam ); virtual ~User();private:PointerMember *mPointerMember;};// User.cpp #include User.h User::User( const RefParam &inParam ) : mPointerMember( new PointerMember( inParam ) ){return;}User::~User(){delete mPointerMember;return;}这样当你要使用成员变量时,原来使用mValMember.Something的地方就要用mPointerMember-Something了。文本编辑器或者集成开发环境的查询替换方法可以很容易地在切换存储方法。 初始化列表注意,在构造函数初始化列表中初始化对象的指针成员(可以是任何类型成员)是非常重要的。对于C++的初学者来说,像上面的例子中所看到的,下面语句位于大括号之前看起来感觉非常别扭。 : mPointerMember( new PointerMember( inParam ) ) 在类对象的生命周期中,如果实际应用时不需要经常使用指针成员变量时,可以选择将该指针成员初始化为nil(注意:删除一个nil指针永远是安全的。因为delete方法的实现在将指针变量传递给堆管理器前,首先检验指针的值)。如果指针变量需要在构造之前分配存储空间的话,一定要在初始化列表中完成,而不像下面代码一样在构造函数体中完成。 User::User( const RefParam &inParam ){mPointerMember = new PointerMember( inParam ); // DON'T DO THISreturn;}我所工作的大型C++项目中,那些很少使用初始化列表初始化成员变量的,都到处充斥着错误。其中有一个项目,源码共70多兆,我在那家公司工作的时候除了调试错误没做其他任何事情。搞定了一摞错误,又会出现一筐错误。适当的初始化成员变量失败不只是代码的问题,还与更高层次问题相关。 一般来说,构造函数体应该只用来开展对成员变量的操作,或者是全部完成初始化后对整个对象的操作。基本原则是保留函数体给不适合由初始化列表完成的代码。 开始学习适当的使用初始化列表以来,在写信构造函数或者重写老的构造函数后,函数体往往是空的,或者仅包含不多的几行代码,因为全部的实际工作都在初始化列表中完成了。要完成这些工作有时候需要一些额外的工作,但是最后还是能把这些工作量找回来的。