理解构造函数定义块的语法变化



我想我的问题与这个类似,但针对的是c++,而不是c#(尽管相同的答案可能适用于两者)。

我的问题也类似于这个问题(它已被标记为重复)。然而,的区别在于是关于构造函数原型的,而我的问题是关于构造函数定义块的。

考虑下面的构造函数定义块:

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;

注意:这个问题是否重复会引起一些争论。从技术上讲,是的,我同意这样标记它。然而,对于一个完全的新手来说,可能很难从副本中得出答案。这个答案,加上重复的问题,构成了整个画面。

从广义上讲,它们是一样的。

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

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

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

这可能看起来像一个迂腐的小细节,但每一点都有助于优化。

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

相关内容

  • 没有找到相关文章