C++ 带冒号的构造函数

C++ 带冒号的构造函数,c++,constructor,C++,Constructor,可能重复: 我正在看。冒号后面的部分是什么意思 explicit Box(double l, double w, double h) : Rectangle(l, w), height(h) {} 我习惯于初始化函数体{}中的值。框是矩形的子类,它的构造函数首先调用矩形构造函数,然后将高度变量设置为h,用于初始化类或结构的成员和父类 您可以对函数体中的成员变量执行此操作…除了const成员 也看到C++的FAQ。 < P>部分是对基类构造函数的调用,部分是成员初始化列表。 这里不需要显式关键

可能重复:

我正在看。冒号后面的部分是什么意思

explicit Box(double l, double w, double h) : Rectangle(l, w), height(h) {}

我习惯于初始化函数体{}中的值。

矩形
的子类,它的构造函数首先调用
矩形
构造函数,然后将
高度
变量设置为
h

,用于初始化类或结构的成员和父类

您可以对函数体中的成员变量执行此操作…除了
const
成员


也看到C++的FAQ。

< P>部分是对基类构造函数的调用,部分是成员初始化列表。 这里不需要显式关键字,因为隐式转换只能对转换构造函数进行


由于成员和基类在将代码输入构造函数之前进行初始化,因此这提供了初始化的替代方法。做两次没有意义,对吧?除了速度增益之外,不可能在构造函数体中调用基类构造函数,因此它将始终调用默认构造函数。如果您希望调用
矩形(l,w)
,则必须在输入构造函数代码之前执行此操作:
框(双l,双w,双h):矩形(l,w)
这是初始化数据成员的实际方法。通常构造函数有两个阶段,即初始化和计算

/* Initialization */
explicit Box(double l, double w, double h): Rectangle(l, w), height(h)
无论你在{}内做什么,都是在计算阶段

即使您没有在代码中编写初始化列表,编译器也会隐藏代码来初始化数据成员。所以如果你写

explicit Box(double l, double w, double h):Rectangle(l, w)  
{  
  height = h; /* re-assigning value */ 
}
这意味着您只是在为所有已准备好初始化的值赋值

explicit Box(double l, double w, double h): Rectangle(l, w), height(h)

当类中有常量或引用数据成员时,此类型的初始化是必需的。因为您不能在构造函数主体内部(即{}

内部)为它们赋值,忘记了基类初始化:)@sehe:在发布注释之前添加,所以您不能“在主体中声明值”。您所说的表明您对该语言的理解还处于早期阶段,一旦您理解了变量声明和初始化,您自然会问如何初始化类成员,然后再问构造函数中的冒号。查看我们的常见问题,以获得好书推荐!我的意思是在体内初始化。同样的问题;注意,如果没有显式初始值设定项,如果成员是POD(特别是内置类型),则不会初始化它们。特别是对于指针成员,除非将其显式初始化为NULL,否则不能假定它们为NULL。