0

我认为我的问题类似于这个问题,但对于 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_rows、 和m_colsprivate块中声明如下:

private:
  int m_rows;
  int m_cols;

  vector<T> m_data;
4

1 回答 1

2

注意:这个问题是否重复将成为一些辩论的理由。用技术术语来说,是的,它是,我同意这样标记它。然而,对于一个完整的新手来说,可能很难从副本中得出答案。这个答案,加上重复的问题,创造了整个画面。

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

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

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

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

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

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

于 2015-10-13T19:30:05.660 回答