当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:56:00  来源:本站整理

深度摸索C++对象模子(4)[VC/C++编程]

赞助商链接



  本文“深度摸索C++对象模子(4)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

雷神跌跌撞撞的读完了《深度摸索C++对象模子》的第一章,固然还是有些迷惑,但是已经感到收获很大.按照朋友的说法,第一章是一个概括的介绍,具体的细节会在今后的章节阐述,假如没有通读本书,第一章还是对比不简单理解的.雷神听过之后信心倍增,也不在有初看此书时的“世界末日”的感受了(在第2篇雷神感到学了近一年的C++,竟然水平如此之差),并且通过自己的勤奋,还是摸到了些门道,所以让我们持续欢愉的动身,踏上深度摸索C++对象模子的路程.记着我们在第一篇的小文《保持不懈,直到成功》,这但是获得成功的不贰法门.
第二章主要讲的的构造函数语意(Semantics),这是一个什么意思?我的英文和中文学的都不好,但我想是书上弄错了(大概只是一个笔误),大概应当翻译成语义对比得当.The study or science of meaning in anguage forms. 语义学以语言情势表示意思的研究或科学.我们要研究构造函数的,并且以语言的情势将它描写清楚.
看完标题我的第一个感受,构造函数我知道.构造函数是一个类的成员函数,构造函数和析构函数是举行对象数据的成立,初始化,排除工作的成员函数,可以重载构造函数,使一个类不止具有一个构造函数,因有时需求以这些办法中的某一种辨别成立差别的对象.不能重载析构函数.构造函数作为成员函数和类有相同的名字.例:一个类名为:aClass,构造函数就是aClass().构造函数没有返回值,并且不能定义其返回范例,void也不行.析构函数一样利用这一点.当编写重载函数时,只有参数表差别,通过对比其参数个数或参数范例可以辨别两个重载函数.但是我读完第一小段后就知道这一章要奉告我们什么了.

这一章并非要奉告我们什么是构造函数,它的作用是什么.而是要奉告我们的是构造函数是若何工作的.我的.在得知这点后我很高兴,因为我确切不知道构造函数是若何构造一个类的对象的,并且一向想知道.我一向对面向对象奇异的功效很感爱好.为什么一个类在被实例化时,可以自动的完成很多工作,使我们的主函数清楚,简单,稳健,高效.从前只看到了表面,没有深化,这会我们有机会去皮剔肉深化骨髓了. 书上主要谈论了几种情形:

带有缺省构造函数的成员对象.假如一个类没有任何的构造函数,但他有一个成员对象,这个对象的类有一个缺省的构造函数,那么编译器会在需求的时刻为这个类合成一个构造函数.

举个例子:

我们有以下几个类.它们都有一个构造函数.


猫{public:猫(),......};
狗{public:狗(),......};
鸟{public:鸟(),......};
鱼{public:鱼(),......};

我们又有一个类.宠物,我们将猫作为它的成员之一.并且没有给它声明构造函数.

宠物{
public:
猫 一只猫;
狗 一只狗;
鸟 一只鸟;
鱼 一只鱼;
private:
int ival;
......
}

则当需求的时刻编译器会为它合成一个构造函数,并且采取内联方法.大约象下面的模样.

inline
宠物::宠物()
{
猫.猫::猫();
狗.狗::狗();
鸟.鸟::鸟();
鱼.鱼::鱼();
ival=0;
}

为什么会这样,我们来看看编译器的行动.编译器开始履行用户的代码,预备生成宠物对象之前,会首先调用必要的构造函数,来初始化类的成员,以便为对象分配符合的内存空间.后果编译器堆积成上面的构造函数,假如程序员为宠物类写了一个构造函数. 宠物::宠物(){ival=0;}那编译器也会将这个构造函数扩大成上面的那样.编译器是怎样实现的呢?本来当一个类没有任何用户定义的构造函数,而是由编译器自动生成的话,则这个被暗中生成的构造函数将会是一个没有什么用处的构造函数.但是通过编译器的工作可认为我们合成一个nontrivial default constructor.

好象香港片子中演的,假如你惹上官司(你要计划一个类),你又没有钱去请高级的律师(没有给出构造函数),那会给你分配一个律师(缺省的构造函数),当然这个律师的本领大概和那些大律师比起来有差别(trivial).不过我们要知道他们也不是一点用都没有.但是由于有律师行的督导,可以使这些律师可以勤奋做到最好(nontrivial).

一样的原理,我们可以理解别的的几种nontrivial default constructor的情形.

假如你的类没有任何的构造函数,并且它派生于一个有着缺省构造函数的基类,那这个派生类的缺省构造函数会被视为nontrivial,因此需求被合成出来,他的合成步骤是调用上一层基类的缺省构造函数,并按照它们的声明次序为派生类合成一个构造函数.

假如类声明或担当了一个虚函数,大概类派生于一个担当串链,此中有一个或更多的虚拟基类.由于贫乏利用者声明的构造函数,则编译器堆积成一个缺省的构造函数,以便精确的初始化每一个类对象的vptr.

最后说一点,在合成的缺省构造函数中,只有基类的子对象和类的成员对象会被初始化,全部其他的非静态数据成员都不会被初始化,因为这些操作是需求程序员来做的.编译器没有必要连这些工作都做了. 好了,这篇就写到这里吧.这本书真的是雷神所看过的书中,看的最慢的一本了.但这些深层的知识有必要理解的很清楚吗,我们不知道编译器若何合成缺省的构造函数不也能写程序吗?雷神用侯大师的话来答复这个问题:练从难处练,用从易处用.知其但是不知其所以然,不是一个严谨的学习态度.


  以上是“深度摸索C++对象模子(4)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Java Web服务,第2部份: 深度摸索Axis2:AXIOM
  • 深度摸索C++对象模子(1)
  • 深度摸索C++对象模子(2)
  • 深度摸索C++对象模子(3)
  • 深度摸索C++对象模子(4)
  • <b>深度摸索C++对象模子(5)</b>
  • <b>深度摸索C++对象模子(6)</b>
  • 深度摸索C++对象模子(7)
  • 《深度摸索C++对象模子》读书笔记(1)
  • 《深度摸索C++对象模子》读书笔记(2)
  • <b>《深度摸索C++对象模子》读书笔记(3)</b>
  • 《深度摸索C++对象模子》读书笔记(4)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .