============================================================================
4-1. Member 的各類調用方式
靜態成員函數(static member functions,不屬於對象,沒有this指針)不能直接存取Nonstatic數據;同時不能被聲明爲const(const用於後置修飾函數時只用於限定成員函數,意味着將被修飾的成員函數的隱式參數——this指針由原來的Class* const變爲const Class* const類型,使得在該成員函數內不能修改爲員屬性,除非該屬性被mutable修飾)。
數目各類調用方式函數
(1)Nonstatic Member Functions(非靜態成員函數)this
名稱的特殊處理
編譯器會把參數和函數名稱編碼在一塊兒(函數特徵標:函數名稱+參數數目+參數類型),可是若是「返回類型」聲明錯誤,就沒辦法檢查出來。編碼
(2)Virtual Member Functions(虛擬成員函數)spa
注:「經由一個class object調用一個Virtual function」,這種操做應該老是被編譯器像對待通常的Nonstatic member function同樣地加以決議。因此以下調用操做:
// Point3d obj
obj.normalize();
會被編譯器轉換爲:
// 經由obj調用的函數實體只能夠是Point3d::normalize()
normalize_7Point3dFv(&obj);3d
(3)Static Member Functions(靜態成員函數)指針
圖片4-1-6;code
圖片4-1-7;orm
圖片4-1-8;對象
============================================================================
4-2. Virtual Member functions(虛擬成員函數)
(1)咱們已經知道Virtual function的通常實現模型:每個class 有一個virtual table,內含該class 之中有做用的Virtual function 地址,而後每一個object有一個vptr,指向Virtual table的所在。blog
圖片4-2-1;
圖片4-2-2;
(2)多重繼承下的Virtual table
圖片4-2-3;
圖片4-2-4;
注:Sun編譯器將多個Virtual tables 連鎖爲一個:指向次要表格的指針,可由主要表格名稱加上一個offset得到(能夠得到速度提高)。
(3)虛擬繼承下的Virtual Functions
圖片4-2-5;
圖片4-2-6;
注:不要在一個Virtual base clas 中聲明Nonstatic data members,不然,虛基類,虛函數和相關繼承致使的各類offset調整所來的複雜性會讓你猶如進入迷宮通常。
============================================================================
4-4. 指向 Member Function 的指針
(1)普通Member Function 指針
圖片4-4-1;
//member function指針的聲明語法: double (Point::*coord)(); //指定其值 coord = &Point::y; //調用.origin爲Point對象 (origin.*coord)(); // 或 (ptr->*coord)(); // 此操做會被編譯器轉化爲以下形式: // 虛擬C++碼 (coord)(&origin) // (coord)(ptr);
(2)支持「指向Virtual Member Functions」之指針
圖片4-4-2;
圖片4-4-3;
(3)在多重繼承之下
圖片4-4-4;
============================================================================
4-5. Inline Functions
圖片4-5-1;
(1)形式參數
圖片4-5-2;
(2)局部變量
圖片4-5-3;
圖片4-5-4;
圖片4-5-5;
圖片4-5-6;
圖片4-5-7;
============================================================================