以下是否有效?
class myClass
{
private:
...
int m_nDataLength;
boost::shared_array<int> m_pData;
...
public:
myClass(): ..., m_nDataLength(10), m_pData(new int[m_nDataLength]), ...
{
}
}
我假设初始化将完全按照我在 ctor 中给出的顺序进行,这是否正确?如果不是,如果 m_nDataLength 的初始化发生在 m_pData 之后怎么办?
最佳答案
虽然您的示例中的初始化确实按照您希望的顺序进行,但这并不是您假设的原因:初始化按照类定义中数据成员声明 的顺序进行。 这样做的原因是无论使用哪个构造函数创建对象,析构函数都必须按倒序销毁成员。为此,必须使用独立于构造函数的方式来定义构造顺序。
这意味着,如果不是
class myClass
{
private:
...
int m_nDataLength;
boost::shared_array<int> m_pData;
有人会把你的代码改成
class myClass
{
private:
...
boost::shared_array<int> m_pData;
int m_nDataLength;
那么代码就会有错误。
我的建议是:
- 编写您的构造函数,以便初始化顺序无关紧要。
- 如果你不能这样做(注意:对我来说,这种情况在过去十年中发生的次数不到 5 次),请在声明数据成员时完全清楚。
应该这样做:
class myClass
{
private:
...
int m_nDataLength; // Note: Declaration order
boost::shared_array<int> m_pData; // matters here!
关于C++ 初始化列表和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537518/