0

我正在学习两个不同的 C++ 编程课程。一个是我的物理学位的必修课,面向 ROOT,一个是我自己选择的信息学学位的课程。

问题是,他们为类中的构造函数提供的示例略有不同。

例如,让我们选择一个名为 CDate 的类的默认 ctor,它包含三个整数,一个代表日,一个代表月,一个代表年。如果没有传递任何内容来初始化日期,它会自动设置为 1900 年 1 月 1 日。

信息学课程的幻灯片给出了这个例子:

CDate::CDate(void){
mDay=1;
mMonth=1;
mYear=1900;
}

虽然我的物理课程中给出了这个:

CDate::CDate():
mDay (1),
mMonth (1),
mYear (1900)
{}

如果他们必须修改已经在大括号外创建的一些变量,他们只会将内容放在大括号内。

例如,假设我们要创建一个表示直方图的类,给出最小值、最大值、bin 的数量,然后是一个包含每个 bin 内的值的数组。完整的构造函数如下所示:

histogram::histogram (const int &nBin, const float &min, const float &max):
 nBin_p (nBin),
 min_p (min),
 max_p (max),
 binContent_p ( new int[nBin_p] )
{
  //initialize to zero the bin content
  for (int i = 0; i < nBin_p; ++i)
    binContent_p[i] = 0;
}

(带有 _p 的变量是类的实际变量,在类实现中定义为私有)。

我猜“更好”的是信息学的,他们应该知道得更好,对吧?但是,我仍然想知道,简而言之,这两种方式之间的实际差异是什么,尽可能轻微?我应该什么时候更好地使用一种,什么时候使用另一种,或者它们完全等效?

4

3 回答 3

1

您的物理示例中的一个称为初始化列表,它是初始化成员变量的首选方法。有关更多说明,请参见此处

于 2015-02-20T11:30:20.697 回答
1

信息学的方法实际上听起来非常源自 C,它们没有利用某些 C++“特性”。他们只是对这些成员变量做一些赋值。

物理学宁愿做初始化。乍一看,这种差异可能只是美学上的,只要您正在初始化的成员变量是基本类型,在实践中可能不会有太大的不同。

但是,如果您有一个对象类型的成员变量并且没有void构造函数怎么办?要使用该类型的参数调用构造函数,您只能使用 Physics 的方法(顺便说一下,这称为初始化列表)。

于 2015-02-20T11:30:23.687 回答
-1

第二种语法是初始化成员对象变量的唯一选项(它实际上是一个构造函数调用)。对于简单的类型,例如int、long等,执行顺序只有很小的差异,总是可以手动修复的。

于 2015-02-20T11:25:20.270 回答