我认为我的问题类似于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_data
,m_rows
和m_cols
在private
块中声明如下:
private:
int m_rows;
int m_cols;
vector<T> m_data;
答案 0 :(得分:2)
注意:这个问题是duplicate是否会成为争论的理由。在技术方面,是的,它是,并且我同意将其标记为这样。然而,对于一个完整的新手,可能很难从副本中得出答案。这个答案,加上重复的问题,创造了整个画面。
从宽松的角度来看,它是一样的。
第一个是初始化列表,它初始化每个变量。第二个是分配值。
要理解为什么第一个通常是优越的,我们必须理解第二个。当我们在构造函数中赋值给变量时,代码必须首先用一些默认值初始化它,然后将我们想要的值赋给新初始化的变量。因此,它需要两个步骤。
当我们使用初始化列表时,我们正在使用值我们的选择初始化变量,而不是自动选择的值。因此,它只需要一步。
这似乎是一个迂腐的小细节,但在优化时每一点都有帮助。
这是相同的概念,无论它出现在构造函数的头部还是实现中。