深度探索C++对象模型(4)

深度探索C++对象模型(4),第1张

深度探索C++对象模型(4),第2张

Thor磕磕绊绊地读完了第一章“C++对象模型的深度探索”。虽然还有些疑惑,但他觉得自己收获很大。据朋友说,第一章是一个大概的介绍,具体细节会在后面的章节阐述。如果你还没有通读这本书,第一章还是不太好理解。雷神听了这本书,信心倍增,不再有初读这本书时那种“世界末日”的感觉(第二本里雷神觉得自己学了近一年的C++,水平差那么多),通过自己的努力,还是找到了一些门道,那就让我们继续开开心心的开始,踏上深入探索C++对象模型的旅程吧。还记得我们的第一篇作文“坚持到成功”,这是成功的唯一途径。
第二章主要讲构造函数语义。这是什么意思?我的英语和中国文学都不好,但是我觉得书上有错(可能只是笔误)。也许应该翻译成语义。对语言形式意义的研究或科学。语义学:用语言表达意义的研究或科学。我们要研究构造函数,用语言的形式描述清楚。
看完标题的第一感觉,我知道构造器了。构造函数是类的成员函数。构造函数和析构函数是创建、初始化和清除对象数据的成员函数。构造函数可以被重载以使一个类有多个构造函数,因为有时有必要通过这些方法之一创建不同的对象。析构函数不能重载。构造函数作为成员函数,与类同名。示例:aClass名称为aClass,构造函数为aclass()。构造函数没有返回值,其返回类型无法定义,void也无法定义。析构函数也使用这个。编写重载函数时,只有参数表不同。通过比较参数的数量或类型,可以区分两个重载函数。但是我看完第一段就知道这一章要告诉我们什么了。

本章不是要告诉我们什么是构造函数,它的作用是什么。而是告诉我们构造函数是如何工作的。我的。学完这个我很兴奋,因为我真的不知道构造器是怎么构造一个类对象的,一直很想知道。我一直对面向对象的神奇功能很感兴趣。为什么一个类在实例化的时候可以自动完成大量的工作,使得我们的主函数清晰、简单、健壮、高效。以前我们只看到表面,没有深入。现在,我们有机会剥开皮肤,深入骨髓。该书主要讨论了几种情况:

具有默认构造函数的成员对象。如果一个类没有任何构造函数,但是它有一个成员对象,这个成员对象的类有一个默认的构造函数,那么编译器会在需要的时候为这个类合成一个构造函数。

例如:

我们有以下课程。它们都有一个构造函数。


Cat {public: cat(),...};
Dog {public: dog(),...};
Bird {public: bird(),...};
Fish {public: fish(),...};

我们还有一节课。宠物,我们把猫作为它的成员之一。并且没有为它声明任何构造函数。


Pet {
public:
Cat一只猫;
狗一只狗;
一只鸟接一只鸟;
鱼是鱼;
private:
int ival;
......
}

然后在必要的时候,编译器会为它合成一个构造函数,而且是内联的。大概如下。


在线
pet:: pet ()
{
猫。cat::cat();
狗。Dog::Dog();
鸟。伯德::伯德();
鱼。Fish::Fish();
ival = 0;
}

为什么会这样?让我们来看看编译器的动作。在编译器开始执行用户代码并准备生成pet对象之前,它将首先调用必要的构造函数来初始化类的成员,以便为对象分配适当的内存空。如果程序员为pet类编写一个构造函数,编译器将合成上述构造函数作为结果。Pet::Pet(){ ival = 0;}然后编译器也会像上面一样扩展这个构造函数。编译器是如何实现的?当发现一个类没有任何用户自定义的构造函数,而是由编译器自动生成的时候,偷偷生成的构造函数将是一个无用的构造函数。但是通过编译器的工作,我们可以合成一个非平凡的默认构造函数。

就像在香港电影里一样。如果你打了官司(你要设计一个类),没钱请资深律师(没有给建造师),就给你指派律师(默认建造师)。当然这个律师的能力和那些大律师比起来可能是微不足道的。但是我们需要知道他们不是无用的。但由于律所的监管,这些律师可以下大力气去实现。

同样,我们可以了解其他几个非平凡默认构造函数的情况。

如果你的类没有任何构造函数,而且是从一个有默认构造函数的基类派生出来的,那么这个派生类的默认构造函数就会被认为是非平凡的,所以需要合成。他的合成步骤是调用前一个基类的默认构造函数,并根据它们的声明顺序为派生类合成一个构造函数。

如果一个类声明或继承了一个虚函数,或者该类是从具有一个或多个虚基类的继承链中派生的。因为没有用户声明的构造函数,编译器会合成一个默认的构造函数来正确初始化每个类对象的vptr。

最后,在合成的默认构造函数中,只有基类的子对象和类的成员对象会被初始化,其他所有非静态数据成员都不会被初始化,因为这些操作需要程序员来做。编译器不需要做所有这些工作。好了,这篇文章就到这里。这本书真的是索尔看过最慢的一本。但是这些高深的知识有必要了解清楚吗?我们不知道编译器是怎么合成默认构造函数的,但是它不会写程序吗?用雷神侯大师的话来回答这个问题:练从难,用从易。知其所以然不是严谨的学习态度。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 深度探索C++对象模型(4)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情