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