Category Archives: C/C++

读《C++对象模型》- 构造函数语意学

一、Default Constructor C++新手一般有两个误解: 任何class如果没有定义default constructor,就会被合成出一个来。 编译器合成出来的default constructor会明确设定”class内每一个data member的默认值”。 有四种情况,会导致“编译器必须为未声明constructor之classes合成一个default constructor“。C++ Standard把那些合成物称为implicit nontrivial default constructors(隐式并有价值的默认构造函数)。至于没有存在那四种情况而又没有声明任何constructor的classess,则说它们拥有的是implicit trivial default constructors,它们实际上并不会被合成出来。那么这四种有价值的默认构造函数分别是: 带有Default Constructor的Member Class Object。 带有Default Constructor的Base Class。 带有一个Virtual Function的Class。 带有一个Virtual Base Class的Class(Virtual Base Class是用来被虚拟继承的基类,防止在一个对象中重复出现几个基类)。 对于”带有Default Constructor的Member Class Object”,编译器会扩张已存在的construtors,没有则会合成只满足编译器需要的default constructor。然后在constructors中安插一些代码,使得user code在被执行之前,先调用必要的member class objects’ construtors,有多个member … Continue reading

Posted in C/C++ | Leave a comment

读《C++对象模型》- 对象模型

在C++的对象模型中,nonstatic data members被配置于每一个class object之内,static data members则被存放在所有的class object之外,而static和nonstatic function members也被放在所有的class object之外。Virtual functions则以两个步骤支持之: 每一个class产生出一堆指向virtual functions的指针,放在表格之中。这个表格称为virtual table(vtbl)。 每一个class object被添加了一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定和重置都由每一个class的constructor、destructor和copy assignment运算符自动完成。每一个class所关联的type_info object(用以支持runtime type identification, RTTI)也经由virtual table被指出来,通常是被在这个表格的第一个slot处。 对于下面的代码: class Point { public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual … Continue reading

Posted in C/C++ | Leave a comment