一个完美的类的构造函数应该这样写
1: 初始化效率要高效。
所有的成员变量初始化通过 初始化列表实现。
如果放在类的构造函数里面初始化,效率会低!
因为:在进入类的构造函数之前,类必须是一个已经构造好的类了!也就是,其内部成员变量也已经被构造好了。也就是进入构造函数之前所有的内部成员变量都已经执行了参数为空的构造(假设没有用初始化列表)。
如果你实现了构造函数,那么编译器会生成调用构造函数的代码,这里的代码已经不是构造了,变成了修改!
m_classB = _B; // 这里执行的是 赋值运算,而不是copy构造函数。m_classB已经被构造起来了。
效率低显而易见;代码验证:
class SA
{
public:
SA( int i ):_i(i){};
int _i;};
class F_SA
{
public:
F_SA( const SA& sa ){ m_sa = sa; }// 错误
//F_SA( int i=0 ):m_sa(i){ } // 正确
SA m_sa;
};int _tmain( int argc, TCHAR* argv[] )
{
F_SA fsa; // 编译失败!!! m_sa通过初始化列表初始化失败!没有和合适构造函数调用!system( "pause" );
return 0;
}
2:防止在构造函数中资源泄漏。
见Effective C++ 条款十 可以通过auto_ptr<>封装的指针,就可以能自动资源回收3:如果构造失败,应该向上跑出异常。
假设有一个成员变量指针,通过初始化列表申请内存,那么如果其失败,其会自动抛出异常向上传递。不用担心《此刻注意条款2中的资源泄漏》本地抛出的异常必须本地处理,直接扔给外部的做法是不负责任的。本地处理后,视异常的情况和系统要求,再过滤给外部调用者,即客户,后一动作称为“上抛”。
补充:软件开发 , C语言 ,