标签:
// 某个foo.h头文件,从某处含入 extern float x; // 程序员的Point3d.h文件 class Point3d { public: Point3d(float, float, float); // 问题:被传回和被设定的x是哪一个x? float X() const { return x; } void X(float new_x) const { x = new_x; } private: float x, y, z; };Point3d::X()传回哪一个x?是 class 内部的那个x,还是外部(extern)的那个x?现在的答案是内部的.但过去的答案并不是这样.
class Pointed { // 防御性程序设计风格 #1 // 在class声明开始先放置所有的data members float x, y, z; public: float X() const { return x; } // ...etc... };2. 把所有的inline functions,不管大小都放在 class 声明之外:
class Point3d { public: // 防御性程序设计风格 #2 // 把所有的inlines都移到class之外 Pointed(); float X() const; void X(float) const; // ...etc... }; inline float POint3d::X() const { return x; }这些程序设计风格事实上到今天还存在,这个古老的语言规则被称为"member rewriting rule",大意是"一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值(evaluated)的".C++ Standard以"member scope resolution rules"来精炼这个"rewriting rule",其效果是,如果一个inline函数在 class 声明后立刻被定义的话,那么就还是会对其评估求值(evaluated).也就是说,如果写下面的代码:
extern int x; class Point3d { public: // 对于函数本身的分析将延迟直至class声明的右括号出现才开始 float X()const { return x; } private: float x; };对于member functions本身的分析,会直到整个 class 的声明都出现了才开始.因此,在一个 inline member function内的一个data member绑定操作,会在整个 class 声明完成后才发生.
class Point3d { public: // ... private: float x; static List<Point3d *> *freeList; float y; static const int chunkSize = 250; float z; };Nonstatic data members在 class object中的排列顺序将和其被声明的顺序一样,任何中间介入的 static data members如freeList和chunkSize都不会被放进对象布局中.在上述例子中,每一个Point3d对象是由三个 float 组成,次序是x,y,z.static data members存放在程序的data segment中,和个别的 class objects无关.
class Point3d { public: // ... private: float x; static List<Point3d *> *freeList; private: float y; static const int chunkSize = 250; private: float z; };其 class object的大小和组成都和先前声明的那个相同,但是members的排列次序则视编译器而定.
template <class class_type1, class class_type2, class class_type3> char * access_order(data_type1 class_type::*mem1, data_type2 class_type::*mem2) { assert(mem1 != mem2); return mem1 < mem2 ? "member 1 occurs first" : "member 2 occurs first"; }上述函数可以这样被调用:
access_order(&Point3d::z, &Point3d::y);于是class_type会被绑定为Point3d,而data_type1和data_type2会被绑定为float.
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/47220705