理解构造函数定义块

时间:2015-10-13 19:28:50

标签: c++ class syntax constructor definitions

我认为我的问题类似于this one,但对于C ++而言,不是C#(尽管相同的答案可能适用于两者)。

我的问题也类似于this one(其中已标记为重复)。然而, 差异 是该问题询问 构造函数原型 ,而我的问题是 构造函数定义块

考虑以下构造函数定义块:

template <class T>
SimpleMatrix<T>::SimpleMatrix(int rows, int cols, const T& initVal)
  : m_data(rows * cols, initVal)
  , m_rows(rows)
  , m_cols(cols)
{}

我是C ++新手,CallOne() : call_two(), call_three(), call_four() {}语法令我困惑。

它是否等同于以下代码块?

template <class T>
SimpleMatrix<T>::SimpleMatrix(int rows, int cols, const T& initVal)
{
vector <T> m_data(rows * cols, initVal);
m_rows = rows;
m_cols = cols;
}

请注意,在SimpleMatrix类定义中,m_datam_rowsm_colsprivate块中声明如下:

private:
  int m_rows;
  int m_cols;

  vector<T> m_data;

1 个答案:

答案 0 :(得分:2)

  

注意:这个问题是duplicate是否会成为争论的理由。在技​​术方面,是的,它是,并且我同意将其标记为这样。然而,对于一个完整的新手,可能很难从副本中得出答案。这个答案,加上重复的问题,创造了整个画面。

从宽松的角度来看,它是一样的。

第一个是初始化列表,它初始化每个变量。第二个是分配值。

要理解为什么第一个通常是优越的,我们必须理解第二个。当我们在构造函数中赋值给变量时,代码必须首先用一些默认值初始化它,然后将我们想要的值赋给新初始化的变量。因此,它需要两个步骤。

当我们使用初始化列表时,我们正在使用值我们的选择初始化变量,而不是自动选择的值。因此,它只需要一步。

这似乎是一个迂腐的小细节,但在优化时每一点都有帮助。

这是相同的概念,无论它出现在构造函数的头部还是实现中。