2011-11-09 41 views
2

可能重复:
What is this weird colon-member syntax in the constructor?构造与结肠癌

我在看this。冒号后的部分是什么意思?

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

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

+0

您无法“在体内声明值”。你所说的话表明你对这门语言的理解还处于早期阶段,一旦你理解了变量声明和初始化,你自然会问如何初始化类成员,然后问构造函数中的冒号。查看我们的常见问题以获得良好的书籍建议 –

+0

我的意思是在身体里初始化。 – Sudhir

+0

同样的问题;那也不存在。 –

回答

0

这是初始化数据成员的实际办法。通常构造函数有两个阶段,即初始化和计算。

/* 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) 

当您的类中有常量或引用数据成员时,此类型的初始化是强制性的。因为您不能在构造函数体内为它们分配值,所以在{}中不能为其分配值{}

+0

请注意,如果没有明确的初始值设定项,那么如果成员是POD(尤其是内置类型),则不会初始化成员。特别是对于指针成员,除非明确将它们初始化为NULL,否则不能假定它们为NULL。 – celtschk

1

Box是一个子类的Rectangle,它的构造函数首先调用Rectangle构造函数,然后设置height变量h

2

它用于您的类或结构的成员,父类的初始化。

你能做到这一点的函数体...里面的成员变量除了const会员!

也看到C++ FAQ的this section。它

+0

遗忘基类初始化:) – sehe

+0

@sehe:在您发布您的评论之前添加 – Benoit

1

部分是基类构造函数的调用,部分成员初始化列表。

显式关键字不需要存在,因为隐式转换只能发生转换构造函数。

因为成员和基类在构造函数中输入代码之前进行初始化,这提供了到初始化的替代方案。这样做没有意义,对吧?除了速度增益之外,不可能在构造函数体内调用基类构造函数,所以它总是会调用默认的构造函数。如果您想致电Rectangle(l, w),则必须先输入构造函数代码:Box(double l, double w, double h) : Rectangle(l, w)