ITPub博客

首页 > 应用开发 > IT综合 > 深入探索C++对象模型第五章学习心得

深入探索C++对象模型第五章学习心得

原创 IT综合 作者:dongyu2013 时间:2014-03-31 18:59:37 0 删除 编辑
1.抽象类中可以定义静态函数,这个静态函数可以像其他类中的静态函数的使用方法使用。
2.在抽象类中,如果析构函数是纯虚函数,必须定义,因为派生类的析构函数要调用抽象类中的析构函数。
3.尽量把抽象类中的数据成员抽离出来,使抽象类中只有接口函数。
4.如果类的构造函数列表有默认值,可以直接定义对象,不用显示地调用构造函数。
5.T object;发生什么事情?
(1)记录在member initialization list中的data members初始化操作会被放进constructor的函数主体,并以members的声明顺序被调用。
(2)如果有一个member并没有出现在member initialization list之中,但它有一个default constructor,那么该default constructor必须被调用。
(3)在那之前,如果class object有virtual table pointer(s), 他们必须被设定初值,指向适当的virtual table
(4)在拿之前,所有上一层的base class constructors必须被调用,以base class的声明顺序为顺序(与member initialization list中的顺序没有关系)
    1.如果base class被列于member initialization list中,那么任何显示指定的参数都应该被传递过去
    2.如果base class没有被列于member initialization list中,而它有default constructor,那么就调用之
    3.如果base class是多重继承下的第二或后继的base class,那么this指针必须有所调整
(5)在那之前,所有virtual base class constructors必须被调用,从左到右,从最深到最浅
    1.如果class被列于member initialization list中,那么如果有任何显示指定的参数,都应该传递过去。若没有列于list之中,而class        有一个default constructor,亦应该调用
    2.此外,class中的每一个virtual base class subobject的偏移量(offset)必须在执行期可被调用
    3.如果class object是底层的class,其constructors可能被调用,某些用以支持这一行的机制必须放进去
6.在class的constructor的member initialization list中调用该class的一个虚拟函数,总是安全的。这是因为,正如我们所见,vptr保证能够在member initialization list被扩展之前,由编译器正确设定好。但是在语意上可能是不安全的,因为函数本身可能还得依赖未被设立初值的members.所以并不推荐这种做法。
7.一个class对默认的copy assignment operator,在以下情况,不会表现出bitwise copy语意
(1)当class内含一个members object,而其class有一个copy assignment operator时
(2)当一个class的base class有一个copy assignment operator
(3)当一个class声明了任何virtual functions时
(4)当class继承一个virtual base class时
8.如果class没有定义destructor,那么只有在class内含的member object拥有destructor的情况下,编译器才会自动合成一个
9.派生类析构函数的调用
(1)destructor的函数本体首先被执行
(2)如果class拥有member class objects,而后者拥有destructors,那么它们会以其声明顺序的相反顺序被调用
(3)如果object内含一个vptr,现在被重新设定,指向适当之base class的virtual table
(4)如果有任何直接的nonvirtual base classes拥有destructor,它们会以其声明顺序的相反顺序被调用
(5)如果有任何virtual base class拥有destructor,而目前讨论的这个class是最尾端的class,那么它们会以其原来的构造顺序的
 相反顺序被调用
10.new运算符实际上总是以标准的C malloc()完成,虽然并没有规定一定得这么做不可。相同情况,delete运算符也总是以标准的C free()完成的














来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29012686/viewspace-1133475/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 同年同月出生
请登录后发表评论 登录
全部评论

注册时间:2013-12-25

  • 博文量
    263
  • 访问量
    208145