c++: class 大括号内或外的构造函数指令

c++: class constructor instructions inside or outside braces

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

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

例如,让我们选择一个名为 CDate 的 class 的默认构造函数,它包含三个整数,一个用于日,一个用于月,一个用于年。如果没有传递初始化日期,它会自动设置为 1900 年 1 月 1 日。

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

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

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

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

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

比方说,我们要创建一个 class 表示直方图,给出最小值、最大值、箱数,然后是一个包含每个箱内值的数组.完整的构造函数如下所示:

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 的变量是 class 的实际变量,在 class 实现中定义为私有)。

我猜 "better" 一个是信息学的,他们应该知道得更多,对吧?但是,我仍然想知道,简而言之,这两种方式之间的实际区别是什么,就像细微的一样他们可以?我什么时候应该使用一个,什么时候使用另一个,或者它们是否完全等效?

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

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

信息学的方法实际上听起来非常 C 派生,他们没有利用一些 C++ "pecularities"。他们只是对这些成员变量做一些赋值

物理学更愿意做初始化。乍一看,差异可能只是美学上的差异,只要您初始化的成员变量是基本类型.

,在实践中可能不会产生太大差异。

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