c++是在参数化构造函数中调用的默认构造函数

c++ is default constructor called in parametrized constructor?

本文关键字:构造函数 调用 默认 参数 c++      更新时间:2023-10-16

我有以下模板类:

template<typename T, int nSize> class Stack{
private:
    int m_nCurrentPos;
    Array<T> m_tArray;
public:
    Stack(int nCurrentPos = 0);
    ...
};

我希望默认构造函数的工作方式如下:

template<typename T, int nSize> Stack<T,nSize>::Stack(int nCurrent){ 
    m_nCurrent = nCurrentPos;
    m_tArray = Array<T>::Array(nSize);
};

Where Array看起来像:

template <typename T> class Array{
private:
    T* m_cData;
    int m_nSize;
    static int s_nDefaultSize;
public:
    Array();
    Array(int nSize);
    ...
};

及其构造函数是:

template<typename T> Array<T>::Array(){
    m_nSize = s_nDefaultSize;
    m_cData = new T[m_nSize];
}

template<typename T> Array<T>::Array(int nSize){
    m_nSize = nSize;
    m_cData = new T[m_nSize];
}

所以,Stack是由Array和一些额外的功能组成的。我的问题是,当我在数组中定义s_nDefaultSize512,我试图实例化Stack<int,1024>,我从类数组中得到一个异常,说我试图分配两个不同长度的数组。只要我更改代码,使s_nDefaultSize=1024(因此它匹配模板的非类型参数nSize),一切都很好。因此,换句话说,异常会在s_nDefaultSize != nSize发生时立即发生。所以,我的猜测是,在上面的代码中,在Stack<T,nSize>的默认构造函数中,即m_tArray = Array<T>::Array(nSize);, m_tArray是由Array的默认构造函数(使用s_nDefaultSize)创建的,然后编译器才尝试将其分配给Array<T>::Array(nSize)(使用我的nSize值)。对吗?如果是,我该如何改变这种行为?这是我昨天发布的另一个问题,尽管是关于继承的,而不是构成的,但它与这个帖子中的问题非常相关。干杯!

您需要在Stack的构造函数中使用成员初始化列表:

template<typename T, int nSize>
Stack<T,nSize>::Stack(int nCurrent)
  : m_tArray(nSize)
{ 
    m_nCurrent = nCurrentPos;
};

当你拥有它时,m_tArray将首先被默认构造,然后在构造函数中被赋值。这里,我们使用成员初始化列表将m_tArray初始化为合适的大小。