假设有一个ClassAClass ClassA
{
public:
ClassA();
void Func()1;
...
private:
CString m_str;
};
那么他的构造函数是1.
ClassA()
{
m_str = _T("abc");
}
好呢?
还是2.
ClassA()
:m_str(_T("abc"))
{
}
好呢?
虽然是个小问题。。可能很多人都嗤之以鼻,但我抱着养成好的编程习惯的角度来讨论这个问题,
我的理解是方法2构造函数好,因为它直接以值"abc"构造,而方法1是先默认构造m_str,再以"abc"赋值,多了一个步骤。。但现在我所接触的代码基本都是以方法1的形式来写的,让我很困惑,我觉得方法2的写法也很清晰明了,为什么不采用呢?
想听听大家的看法
{
public:
ClassA();
void Func()1;
...
private:
CString m_str;
};
那么他的构造函数是1.
ClassA()
{
m_str = _T("abc");
}
好呢?
还是2.
ClassA()
:m_str(_T("abc"))
{
}
好呢?
虽然是个小问题。。可能很多人都嗤之以鼻,但我抱着养成好的编程习惯的角度来讨论这个问题,
我的理解是方法2构造函数好,因为它直接以值"abc"构造,而方法1是先默认构造m_str,再以"abc"赋值,多了一个步骤。。但现在我所接触的代码基本都是以方法1的形式来写的,让我很困惑,我觉得方法2的写法也很清晰明了,为什么不采用呢?
想听听大家的看法
不过MFC中的对话框中的控件赋初值都是按第一种来做的,也是一种规范吧,方便理解
而方法2就是直接调用m_str的构造函数来初始化的;
所以,很明显在大部分情况下方法2的效率要比方法1要高,
但如果m_str的类型是内置类型,那方法1跟方法2的效率差不多,因为内置类型的构造析构等函数都做了很高的优化,效率影响不大。
1,初始化的数据成员是对象的情况
2,初始化const修饰的类成员
3,初始化引用成员数据
--
除此之外,我觉得都能写到构造函数体。
因为初始化列表太长的话,有点不整齐。