下面用實際的案例來說明C++類概念的問題,在世界中,經常有屬於同一類的對象,比如,你使用的電腦只是世界上很多電腦中的一台而已,面向對象軟件中,也有很多共享相同特征的不同的對象。
首先一個沒有明顯的含有成員的C++類,它的大小不是0,因為實際上它不是空的,它被編譯器安插了一個char,為的是使這個C++類的兩個對象能夠在內存中被分配獨一無二的地址.至於兩個派生的C++類Y和Z,因為語言本身造成的負擔,還有編譯器對於特殊情況進行的優化處理,再有Alignment的限制,因此結果變成了8.這個8是怎麼組成的?
- typedef int length; //zai
- class point3d
- {
- public:
- //length被決議成global typedef 也就是int
- //_val被決議成Point3d::_val
- void mumble(length val){_val=val;}
- length mumble(){return _val;}
- //……
- private:
- //length必須在這個class對它的第一個參考操作之前被看見
- //這樣聲明將使先前的參考操作不合法
- typedef float length;
- length _val;
- //……
不過需要注意的是不同的編譯器Y和Z大小的結果也會不同.因為新的編譯器會將一個空的virtual base class看做是派生類對象的開頭部分,因此派生類有了member,因此也就不必分配char的那一個bytes.也就用不到填補的3個bytes,因此有可能在某些編譯器中
- Point3d
- Point3d::translate(const Point3d &pt)
- {
- x+=pt.x;
- y+=pt.y;
- z+=pt.z;
- }
雷神1、4、8……的說了一堆,也不知大家明白與否,但是這第三章,讀起來確實比前兩章順多了。我們繼續我們來看Data Member 的Binding,現在我們對數據成員的綁定只需要記住一個防御性風格:始終把嵌套類型的聲明放在class的開始部分,這樣做可以確保非直覺綁定的正確性。看下面的一個例子:
- class X{};
- class Y:public virtual class X{};
- class Z:public virtual class X{};
- class A:public Y,public Z{};
怎麼成了抄書了,雷神也不知不覺,可能是在這章的理解上比較容易些吧,不用去想個看的見摸的著的東西比劃。好象小朋友學算術。一位數的計算不用掰手指頭,可是兩位數或者三位數的計算,手指頭加上腳指頭還是不夠。學習就是這麼回事。理解力和抽象能力很重要。回來繼續學習。
通過這一章我還知道了。數據成員的布局。數據成員的存取。並且對Static data members有了進一步的了解,在class的生命周期中,靜態成員被看作是全局變量,每一個member的存取不會導致任何空間或效率上的額外負擔。不論是從一個復雜的繼承關系中繼承還是直接聲明的。
Static data member都只會有一個實體。並且有著非常直接的存取路徑。另外如果兩個C++類都聲明了一個相同名字的靜態成員變量,那麼編譯器會通過一種算法,為我們解決名字沖突的問題。而非靜態的成員變量的存去實際上是通過implicit class objectthis指針)來完成的。