The Semantics of Constructors
主要就是2个东西,默认构造函数和拷贝构造函数。()
全文围绕这trivial无用和nontrivial有用这次2个反面,对由程序自己定义的或是编辑器定义的默认构造函数和拷贝构造函数进行了解释。
/*trivial的默认构造函数,
当class内涵一个或是一个以上的member class object 的时候的,编辑器就会默认产生一个默认构造函数对成员对象进行构造。
当class继承于一个带有默认构造函数的时候,或是class声明了或是继承了virtual function的时候。编辑器会为这个class 加上一个virtual function table和Vptr指向这个table。
旨在解释编辑器在默认构造函数里面为我们干了上面事情,而我们了要怎么利用这些编辑器功能干一些啥事就是我们的事情了。 注释了感觉有点废话*/
刚才坐电梯的时候突然笑了下没得必要说的太多的废话。
说白了默认构造函数就是编辑器干了一些他自己改干的事情(为什么是他自己该干的事情了,对象的构造是他给人家完成的吧,虚函数表你他给你加上的吧,这个功能的沿用就该他自己来完成,估计会有很多人不懂我的意思。。。呵呵)
当class 不含默认构造函数的时候,但是内涵类得对象的时候,这时的编辑器生成的默认构造函数被视为是有用的。他在默认构造函数里对没得内涵的对象进行构造。我是个爱投机的人,哈哈哈你也许会想到,既然我会在自己的默认构造函数对其他的对象进行初始化,我其他的构造函数里面实现一些功能函数,那不就是我隐形的在自己构造的时候实现了这个调用,这样不是挺好的莫。。。。不建议哈 这样没几个人看的懂你的代码的 哈哈哈,上述只是一个简单的情况,复杂的我比如兄弟对象(继承于相同class 的同级对象我定义为兄弟对象)间的包涵(采用虚继承较好。。。说话一直没得逻辑的话大家较量一直是想到哪点说道哪点的人)可以考虑把公共功能脱离出来抽象为一个单独的对象在兄弟对象间调用。。。就这样吧 稀里哗啦的可以想到很多这个仁者见仁了就。。。。
然后就是更加灵活的一个东西了,当class声明或是继承可virtual function,亦或是class派生自一个继承串联,其中至少有一个virtual base class编辑成就会为产生一个默认构造函数。。。哎。~这可怜的编辑器干的事情太多,哎,~谁叫他要背着我们干坏事了。。。编辑器会为我们创建了一个虚函数表和一个指向虚函数表的指针,这必须的为了让子类加上这些东西。。。需要注意的是这里的的这些东西不是继承而是创建,他们是不同于父类的。。。记住这个就好办了。。。然后了我还是意淫下吧不是不厚道了。。。由于vptr的存在,所以回溯的访问变得很简单了。。你猜我想说什么。。。怎么不可以了。。。你把这样的继承关系在纸上画画看看,就是会发现他们貌似一个可以回溯的树形结构难道不是嘛。。。这样不就简单了这样隐身的树形结构。。。靠。。把他用于你的编码中考大神也会看着头疼。。通过内建的可回溯树,在外部建立一个对base class 的管理器 靠简直是爽歪歪了 。。谁说不是了。。
来吧英雄这里是copy constructor
我觉得对于copy constructor的研究主要的重点在于效率上, 也就是消除一些不必要的对象产生和效率损耗。也许这样的临时对象不起眼(弊端1.对于采用对数据采用统一抽象出来的对象会很大,产生大量的零食对象会大大的影响效率,弊端2,零时对象是伴随着作用域存在的,可能会在调用中途被销毁)
拷贝构造函数有2种方式实现,memberwise 和bitwise。各有各的使用条件。。。废话。。。
其实情况基本和默认构造函数差不多。。。
由于bitwise是位拷贝不适合下面的情况,就是内涵一个memberobject(记得才进公司的时候主程序给我说了句在我一个什么类型的数据里面不要用string或是自己定义的复杂数据类型也许就是出于这里的考虑和前面讲的默认构造函数的考虑呵呵 呵呵 要想快就尽量使用简单数据类型吧 呵呵char就简单 byte就简单哈哈哈)这里有点东西我的仔细想哈。。。反正就是让你不知道的事情丢给编辑器做。。个人理解我从考证。。。由于采用组合的方式既是内涵其他menberobject class是无法保证其他类对象的内部行为的,这里的行为就是是否继承于某个累或是有virtual table 的产生所以为了保险,采用了memberwise这样的拷贝是非常低效的。。所以你知道我在括号里面说的那段话得意思了吧。。。当你知道你的定义只是一个单纯的数据定义的时候(或说单纯的数据定于我跟愿意称它为struct而不是class)就尽量采用简单的数据类型,跟不要自作聪明的天花乱坠般得自定义什么数据类型出来包涵呵呵 往往初学者就爱这样。。。采用简单数据类型的时候就会copy 的时候采用bitwise这样速度上会有优势。。。有点吹毛求疵了。。。
然后就是在继承一个base class 后者有copy constructor 或是申明或是继承一个virtual function还或是派生自一个。。。不想写了和默认构造函数情况差不多。。。这里就不多说了伤神啊。。。书上说的很好了很清楚了。。同级的copy是不会有问题的,不同级的copy编辑会对对象进行阉割 呵呵 太过分了(这就是memberwise 的好处了)这样父类和子类对象就会指向自己的virtual table 而不会指向相同的virtual table 而bitwise就不会做由此区分。。呵呵但是这样效率很低咋办了。。。对了指针听过拷贝指针这样就是bitwise了 效率会高很多了。。。
然后会是很多很多细节问题。。~欧god还是真是头疼啊。。。
我就比如的说了哈,其实这些都是常识了,比如在对象赋值的时候采用()其实是重载了的哈而不用=,对象作为参数传递是参数的零食变量,通过传址来避免,返回值同样的道理,这就是一些dx参数和返回值这样处理的原因了小菜了。。。
书中提到了使用者层面的优化-optimization at the user level
其实就是减少了拷贝的次数而已
而书中的编译器层面的优化想说的是我也很小白。。。也许就是感觉就是一个简单的位拷贝
妈的又看到那些无聊考官出的笔试题得出处了 真是头疼 为什么他们就爱出写自己都会用的东西了真是蛋疼。。。
当看到 x xxx= 1024;这样的东西的时候请理解为x xxx = (x)1024;就好了。。。
最后是member initialization list
我想会说 的就是尽量使用它吧 这是各 好东西但是要注意初始化顺序噢
书中提到一个好玩的东西就是将成员函数的返回值来初始化成员变量有点意思。~写代码就像打dota补兵之后的东西就是意识问题了补兵是基础,apm嘛就是后天练习了 哈哈哈。。。。
5555我写了3个小时了居然 我的时间啊 下次我要边看变看了 不单独花时间写了。。。。外面眼光好安逸啊。。。
你们的支持就是卡普的动力