多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Function 語意學

Function 語意學

來源:程序員人生   發布時間:2015-03-23 07:54:45 閱讀次數:2732次

概述

在前面文章《C++對象模型》可以知道,class 中成員函數的類型有:nonstatic member function、static member function、virtual member function;不同類型的成員函數的調用會有不同的表現,以下對每種類型的成員函數進行簡單的分析。

nonstatic member functions

為了使 nonstatic member function 能夠與非成員函數具有相同的效力,C++ 編譯器內部將 nonstatic member function 轉換為非成員函數,轉換的步驟以下:

  1. 改寫函數的 signature(函數原型)以添加1個 this 指針;
  2. 通過 this 指針存取操作 nonstatic data member;
  3. 將成員函數經過名稱特殊處理轉換為非成員函數;

例如:

class example{ public: void func(); }; /* 其中成員函數 func() 會被編譯器內部轉換為 void func(example *this)*/

Static member functions

Static member function 和 nonstatic member function 1樣會被編譯器內部轉換為非成員函數,區分是轉換后不存在 this 指針,因此和全局函數1樣,可以做 callback 函數。Static member function 有以下的特性:

  1. 不能直接存取其 class 中的 nonstatic member;
  2. 不能被聲明為 const、volatile 或 virtual;
  3. 1般不需要經過 class object 調用;

virtual member function

獨立的 class

在獨立的 class 中 virtual member function 的調用有兩種方式:指針調用對象調用。例如:

class A { virtual void func(); }; A aA *pA; a.func(); pA->func();

用指針調用pA->func()在編譯器內部被轉換為( * pA->vptr[1])(pA)
用對象調用 a.func() 在內部被當作和非虛擬成員函數1樣處理,即轉換為A::func(&a);所以 virtual 可以inline,在用對象調用的情況下inline 被展開。

單1繼承的 class

具有 virtual member function 的 class,編譯器對其產生1個 vtable, 把指向虛函數地址的指針放在該表格中;繼承含有 virtual member function 類的派生類具有以下的特性:

  1. 保存 base class 中每一個 virtual function 的指針在 vtable 中的索引值及其順序;
  2. 若 derived class 改寫了該 virtual function,則在表格中對應的項上用新函數的地址替換原來函數的地址;
  3. 當 derived class 增加新的虛函數,新的虛函數的地址放在 vtable 中靠后的地方,其實不影響表格中已有函數的次序;

多重繼承的 class

像單繼承1樣,用基類的指針或援用只能訪問基類中定義(或繼承)的成員,不能訪問派生類中引入的成員。當1個類繼承于多個基類的時候,那些基類之間沒有隱含的關系,不允許使用1個基類的指針訪問其他基類的成員。

在多重繼承的 virtual function 機制中,其復雜度圍繞在第2個及后繼的 base class 中,和在履行期間調劑 this 指針;1般規則經過指向第2或后繼 base class 的指針或援用來調用 derived class virtual function。

虛繼承的 class

在虛繼承下,對給定虛基類,不管該類在派生層次中作為虛基類出現多少次,只繼承1個同享的基類子對象。同享的基類子對象稱為虛基類。

指向成員函數的指針

class A { void func(); virtual void x(); };

對非虛函數void func(),取它的指針得到的是函數的實際地址(即綁定在某個 class object 的地址),如:void (A::*pfunc) () = &A::func;
對虛函數virtual void x(),取它的地址得到的是xclass A 的 vtable 中的索引值,如:viod (A::*pfunc) () = &A::x;
使用 class object 或指向class object 的指針來調用,即用a.*pfunc()pa->*pfunc() 調用;

Inline Function

當我們在 class 中定義 inline function 時,編譯器會根據函數的復雜程度決定是不是真正定義為 inline 類型,對不能真正定義為 inline function 的要求,編譯器可能把它們處理為 static member function;真實的 inline function 的擴大操作是在調用的那1點上,這會帶來參數的求值操作和臨時性對象的管理;

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 中文国产成人精品久久一区 | 五月天国产视频 | 欧美视频一区 | 国产麻豆精品在线观看 | 99热久久久这里只有精品免费 | 美国一级毛片免费 | 日韩久久精品 | 伊人影院在线视频 | 欧美另类69xxxxxhd | 日本免费一区二区三区看片 | 久夜色精品国产一区二区三区 | 大杳蕉伊人狼人久久一本线 | 久久在线综合 | 天堂av影院 | 久久久久777777人人人视频 | 在线免费午夜视频 | 国产视频在线一区 | 泡泡影视福利影院 | 久久久久国产精品嫩草影院 | 亚洲欧美乱综合图片区小说区 | 欧美一级片黄色片 | 一级做a爰片性色毛片男 | 中文字幕一区二区三区精品 | 国产成人精品日本亚洲网站 | 日产毛片 | 伊人情人综合成人久久网小说 | 久久国产精品免费一区二区三区 | 成人亚洲视频在线观看 | 欧美日本视频一区 | 校园春色激情 | 国产v国产v片大片线观看网站 | 伦理免费在线观看 | 欧美精品一区二区在线观看 | 亚洲伊人久久大香线蕉在观 | 校园春色欧美日韩 | 一区二区三区不卡在线 | 黄色网址网站在线观看 | 国产午夜免费一区二区三区 | 亚洲成熟 | 成年人免费看视频 | 欧美一区视频在线 |