日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 重溫《Inside The C++ Object Model》(2) --Default-Constructor的建構操作

重溫《Inside The C++ Object Model》(2) --Default-Constructor的建構操作

來源:程序員人生   發布時間:2015-01-13 08:29:36 閱讀次數:2737次
//constructor/non-constructor的區分 class Foo { public: //Foo():val(0),next(NULL) {} int val; Foo *next; }; void foo_bar() { Foo bar; if ( bar.val && bar.next ) { cout << bar.val << endl; printf("%p ", bar.next); cout << "Un initialization" << endl; } else { cout << "Initialization" << endl; } }

帶有Default Constructor” 的 Member Class Object

(1)如果class A 內含有1個或1個以上的member-class-object, 那末class A 的每個constructor必須調用每一個member-classesdefault-constructor; 編譯器會擴大已存在的constructor, 在其中安插1些代碼使得user-code在被履行前先調用必要的default-constructors.

(2)C++語言要求以”member-objects 在 class 中的生命次序”來調用各個constructors.

 

假定有以下類:

class Dopey { public: Dopey(); // ... etc ... }; class Sneezy { public: Sneezy(int); Sneezy(); // ... etc ... }; class Bashful { public: Bashful(); // ... etc ... }; class Snow_White { public: Dopey dopey; Sneezy sneezy; Bashful bashful; // ... etc ... private: int mumble; };

如果Snow_White沒有定義default-constructor, 就會有1個non-trivial-constructor被合成出來依序調用Dopey, Sneezy, Bashfuldefault-constructors. 但是如果Snow_White定義了下面這樣的default-constructor:

Snow_White::Snow_White() : sneezy(1024) { mumble = 2048; }

它會擴大:

//編譯器擴大后的default constructor //C++偽碼 Snow_White::Snow_White() : sneezy(1024) { //插入 member class object //調用其 constructor dopey.Dopey::Dopey(); sneezy.Sneezy::Sneezy(); bashful.Bashful::Bashful(); //explicit user-code mumble = 2048; }

帶有Default Constructor” 的 Base Class

在派生類中,如果同時存在member-class-object, 則先調用其base-class-constructor, 而后調用member-class-objectconstructor.

 

帶有1個Virtual Function” 的 Class

以下的兩種情況:

(1)class 聲明(或繼承)1個virtual-function.

(2)class 派生自1個繼承串鏈其中有1個或更多的virtual-base-classes.

都會有以下的擴大操作在編譯期產生:

[1]1個 virtual-function-table(cfront中被稱為vtbl)會被編譯器生成內放classvirtual-function地址;

[2]在每個class-object1個額外的pointer-member(也就是vptr)會被編譯器合成出來內含相干的class-virtual-function-table(class-vtbl)的地址.

 

則假定有以下繼承關系和代碼:


void flip(const Widget &widget) { widget.flep(); }

widget.flip()的虛擬引發操作會被重新改寫以使用widget的 vptr 和 vtbl中的flip()條目:

//widget.flip() 中的虛擬引發操作的改變 (*widget.vptr[1]).(&widget);

帶有1個Virtual Base Class” 的 Class

假定有以下繼承關系與代碼:


class X { public: virtual void memFunction() const { cout << "In X" << endl; } }; class A : public virtual X { public: void memFunction() const { cout << "In A" << endl; } }; class B : public virtual X { public: void memFunction() const { cout << "In B" << endl; } }; class C : public A, public B { public: void memFunction() const { cout << "In C" << endl; } }; void foo(const X *px) { px -> memFunction(); } int main() { foo(new X); foo(new A); foo(new B); foo(new C); } /* void foo(const X &rx) { rx.memFunction(); } int main() { foo(X()); foo(A()); foo(B()); foo(C()); } */

編譯器沒法固定住foo()當中”經過px而存取的X::memFunction()”的實際偏移位置由于px的真正類型可以改變編譯器必須改變”履行存取操作”的那些代碼使得X::memFunction()可以延遲至履行才決定下來;

該功能則是靠”在派生類對象中的每個虛基類中安插1個指針(_vbcX [virtual-base-class-X])”完成所有”經過reference/pointer來存取1個virtual-base-class”的操作都可以通過相干的指針來完成.foo()函數可以改寫以下:

void foo(const X *px) { //__vbcX表示由編譯器產生的指針, 指向virtual-base-class-X px -> __vbcX -> memFunction(); }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本三级网址 | 午夜精品久久久久久不卡av | 久久国产亚洲 | 中文字幕成人av | 日韩综合网 | 性一交一乱一乱一视频96 | 亚洲九九精品 | 日韩在线综合 | 精品国产鲁一鲁一区二区张丽 | 欧美性另类| 久久五月婷 | 国产在线黄色 | 日本成人中文字幕 | 天堂中文资源在线观看 | 毛片久久久| 天堂中文字幕在线观看 | 色呦呦视频 | 色综合久久久久久久久久久 | 日韩中文字幕视频 | 国产精品99久久久久久大便 | 久久久久久网址 | 国产日韩欧美在线播放 | 国产一区二区 | 国产福利不卡 | 黄色网页网站 | 男人av资源 | 国产精品久久久久久久久久久久 | 五月激情丁香 | 国产精品一区二区三区不卡 | 欧美高清在线一区 | 91精品国产综合久久久久久 | 日本久久影视 | 精品2区 | 亚洲精美视频 | 日韩区欧美区 | 老司机成人网 | 日韩第一页| 国产91av在线| 午夜av在线播放 | 青草福利 | 亚洲精品久 |