深度探索c++對象模型 第一章

1,聲明與定義。c++

//聲明式以下:git

extern int x;   //對象式(變量式)聲明程序員

std::size_t numDigits(int number);  //函數式聲明函數

class Widget;    //類聲明this

template<typename T>    //模板類聲明設計

class GraphNode;3d

//定義式以下:指針

int x;    //對象的定義對象

std::size_t numDigits(int number)    //函數的定義blog

{

  ...

}

class Widget               //類的定義

{

  ...

};

template<typename T>            //模板類的定義

class GraphNode

{

  ...

};

聲明式,其實就是讓編譯器知道名稱和類型。這樣編譯的時候就可以經過。

定義式,其實就是讓編譯器知道細節。這樣在連接器鏈接的時候就可以找到對應的代碼。

2,結構、類等都是程序員自定義類型,相比於int,它是自定義類型,而int是內置類型。因此他們都是類型。只有定義該類型的變量纔會分配內存。

3,對於c++的類,類的對象存儲的是類中描述的數據成員。這些數據成員多是本身類中聲明的,也多是父類繼承而來的。但類的對象中並無存儲成員函數。成員函數實際上是全部對象共用的。調用的時候,會隱藏一個this指針傳入成員函數用以區分是哪一個對象調用了成員函數。

4,一個程序的設計能夠有很是多種:面向對象仍是面向過程。若是是面向對象的話,是經過繼承類實現代碼重用仍是不經過繼承。是否須要虛繼承、是否須要虛函數、是否須要支持模板等等,還能夠考慮使用宏來實現,速度比函數調用還要快。

5,c++的虛函數和虛基類會有內存上的開銷。能夠反思虛函數表。

6,類的數據成員有兩種類型:靜態數據成員和非靜態數據成員。類的成員函數有三種類型:靜態成員函數、非靜態成員函數、虛函數

7,

8,真正的c++對象模型:

從圖中能夠看出,非靜態數據成員以及一個虛表指針被包含在對象中。靜態成員函數、非靜態成員函數、靜態數據成員都被放在對象外面。虛函數的地址則放在虛表中。

9,

指針的類型轉換,不改變指針自己的值(是一個地址),而是改變編譯器解釋這個地址所指向的內存的方式。

10,

相關文章
相關標籤/搜索