锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品av麻豆的观看方式,国产亚洲精品成人av久久ww,在线免费观看一区二区三区http://www.shnenglu.com/jzp/category/1436.html ----- 瑕侀粦灝遍粦褰誨簳zh-cnMon, 19 May 2008 17:10:44 GMTMon, 19 May 2008 17:10:44 GMT60Inside The C++ Object Model 瀛︿範(fàn)絎旇--Semantics of Construction, Destructin, and Copyhttp://www.shnenglu.com/jzp/articles/14380.html鐚╃尒鐚╃尒Mon, 30 Oct 2006 06:42:00 GMThttp://www.shnenglu.com/jzp/articles/14380.htmlhttp://www.shnenglu.com/jzp/comments/14380.htmlhttp://www.shnenglu.com/jzp/articles/14380.html#Feedback0http://www.shnenglu.com/jzp/comments/commentRss/14380.htmlhttp://www.shnenglu.com/jzp/services/trackbacks/14380.htmlChapter 5. Semantics of Construction, Destruction, and Copy

5.1 鈥滄棤緇ф壙鈥?鎯呭喌涓嬬殑瀵硅薄鏋勯?br />1. 鏅氱被鍨?鍜孋鐩稿悓)
2. 鎶界浉鏁版嵁綾誨瀷
3. 涓虹戶鎵夸綔鍑嗗

5.2 緇ф壙浣撶郴涓嬪璞$殑鏋勯?br />1.聽 閫氱敤緇ф壙鏋勯犺鍒?br />聽聽聽聽 (1) 鍦ㄦ垚鍛樺垵濮嬪寲鍒楄〃涓殑data members鍒濆鍖栨搷浣滀細琚斁榪沜onstructor鐨勫嚱鏁版湰韜紝騫朵互members鐨勫0鏄庨『搴忎負欏哄簭銆?br />聽聽聽聽 (2) 濡傛灉鏈変竴涓猰ember娌℃湁鍑虹幇鍦ㄥ垵濮嬪寲鍒楄〃涓紝浣嗗畠鏈変竴涓猟efault constructor錛岄偅涔坉efault constructor浼氳璋冪敤銆?br />聽聽聽聽 (3) 濡傛灉class object 鏈塿irtual table pointer(s)錛?瀹?浠?蹇呴』琚瀹氬垵濮嬪鹼紝鎸囧悜閫傚綋鐨剉irtual table(s)銆?br />聽聽聽聽 (4) 鍦ㄩ偅涔嬪墠錛屾墍鏈夌殑涓婁竴灞傜殑base class constructors蹇呴』琚皟鐢? 浠ase class鐨勫0鏄庨『搴忎負欏哄簭
聽聽聽聽 (5) 鍦ㄩ偅涔嬪墠錛屾墍鏈夌殑virtual base class constructors蹇呴』琚皟鐢紝浠庡乏鍒板彸錛屼粠鏈娣卞埌鏈嫻呫?

2. 铏氭嫙緇ф壙(virtual Inheritance)
濡傚浜庝笅闈㈢殑綾?聽

聽1class聽Point3d聽:聽publicvirtual聽Point
聽2聽{聽
聽3public:聽
聽4聽聽聽聽Point3d(聽float聽x聽=0.0,聽float聽y聽=0.0,聽float聽z聽=0.0聽)聽
聽5聽聽聽聽聽聽聽聽:聽Point(聽x,聽y聽),聽_z(聽z聽)聽{}聽
聽6聽聽聽聽Point3d(聽const聽Point3d&聽rhs聽)聽
聽7聽聽聽聽聽聽聽聽:聽Point(聽rhs聽),聽_z(聽rhs._z聽)聽{}聽
聽8聽聽聽聽~Point3d();聽
聽9聽聽聽聽Point3d&operator=(聽const聽Point3d&聽);聽
10
11聽聽聽聽virtualfloat聽z(){聽return聽_z;聽}聽
12聽聽聽聽//
13protected:聽
14聽聽聽聽float聽_z;聽
15聽};聽


聽鍙兘鐨勮漿鎹㈡槸榪欐牱鐨?

聽1//聽Psuedo聽C++聽Code:聽
聽2//聽Constructor聽Augmentation聽with聽Virtual聽Base聽class聽
聽3聽Point3d*聽Point3d::Point3d(聽Point3d聽*this,聽bool聽__most_derived,聽聽float聽x,聽float聽y,聽float聽z聽)聽
聽4聽{聽
聽5聽聽if聽(聽__most_derived聽!=false聽)聽
聽6聽聽聽this->Point::Point(聽x,聽y);聽
聽7
聽8聽聽this->__vptr__Point3d聽=聽__vtbl__Point3d;聽
聽9聽聽this->__vptr__Point3d__Point聽=聽__vtbl__Point3d__Point;聽
10
11聽聽this->_z聽=聽rhs._z;聽
12聽聽returnthis;聽
13聽}聽

聽//
聽瀵逛簬濡備笅鐨勭戶鎵垮眰嬈?
聽class Vertex聽聽 : virtual public Point { ... };
聽class Vertex3d : public Point3d, public Vertex { ... };
聽class PVertex聽 : public Vertex3d { ... };

聽綾籔oint3d鐨勬瀯閫犲彲鑳芥槸:

聽1//聽Psuedo聽C++聽Code:聽
聽2//聽Constructor聽Augmentation聽with聽Virtual聽Base聽class聽
聽3聽Point3d*聽Point3d::Point3d(聽Point3d聽*this,聽bool聽__most_derived,聽聽float聽x,聽float聽y,聽float聽z聽)聽
聽4聽{聽
聽5聽聽if聽(聽__most_derived聽!=false聽)聽
聽6聽聽聽this->Point::Point(聽x,聽y);聽
聽7
聽8聽聽this->__vptr__Point3d聽=聽__vtbl__Point3d;聽
聽9聽聽this->__vptr__Point3d__Point聽=聽__vtbl__Point3d__Point;聽
10
11聽聽聽this->_z聽=聽rhs._z;聽
12聽聽returnthis;聽
13聽}

聽//
聽瀵逛簬Vertex3d鐨勬瀯閫犲彲鑳芥槸濡備笅:

聽1//聽Psuedo聽C++聽Code:聽
聽2//聽Constructor聽Augmentation聽with聽Virtual聽Base聽class聽
聽3聽Vertex3d*聽Vertex3d::Vertex3d(聽Vertex3d聽*this,聽bool聽__most_derived,聽float聽x,聽float聽y,聽float聽z聽)聽
聽4聽{聽
聽5聽聽if聽(聽__most_derived聽!=false聽)聽
聽6聽聽聽this->Point::Point(聽x,聽y);聽
聽7
聽8聽聽//聽invoke聽immediate聽base聽classes,聽
聽9聽聽//聽setting聽__most_derived聽to聽false聽
10
11聽聽this->Point3d::Point3d(聽false,聽x,聽y,聽z聽);聽
12聽聽this->Vertex::Vertex(聽false,聽x,聽y聽);聽
13
14聽聽//聽set聽vptrs聽
15聽聽//聽insert聽user聽code聽
16
17聽聽returnthis;聽
18聽}聽

3. vptr鍒濆鍖栬鎰忓(The Semantics of the vptr Initialization)
聽聽聽聽 (1) 鏋勯犲嚱鏁版墽琛岀畻娉?br />聽聽聽聽聽聽聽聽聽 I.聽聽聽 鍦╠erived class constructor 涓? 鎵鏈夌殑"virtual base classes" 鍙?"涓婁竴灞俠ase class"鐨刢onstructors浼氳璋冪敤.
聽聽 II.聽 涓婅堪瀹屾垚涔嬪悗, 瀵硅薄鐨剉ptr(s)浼氳鍒濆鍖? 鎸囧悜鐩稿叧鐨剉irtual talbe(s).
聽聽 III. 濡傛灉鏈夋垚鍛樺垵濮嬪寲鍒楄〃鐨勮瘽, 灝嗗湪constructor浣撳唴鎵╁睍寮鏉? 榪欏繀欏誨湪vptr琚瀹氫箣鍚庢墠鑳借繘琛?浠ュ厤鏈変竴涓獀irtual member function琚皟鐢?br />聽聽 IV. 鏈鍚? 鎵ц紼嬪簭鎵鎻愪緵鐨勪唬鐮?
聽聽聽聽
聽聽聽聽 (2) 紺轟緥:
聽聽聽聽 For example, given the following user-defined PVertex constructor:

1PVertex::PVertex(聽float聽x,聽float聽y,聽float聽z聽)聽
2聽聽聽聽:聽_next(聽0聽),聽Vertex3d(聽x,聽y,聽z聽)
3聽聽聽聽,聽Point(聽x,聽y聽)聽
4聽{聽
5聽聽if聽(聽spyOn聽)聽
6聽聽聽cerr聽<<"within聽Point3d::Point3d()"聽聽<<"聽size:聽"<<聽size()聽<<聽endl;聽
7聽}聽

聽聽鍙兘涓涓墿灞曞涓?

聽1//聽Pseudo聽C++聽Code聽
聽2//聽expansion聽of聽PVertex聽constructor聽
聽3聽PVertex*聽PVertex::PVertex(聽Pvertex*this,聽聽bool聽__most_derived,聽float聽x,聽float聽y,聽float聽z聽)聽
聽4聽{聽
聽5聽聽//聽conditionally聽invoke聽the聽virtual聽base聽constructor聽
聽6聽聽if聽(聽__most_derived聽!=false聽)聽
聽7聽聽聽this->Point::Point(聽x,聽y聽);聽
聽8聽聽//聽unconditional聽invocation聽of聽immediate聽base聽
聽9聽聽聽this->Vertex3d::Vertex3d(聽x,聽y,聽z聽);聽
10
11聽聽//聽initialize聽associated聽vptrs聽
12
13聽聽this->__vptr__PVertex聽=聽__vtbl__PVertex;聽
14聽聽this->__vptr__Point__PVertex聽=聽__vtbl__Point__PVertex;聽
15
16聽聽//聽explicit聽user聽code聽
17聽聽if聽(聽spyOn聽)聽
18聽聽聽cerr聽<<"within聽Point3d::Point3d()"
19聽聽聽<<"聽size:聽"<<聽(*this->__vptr__PVertex[聽3聽].faddr)(this)聽
20聽聽聽<<聽endl;聽
21
22聽聽//聽return聽constructed聽object聽
23聽聽returnthis;聽
24聽}聽


5.3 瀵硅薄鐨勫鍒?Object Copy Sematics)
1. Copy constructor operator 鍦ㄤ互涓嬪嚑縐嶆儏鍐典笅涓嶄細琛ㄧ幇鍑? bitwisecopy
聽聽聽聽 (1) class 鍐呭甫鏈変竴涓猰ember object, 鑰屽叾綾繪湁涓涓猚opy constructor operator鏃躲?br />聽聽聽聽 (2)聽 褰撲竴涓?class 鐨刡ase 鏈変竴涓猚opy assignment operator鏃躲?br />聽聽聽聽 (3)聽 褰撶被澹版槑浜嗕換浣曚竴涓獀irtual functions鏃躲?br />聽聽聽聽 (4)聽 褰揷lass緇ф壙鑷竴涓獀irtual base class鏃?br />聽2. 鍚堟垚紺轟緥

聽1//聽Pseudo聽C++聽Code:聽synthesized聽copy聽assignment聽operator聽
聽2聽inline聽Point3d&聽Point3d::operator=(聽Point3d聽*constthis,聽const聽Point3d聽&p聽)聽
聽3聽{聽
聽4聽聽//聽invoke聽the聽base聽class聽instance聽
聽5聽聽this->Point::operator=(聽p聽);聽
聽6
聽7聽聽//聽memberwise聽copy聽the聽derived聽class聽members聽
聽8聽聽_z聽=聽p._z;聽
聽9聽聽return*this;聽
10聽}聽

5.4 瀵硅薄鐨勫姛鑳?/p>


5.5 鏋愭瀯璇剰瀛?Semantics of Destruction)
1. 鏋愭瀯鍑芥暟鐢熸垚鍘熷垯錛?br />聽濡傛灉綾繪病鏈夊畾涔塪estructor, 閭d箞鍙湁鍦╟lass鍐呭甫鐨刴ember object(鎴栨槸class鑷繁鐨刡ase class)鎷ユ湁destructor鐨勬儏鍐典笅錛岀紪璇戝櫒鎵嶄細鑷姩鐨勫悎鎴愪竴涓潵銆傚惁鍒欙紝destructor浼氳瑙嗕負涓嶉渶瑕侊紝涔熷氨涓嶉渶瑕佽鍚堟垚(褰撶劧鏇翠笉闇瑕佽璋冪敤)

2. 鏋愭瀯璋冪敤榪囩▼
聽聽聽聽 (1) destructor鐨勫嚱鏁版湰韜鍏堣鎵ц銆?br />聽聽聽聽 (2) 濡傛灉class鎷ユ湁member class objects, 鑰屽悗鑰呮嫢鏈塪estructors, 閭d箞瀹冧細浠ュ叾澹版槑欏哄簭鐨勭浉鍙嶉『搴忚璋冪敤.
聽聽聽聽 (3) 濡傛灉object鍐呭甫涓涓獀ptr錛?鍒欑幇鍦ㄨ閲嶆柊璁懼畾錛屾寚鍚戦傚綋鐨刡ase class鐨剉irtual table.
聽聽聽聽 (4) 濡傛灉浠諱綍鐩存帴鐨?涓婁竴灞?novirtual base classes 鎷ユ湁destructor錛岄偅涔堝畠浼氫互鍏跺0鏄庨『搴忕浉鍙嶇殑欏哄簭璋冪敤
聽聽聽聽 (5) 濡傛灉鏈変換浣曠殑virtual base classes 鎷ユ湁destructor錛?鑰屽綋鍓嶈璁虹殑榪欎釜class鏄渶鏈鐨刢lass錛?閭d箞瀹冧滑浼氫互鍏跺師鏉ョ殑鏋勯犻『搴忕浉鍙嶇殑欏哄簭琚皟鐢?



鐚╃尒 2006-10-30 14:42 鍙戣〃璇勮
]]>
Inside The C++ Object Model 瀛︿範(fàn)絎旇--The Semantics of Functionhttp://www.shnenglu.com/jzp/articles/14379.html鐚╃尒鐚╃尒Mon, 30 Oct 2006 06:39:00 GMThttp://www.shnenglu.com/jzp/articles/14379.htmlhttp://www.shnenglu.com/jzp/comments/14379.htmlhttp://www.shnenglu.com/jzp/articles/14379.html#Feedback0http://www.shnenglu.com/jzp/comments/commentRss/14379.htmlhttp://www.shnenglu.com/jzp/services/trackbacks/14379.htmlChapter 4.聽 The Semantics of Function: Function 璇剰瀛?/p>

4.1 Member 鍑芥暟鐨勫悇縐嶈皟鐢ㄦ柟寮?br />1. Nonstatic Member Function(闈為潤鎬佹垚鍛樺嚱鏁?
聽聽聽 瑕佸仛濡備笅鐨勮漿鎹?
聽聽聽 (1) 鏀瑰啓鍑芥暟鐨勫師褰? 瀹夋彃涓涓弬鏁板埌member function涓? 鐢ㄤ簬鎻愪緵涓涓瓨鍙栫閬? 浣縞lass object 寰椾互璋冪敤璇ュ嚱鏁? 榪欎釜棰濆鐨勬寚閽堢О涔嬩負: this鎸囬拡.
聽聽聽 濡?聽聽
聽Point3d::magnitude()聽 浼氳漿鎹負:聽 Point3d::magnitude(Point3d *const聽 this)

聽聽聽 (2)聽 瀵瑰嚱鏁板唴姣忎竴涓拡瀵筺ostatic data member鐨勫瓨鍙栨搷浣滄敼緇忕敱this鎸囬拡鏉ュ瓨鍙?
聽聽聽聽 濡?
聽聽聽聽聽聽聽聽聽聽 return sqrt(
聽聽this->_x聽 *聽 this->_x聽 + this->y * this->_y聽 + this->_z * this->_z;
聽聽聽 (3)聽 灝嗗member function 閲嶅啓涓涓閮ㄥ嚱鏁? 瀵瑰嚱鏁板悕縐拌繘琛?mangling"澶勭悊, 浣垮畠鐢熸垚涓涓嫭涓鏃犱簩鐨勫悕縐?br />聽聽聽
2. Virtual Member Function(铏氭嫙鎴愬憳鍑芥暟)
聽聽聽聽 渚嬪:
聽 ptr->normalize();
聽 瀹冨皢琚漿鍖栦負濡備笅鐨勮皟鐢?
聽( * ptr->vptr[ 1 ])( ptr );
聽榪欓噷鏈夊嚑鐐硅鏄庯細銆
聽i.聽 vptr鏄敱緙栬瘧鍣ㄧ敓鎴愮殑鎸囬拡錛屾寚鍚憊irtual table
聽ii.聽 1 榪欓噷鏄痸irtual table slot 鐨勭儲寮曞鹼紝瀹冨叧鑱斿埌nomalize榪欎釜鍑芥暟
聽iii.聽 絎簩涓猵tr琛ㄧずthis鎸囬拡

3. Static Member Function(闈欐佹垚鍛樺嚱鏁?
聽聽聽聽 濡傛灉Point3d::normalize()鏄竴涓猻tatic member function鐨勮瘽錛岃繖涓や釜璋冪敤浼氳漿鍖栦負涓鑸殑鎿嶄綔錛?br />聽聽聽聽 obj.normalize();
聽聽聽聽 ptr->normalize();
聽聽聽聽 杞寲涓猴細銆
聽聽聽聽 // obj.normalize();
聽聽聽聽 normalize__7Point3dSFv();
聽聽聽聽 // ptr->normalize();
聽聽聽聽 normalize__7Point3dSfv();

4.2 Virtual Member Functions(铏氭嫙鎴愬憳鍑芥暟)
1. 鍗曚竴緇ф壙涓嬬殑Virtual Functions
聽聽聽聽 涓涓鎬佺殑class object 韜笂澧炲姞涓や釜members:
聽I.聽聽 涓涓瓧絎︿覆鎴栨暟瀛?聽 琛ㄧずclass鐨勭被鍨?br />聽II.聽 涓涓寚閽堬紝鎸囧悜鏌愪釜琛ㄦ牸錛岃〃鏍間腑甯︽湁紼嬪簭鐨剉irtual function鐨勬墽琛屾椂鏈熷湴鍧
聽聽聽 瀵逛簬涓涓猘ctive virtual function鍖呮嫭涓嬮潰涓変釜鍐呭錛氥
聽聽聽聽聽聽聽 I.聽聽 榪欎釜class 鎵瀹氫箟鐨勫嚱鏁板疄浣? 瀹冧細鏀瑰啓涓涓彲鑳藉瓨鍦ㄧ殑base class virtual function 鍑芥暟瀹炰綋.
聽II.聽 緇ф壙鑷熀綾葷殑瀹炰綋錛屻榪欐槸鍦╠erived class 鍐沖畾涓嶆敼鍐檝irtual function 鏃舵墠浼氬嚭鐜扮殑鎯呭喌
聽III. 涓涓猵ure_virtual_called()鍑芥暟瀹炰綋錛屽畠鏃㈠彲浠ユ壆婕攑ur virtual function鐨勭┖闂翠繚鍗呰鑹?銆涔熷彲浠ュ綋鍋氭墽琛屾湡寮傚父鍑芥暟.

2. 澶氶噸緇ф壙涓嬬殑Virtual Functions
聽聽聽 榪欑緇ф壙娑夊強鍒拌璋冩暣this鎸囬拡錛屽茍涓旇姹備笉姝竴涓獀tbl鍜寁ptr錛屽悓鏃惰濂藉嚑涓繖縐嶈櫄琛ㄥ拰鎸囬拡

3. 铏氭嫙緇ф壙涓嬬殑Virtual Functions


4.3 鍑芥暟鐨勬晥鑳?/p>

4.4 鎸囧悜Member Functions鐨勬寚閽?Pointer-to-Member Functions)
1. 鎸囧悜涓鑸垚鍛樺嚱鏁扮殑鎸囬拡(Nostatic member and novirtual member function)
聽聽聽 鍙栦竴涓猲ostatic member function鐨勫湴鍧,聽 濡傛灉璇ュ嚱鏁版槸novirtual, 鍒欏緱鍒扮殑緇撴灉鏄畠鍦ㄥ唴瀛樹腑鐪熸鐨勫湴鍧, 鐒惰岃繖涓湴鍧涔熶笉鏄畬鍏ㄧ殑, 瀹冧篃闇瑕佺粦瀹氬埌鏌愪釜class object鐨勫湴鍧涓? 鎵嶈兘澶熻皟鐢ㄨ鍑芥暟. 鎵鏈夌殑nostatic member functions閮借瀵硅薄鐨勫湴鍧(鐢╰his鎸囧嚭).
聽聽聽 渚嬪:
聽聽聽聽 double (Point::*pmf)();聽// 瀹氫箟涓涓垚鍛樺嚱鏁版寚閽?br />聽聽聽聽聽 pfm = &Point::y;聽聽聽// 鍒濆鍖栬繖涓寚閽堜負
聽聽聽聽 (ptr->*pfm)() ;聽聽聽// 璋冪敤涓?聽 緙栬瘧鍣ㄨ漿鍖栦負: (pfm)(ptr)

2. 鏀寔"鎸囧悜Virtual Member Functions"鐨勬寚閽?br />聽聽聽 瀵逛簬virtual function, 鍏跺湴鍧鍦ㄧ紪璇戞椂鏈熸槸鏈煡鐨? 鎵鑳界煡閬撶殑浠呮槸virtual function鍦ㄧ浉鍏崇殑vitual table 涓殑绱㈠紩鍊? 涔熷氨鏄瀵逛簬涓涓獀irtual member function鍙栧叾鍦板潃, 鎵鑳借幏寰楃殑鍙槸涓涓儲寮曞?
聽聽聽 鎵浠ュ鏋?
聽聽聽 pmf = &Point::z();聽// 鑾峰緱鐨勬槸绱㈠紩鍊?聽 璋冪敤鏃?
聽聽聽 (ptr.->pmf)()聽聽聽// 浼氳漿鍖栦負: (* ptr->vptr[(int)pfm] (ptr)

3. 鍦ㄥ閲嶇戶鎵夸笅,鎸囧悜Member Functions鐨勬寚閽?br />聽聽聽聽 姣旇緝澶嶆潅,聽 瀹氫箟浜嗕竴涓粨鏋勬敮鎸佽繖浠殑鎿嶄綔

4. 鎸囧悜 Member Functions 鎸囬拡鐨勬晥鐜?/p>


4.4 Inline Functions
1. inline functions鐨勭敓鎴愭潯浠?/p>

2. 瀵瑰艦寮忓弬鏁扮殑澶勭悊(Formal Arguments)
渚嬪:

聽1inline聽int聽min(聽int聽i,聽int聽j聽)聽
聽2聽{聽
聽3聽聽聽聽return聽i聽<聽j聽?聽i聽:聽j;聽
聽4聽}聽
聽5聽and聽the聽following聽three聽invocations聽of聽the聽inline聽function:
聽6
聽7聽inline聽int聽bar()聽
聽8聽{聽
聽9聽聽聽聽int聽minval;聽
10聽聽聽聽int聽val1聽=1024;聽
11聽聽聽聽int聽val2聽=2048;聽
12
13/*(1)*/minval聽=聽min(聽val1,聽val2聽);聽
14/*(2)*/minval聽=聽min(聽1024,聽2048聽);聽
15/*(3)*/minval聽=聽min(聽foo(),聽bar()+1聽);聽
16
17聽聽聽聽return聽minval;聽
18聽}聽


鐢ㄤ笅闈㈢殑鏂瑰紡榪涜澶勭悊:
聽聽 (1)聽 鐩存帴鐨勫弬鏁版浛鎹?br />聽//(1)聽聽聽聽 simple argument substitution
聽minval = val1 < val2 ? val1 : val2;

聽聽 (2) 濡傛灉瀹為檯鍙傛暟鏄竴涓父閲忚〃杈懼紡(const expression),聽 鎴戜滑灝卞彲浠ュ湪鏇挎崲鍓嶅畬鎴愬瀹冪殑姹傚兼搷浣?
聽//(2)聽 constant folding following substitution
聽minval = 1024;
聽聽
聽聽 (3) 甯︽湁鍓綔鐢ㄧ殑瀹為檯鍙傛暟, 寮曞叆涓存椂鎬х殑瀵硅薄
聽//(3)聽聽聽聽 side-effects and introduction of temporary
聽int t1;
聽int t2;

聽minval =聽 ( t1 = foo() ), ( t2 = bar() + 1 ),聽 t1 < t2 ? t1 : t2;

3. 瀵筰nline鍑芥暟甯︽湁灞閮ㄥ彉閲忕殑澶勭悊(Local Variables)
聽聽聽 濡?
聽inline int min( int i, int j )
聽{
聽聽int minval = i < j ? i : j;
聽聽return minval;
聽}
聽聽聽 瀵逛簬濡備笅鐨勮皟鐢?
聽聽聽 {
聽聽聽 int local_var;
聽聽聽 int minval;

聽聽聽 // ...
聽聽聽 minval = min( val1, val2 );
聽聽聽聽 }

聽聽聽 杞崲鍙兘鐨勭粨鏋滄槸:

1聽聽聽聽{聽
2聽聽聽聽int聽local_var;聽
3聽聽聽聽int聽minval;聽
4聽聽聽聽//聽mangled聽inline聽local聽variable聽
5聽聽聽聽int聽__min_lv_minval;聽
6
7聽聽聽聽minval聽=聽聽(聽__min_lv_minval聽=聽聽val1聽<聽val2聽?聽val1聽:聽val2聽),聽聽__min_lv_minval;聽
8聽聽聽聽聽}



鐚╃尒 2006-10-30 14:39 鍙戣〃璇勮
]]>
Inside The C++ Object Model 瀛︿範(fàn)絎旇--The Semantics of Datahttp://www.shnenglu.com/jzp/articles/14378.html鐚╃尒鐚╃尒Mon, 30 Oct 2006 06:36:00 GMThttp://www.shnenglu.com/jzp/articles/14378.htmlhttp://www.shnenglu.com/jzp/comments/14378.htmlhttp://www.shnenglu.com/jzp/articles/14378.html#Feedback0http://www.shnenglu.com/jzp/comments/commentRss/14378.htmlhttp://www.shnenglu.com/jzp/services/trackbacks/14378.htmlChapter 3. The Semantics of Data : Data 璇箟瀛?/p>

紺轟緥浠g爜錛?br />class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};


涓涓被瀵硅薄鐨勫ぇ灝忓彈涓変釜鍥犵礌鐨勫獎鍝?br />i.聽聽 璇█鏈韓鎵閫犳垚鐨勯澶栬礋鎷?overhead),聽 褰撹璦瑕佹敮鎸乿irtual base class 鏃訛紝灝變細瀵艱嚧涓浜涢澶栫殑璐熸媴.
ii.聽 緙栬瘧鍣ㄥ鐗規(guī)畩鎯呭喌鎵鎻愪緵鐨勪紭鍖栧鐞?聽 濡倂irtual base class class X subobject 鐨?bytes澶у皬浼氬嚭鐜板湪瀛愮被Y, Z鐨勮韓涓?
聽聽聽聽聽 濡? sizeof(Y) = sizeof(Z) = 4(8) // 榪欓噷鐨?(8)鍜岀紪璇戝櫒鐩稿叧
聽聽聽聽聽
聽聽聽聽聽 鏈夋椂鍊欐湁鐨勭紪璇戝櫒浼氱敤empty virtual base class 鎶鏈潵浼樺寲, VC灝辨槸閲囩敤榪欎竴鎶鏈殑, 榪欐牱virtual base class 灝變笉鐢ㄥ崰鐢ㄥぇ灝忎簡.

iii.聽 Alignment 鐨勯檺鍒? Y鍜孼鐨勫ぇ灝忔湰鏉ュぇ灝忛兘鏄?, 鍔犱笂virtual base subobject鐨?bytes鐨勫ぇ灝忓叡5涓瓧鑺? 浣嗗疄闄呬笂鍘繪槸8bytes錛岃繖閲屽氨鏄彈鍒板瓧鑺傚榻愮殑褰卞搷.

C++瀵硅薄妯″瀷瀵規(guī)暟鎹殑瀛樻斁緇撴瀯鏄?
i.聽聽 鎶妌onstatic data members鐩存帴鐨勬斁鍦╟lass object涔嬩腑, 瀵圭戶鎵?涓嶇鏄痸irtual 鎴?nonvirtual base class )鑰屾潵鐨刵onstatic data members涔熸槸榪欎竴鏍風(fēng)殑.
ii.聽 娌℃湁寮哄埗瀹氫箟鍏墮棿鐨勬帓鍒楅『搴?br />iii. 瀵箂tatic data members, 鍒欒鏀劇疆鍦ㄤ竴涓猤lobal data segment涓? 涓嶄細褰卞搷鍗曚釜綾葷殑澶у皬, 騫朵笖鍙繚瀛樹竴浠藉疄浣? (template鏈夋墍涓嶅悓)

3.1 Data Member鐨勭粦瀹?The Binding of Data Member)
聽聽聽 紺轟緥浠g爜:

聽1//聽A聽third聽party聽foo.h聽header聽file聽
聽2//聽pulled聽in聽from聽somewhere聽
聽3externfloat聽x;聽
聽4
聽5//聽the聽programmer's聽Point3d.h聽file聽
聽6class聽Point3d聽
聽7聽{聽
聽8public:聽
聽9聽聽聽聽Point3d(聽float,聽float,聽float聽);聽
10
11聽聽聽聽//聽question:聽聽which聽x聽is聽returned聽and聽set?聽
12聽聽聽聽float聽X()聽const聽{聽return聽x;聽}聽
13
14聽聽聽聽void聽X(聽float聽new_x聽)聽const聽{聽x聽=聽new_x;聽}聽
15
16聽聽聽聽//
17
18private:聽
19聽聽聽聽float聽x,聽y,聽z;聽
20聽};聽
21
22


聽鍦ㄦ棭鏈熺殑緙栬瘧鍣ㄤ腑浼氬嚭閿? 涓嶈繃鍦?C++2.0鍚庡氨涓嶄細浜? 鍦–++2.0鍚? 閲囩敤鐨勬槸"rewriting rule" == "member scope rsolution rule" 瑙勫垯鏉ュ鐞嗗畠.
聽浠ュ墠鐨勭紪璇戝櫒涓? float X() const { return x; }, 瀹冧笉鐭ラ亾瑕佽繑鍥炲摢涓涓獂, 榪欓噷瀹冧細榪斿洖鍏ㄥ眬鐨?extern float x, 鎵浠ユ槸涓嶆紜殑. 鍚庢潵鐨勭紪璇戝櫒鏄細鍦ㄦ暣涓猚lass鐨勫0鏄庨兘鍑虹幇浜嗗悗鎵嶄細鍒嗘瀽member functions, 鎵浠ュ畠涓嶄細鐜伴敊.

聽瀵逛簬涓嬮潰鐨勪緥瀛愯繕鏄細鍑洪敊, 鍥犱負瀵逛簬member functions signatures鐨勫垎鏋愪笉浼氬埌綾誨畬鎴愪互鍚? 鑰屾槸絎竴嬈″嚭鐜扮殑鏃跺欏氨浼氬垎鏋愮殑. 濡備笅闈㈢殑:

聽聽鎵浠ユ渶濂藉緇堢殑鎶?nested type declare" 鏀懼湪綾葷殑璧峰澶? (榪欏湪STL涓ソ鍍忔渶鏄庢樉, 閮芥槸鍏堝0鏄庣殑)


3.2 Data Member鐨勫竷灞 (Data Member Layout)

紺轟緥浠g爜:聽

聽1class聽Point3d聽{聽
聽2public:聽
聽3
聽4聽聽聽聽//
聽5
聽6private:聽
聽7聽聽聽聽float聽x;聽
聽8聽聽聽聽static聽List<Point3d*>*freeList;聽
聽9聽聽聽聽float聽y;聽
10聽聽聽聽staticconstint聽chunkSize聽=250;聽
11聽聽聽聽float聽z;聽
12聽};聽
13

聽聽聽聽聽 Data Member鐨勫竷灞鎸夊涓嬬殑瑙勫垯:
聽聽聽聽聽 i.聽聽 Nonstatic data member 鍦╟lass object涓殑鎺掑垪欏哄簭鍜岃澹版槑鐨勯『搴忔槸涓鏍風(fēng)殑, 浠諱綍涓棿浠嬪叆鐨剆tatic data member閮戒笉浼氳鏀捐繘瀵硅薄鐨勫竷灞涓?
聽聽聽聽聽 ii.聽 瑕佹眰鍦ㄥ悓涓access section涓?杈冩櫄鍑虹幇鐨刴embers鍦╟lass object涓湁杈冮珮鐨勫湴鍧"榪欎竴鏉′歡灝卞彲浠?
聽聽聽聽聽 iii. 緙栬瘧鍣ㄥ彲鑳戒細鍚堟垚涓浜涘唴閮ㄤ嬌鐢ㄧ殑data members, 浠ユ敮鎸佹暣涓璞℃ā鍨? 濡倂ptr鎸囬拡.聽 瀵逛簬瀹冪殑鍏蜂綋浣嶇疆, C++ Standard 娌℃湁瑙勫畾, 鐢辯紪璇戝櫒浜у晢鑷繁鍐沖畾. 涓嶈繃浼犵粺涓婁竴鑸槸鏀懼湪鎵鏈夊0鏄庣殑members鐨勬渶鍚? 涔熸湁鎶妚ptr鏀懼湪鎵鏈塩lass object鐨勬渶鍓嶇鐨?


3.3 Data Member鐨勫瓨鍙?br />紺轟緥:
聽聽聽聽聽 Point3d聽origin, *pt = &origin;
聽聽聽聽聽 origin.x聽聽聽 = 0.0;
聽聽聽聽聽 pt->x = 0.0

1. Static Data Members鐨勫瓨鍙?br />聽聽聽 姣忎竴涓猻tatic data member鍙湁涓涓疄浣擄紝瀛樺湪浜庣▼搴忕殑data segment涓傛瘡嬈$▼搴忓彇鐢ㄨ繖涓猻tatic data member鐨勬椂鍊欙紝灝變細琚漿鍖栦負瀵硅瀹炰綋鐨勫敮涓鐨別xtern瀹炰綋鐨勭洿鎺ュ弬鑰冩搷浣?聽 鐢ㄦ寚閽堝瓨鍙栦竴涓暟鍜岀敤瀵硅薄鍘誨瓨鍙栦竴涓暟鏄竴鏍風(fēng)殑銆?br />聽聽聽聽
2. Nostatic Data Members鐨勫瓨鍙?br />聽聽聽 Nostatic data member 鐩存帴瀛樻斁鍦ㄦ瘡涓涓猚lass object涔嬩腑錛岄櫎闈炵粡鐢辨槑紜殑鎴栨殫鍠葷殑class object錛屽惁鍒欐病鏈夊姙娉曠洿鎺ョ殑瀛樺彇瀹冧滑銆?br />聽聽聽 渚嬪:
聽聽聽 Point3d聽 Point3d::translate( const Point3d &pt )
聽聽聽 {
聽聽聽 x += pt.x;
聽聽聽 y += pt.y;
聽聽聽 z += pt.z;
聽聽聽 }
聽聽聽 瀹為檯緇忚繃杞崲鍚庝負錛?br />聽聽聽 Point3d聽 Point3d::translate( Point3d *const this, const Point3d &pt )
聽聽聽 {
聽聽聽聽 this->x += pt.x;
聽聽聽 this->y += pt.y;
聽聽聽 this->z += pt.z;
聽聽聽 }
聽聽聽 瀵筺ostatic data member鐨勮闂槸榪欐牱鐨?聽
聽origin._y = 0.0;聽
聽聽聽 瀹為檯杞崲鎿嶄綔鏄?
聽聽聽聽聽聽聽 &origin + (&Point3d::_y - 1 );
聽聽聽聽聽聽
聽聽聽聽聽聽 娉ㄦ剰:聽 榪欓噷鐨?1鎿嶄綔銆傛寚鍚慸ata member鐨勬寚閽堬紝鍏秓ffset鍊兼繪槸琚姞涓?錛?榪欐牱鍙互浣跨紪璇戠郴緇熷尯鍒嗗嚭:
聽i.聽 涓涓敤浠ユ寚鍑篶lass鐨勭涓涓猰ember鐨刣ata member鐨勬寚閽?
聽ii. 涓涓病鏈夋寚鍑轟換浣昺ember鐨刣ata member鐨勬寚閽?
聽聽
聽聽聽 濡傛灉鏄痸irtual 緇ф壙鐨勮瘽錛屽氨鍙互涓嶄竴鏍蜂簡錛屽彲鑳借澶氬姞灞傜殑璁塊棶灞? 涔熷彲鑳借鍒拌繍琛屾椂鎵嶈兘鍐沖畾錛岀敱緙栬瘧鍣ㄦ墍鍐沖畾.


3.4 鈥滅戶鎵庫濅笌Data Member
聽紺轟緥鏁版嵁:

聽1//聽supporting聽abstract聽data聽types聽
聽2class聽Point2d
聽3聽{聽
聽4public:聽
聽5聽聽//聽constructor(s)聽
聽6聽聽//聽operations聽
聽7聽聽//聽access聽functions聽
聽8private:聽
聽9聽聽float聽x,聽y;聽
10聽};聽
11
12///
13class聽Point3d
14聽{聽
15public:聽
16聽聽//聽constructor(s)聽
17聽聽//聽operations聽
18聽聽//聽access聽functions聽
19private:聽
20聽聽float聽x,聽y,聽z;聽
21聽};聽
22

聽聽聽 C++鐨勭戶鎵挎ā鍨?
聽鍦–++鐨勭戶鎵挎ā鍨嬩腑錛?涓涓猟erived class object 鎵琛ㄧ幇鍑烘潵鐨勪笢瑗匡紝鏄叾鑷繁鐨刴ember鍔犱笂鍏禸ase class(es) member鐨勬誨拰銆傚浜庢暟鎹垚鍛樺嚭鐜扮殑欏哄簭鍦–++ Standard 涓病鏈夎瀹氥備粠涓嬮潰鍑犱釜鏂歸潰鏉ヨ璁烘暟鎹戶鎵?
聽i.聽聽 鍗曚竴緇ф壙涓斾笉鍚湁virtual functions
聽ii.聽聽 鍗曚竴緇ф壙騫跺惈鏈塿irtual functions
聽iii.聽 澶氶噸緇ф壙
聽iV. 铏氭嫙緇ф壙

1. 鍙緇ф壙涓嶈澶氭?Inheritance Without Polymoophism)
聽聽聽 緇ф壙涓鑸笉浼氬鍔犵┖闂存垨瀛樺彇鏃墮棿銆備絾緇ф壙鏈夋椂浼氭湁榪欐牱涓ょ鎯呭喌鍑虹幇:
聽聽聽 i.聽聽 緇忛獙涓嶈凍鐨勪漢鏈夋椂鍙兘浼氶噸澶嶇殑璁捐涓浜涚浉鍚岀殑鍑芥暟.
聽聽聽 ii.聽 鎶婁竴涓被鍒嗚В涓哄灞傦紝鏈夊彲鑳戒細涓轟簡琛ㄧ幇class鐨勪綋緋繪娊璞″寲錛屼嬌鎵闇瑕佺殑絀洪棿鑶ㄨ儉銆?br />聽聽聽聽聽聽聽 鍥犱負C++璇█瑕佷繚璇? 鍑虹幇鍦╠erived class 涓殑base class subobject 鏈夊叾瀹屾暣鍘熸牱鎬с?/p>

2. 鍔犱笂澶氭?Adding Polymorphism)
聽聽聽 濡傦細

聽1class聽Point2d聽
聽2聽{聽
聽3public:聽
聽4聽聽聽聽Point2d(聽float聽x聽=0.0,聽float聽y聽=0.0聽)聽
聽5聽聽聽聽聽聽聽:聽_x(聽x聽),聽_y(聽y聽)聽{};聽
聽6
聽7聽聽聽聽//聽access聽functions聽for聽x聽&聽y聽same聽as聽above聽
聽8聽聽聽聽//聽invariant聽across聽type:聽not聽made聽virtual聽
聽9聽聽
10聽聽聽聽//聽add聽placeholders聽for聽z聽?do聽nothing聽
11聽聽聽聽virtualfloat聽z(){聽return0.0聽};聽
12聽聽聽聽virtualvoid聽z(聽float聽)聽{}聽
13
14聽聽聽聽//聽turn聽type聽explicit聽operations聽virtual聽
15聽聽聽聽virtualvoidoperator+=(聽const聽Point2d&聽rhs聽)
16聽聽聽聽{聽
17聽聽聽聽聽聽聽聽_x聽+=聽rhs.x();聽_y聽+=聽rhs.y();
18聽聽聽聽聽}聽
19聽聽
20聽聽聽聽//聽more聽members聽
21
22protected:聽
23聽聽float聽_x,聽_y;聽
24聽};聽
25
26


聽//
聽瑕佹敮鎸佸鎬侊紝Point2d鏁版嵁鎴愬憳瑕佸仛濡備笅鐨勫伐浣?
聽i.聽聽 瀵煎叆涓涓拰Point2d鏈夊叧鐨剉irtual table(vtbl), 瀛樻斁瀹冨0鏄庣殑姣忎竴涓獀irtual function鐨勫湴鍧
聽ii.聽聽 鍦ㄦ瘡涓猚lass object涓鍏ヤ竴涓獀ptr, 鎻愪緵鎵ц鏈熺殑閾炬帴錛屼嬌姣忎釜object閮借兘鎵懼埌鐩稿簲鐨剉irtual table.
聽iii.聽 鍔犲己construtor, 浣垮畠鑳藉涓簐ptr璁懼畾鍒濆鹼紝璁╁畠鎸囧悜class鎵瀵瑰簲鐨剉irtual table.
聽iV.聽 鍔犲己destructor, 浣垮畠鑳藉鎶規(guī)秷"鎸囧悜class鐨勭浉鍏?virtual table" 鐨剉ptr.

聽Figure 3.3. Data Layout: Single Inheritance with Virtual Inheritance

3. 澶氶噸緇ф壙(Multiple Inheritance)


4. 铏氭嫙緇ф壙(Virtual Inheritance)
聽聽聽 Class 涓鏋滃惈涓涓垨澶氫釜virtual base class subobjects, 瀹冨皢琚垎涓轟袱涓儴鍒? 涓涓笉鍙樼殑灞閮ㄥ拰涓涓叡浜殑灞閮?
聽聽聽 i.聽聽 涓嶅彉鐨勫眬閮ㄤ腑鐨勬暟鎹紝涓嶇鍚庣戶濡備綍琛嶅寲錛屾繪湁鍥哄畾鐨刼ffset錛?鎵榪欎竴閮ㄥ垎鐨勬暟鎹彲浠ョ洿鎺ョ殑琚瓨鍙栥?
聽聽聽 ii.聽 鍏變韓鐨勫眬閮紝鎵琛ㄧ幇鐨勫氨鏄痸irtual base class subobject, 榪欎竴閮ㄥ垎鐨勬暟鎹細鍥犱負姣忔媧劇敓鐨勬搷浣滆屾湁鍙樺寲, 鎵浠ュ畠浠彧鑳介棿鎺ョ殑瀛樺彇銆?/p>


3.5 瀵硅薄鎴愬憳鐨勬晥鐜?Object Member Efficiency)

3.6 鎸囧悜鏁版嵁鎴愬憳鐨勬寚閽?Point to Data Members)



鐚╃尒 2006-10-30 14:36 鍙戣〃璇勮
]]>
Inside The C++ Object Model 瀛︿範(fàn)絎旇 -- The Semantics Of Constructorshttp://www.shnenglu.com/jzp/articles/14377.html鐚╃尒鐚╃尒Mon, 30 Oct 2006 06:33:00 GMThttp://www.shnenglu.com/jzp/articles/14377.htmlhttp://www.shnenglu.com/jzp/comments/14377.htmlhttp://www.shnenglu.com/jzp/articles/14377.html#Feedback0http://www.shnenglu.com/jzp/comments/commentRss/14377.htmlhttp://www.shnenglu.com/jzp/services/trackbacks/14377.html2.1 Default Constructor 鐨勬瀯閫犳搷浣?br />聽聽聽 鎸夌収C++ Annotated Reference Manaual 鐨勮娉曪細"Default constructor... 鍦ㄩ渶瑕佺殑鏃跺欒緙栬瘧鍣ㄤ駭鐢熷嚭鏉?. 榪欓噷鐨勫叧閿瓧鏄細鈥滃湪闇瑕佺殑鏃跺欌濄?
聽聽聽 C++ Standard[ISO-C++95]涓張鏈夊涓嬬殑澹版槑錛氬浜巆lass X, 濡傛灉娌℃湁浠諱綍user-declared constructor錛岄偅涔堜細鏈変竴涓猟efault constructor 琚殫涓0鏄庡嚭鏉?...涓涓鏆椾腑澹版槑鍑烘潵鐨刣efault constructor 灝嗘槸涓涓猼rival鐨刢onstructor"銆?榪欓噷鎴戣寰椾富瑕佹槸鈥渦ser-declared constructor鈥濓紝瀹冨寘鎷敤鎴鋒墍瀹氫箟鐨勬墍鏈夌殑constructor榪樻湁鍏跺畠鐨勪竴浜涙湁virtual鍏抽敭瀛楃殑鎿嶄綔銆傝繖鏍蜂笅闈㈢殑鍥涚鎯呭喌涓嬬敱緙栬瘧鍣ㄧ敓鎴愮殑constructor鏄痭otrival default constructor錛?br />聽聽聽
聽聽聽 1. 甯︽湁 Default Constructor 鐨?Member Class Object(甯︽湁緙虹渷鏋勯犲嚱鏁扮殑綾繪垚鍛樺璞?
聽聽聽 濡傛灉涓涓被鐨勫甫鏈変竴涓垨澶氫釜鐨勭被鎴愬憳瀵硅薄錛岃岀被鎴愬憳瀵硅薄鍙堟湁鏋勯犲嚱鏁幫紝閭d箞灝變細鐢熸垚璇ョ被灝變細鐢熸垚涓涓猲otrival default constructor 鏋勯犲嚱鏁般?鎴愬憳瀵硅薄鐨勬瀯閫犲嚱鏁扮殑璋冪敤鏄寜鎴愬憳瀵硅薄鐨勫0鏄庨『搴忔墽琛岀殑銆備緥濡傦細

class 聽Foo聽 {聽 public :聽Foo(),聽Foo( int )聽.聽} ;
class 聽Bar聽 {聽 public :聽Foo聽foo;聽 char * str;聽} ;聽
聽聽
void 聽foo_bar()
{
聽聽聽聽聽聽聽Bar聽bar;聽
// 聽Bar::foo鍦ㄨ繖閲岃鍒濆鍖?璋冪敤Foo鐨勭己鐪佹瀯閫犺鏁?聽Foo:Foo())
聽聽聽聽聽聽
聽聽聽聽聽聽
//
聽聽聽聽聽 if 聽(str)聽 {聽} 聽聽.聽
聽聽聽}

聽聽聽聽
聽聽聽 瀵逛簬鏈夊涓垚鍛樺璞$殑綾伙紝鍒欐寜鎴愬憳瀵硅薄鍦ㄧ被鐨勫0鏄庝腑鐨勯『搴忚皟鐢ㄥ畠浠殑鏋勯犲嚱鏁般?br />聽聽聽聽聽聽
聽聽聽 2. 甯︽湁 Default Constructor 鐨?Base Class(甯︽湁緙虹渷鏋勯犲嚱鏁扮殑鍩虹被瀵硅薄)聽聽聽聽聽 聽鎸囩殑鏄竴涓病鏈変換浣昪onstructorsrs鐨勭被媧劇敓鑷竴涓甫鏈夆渄efault constructor鈥濈殑鍩虹被銆?濡傛灉綾誨瓨鍦ㄥ涓瀯閫犲嚱鏁扮殑璇濓紝閭d箞緙栬瘧鍣ㄤ篃浼氭墿鍏呯幇鏈夌殑姣忎竴涓瀯閫犲嚱鏁幫紝灝嗚皟鐢ㄥ熀綾葷殑default constructor鐨勪唬鐮佸姞鍏ュ埌鍏朵腑銆?
聽聽聽聽聽聽聽
聽聽聽 3. 甯︽湁涓涓?Virtual Function 鐨?Class
聽聽聽 榪欐牱鐨剉irtual Function鍙互浣跨戶鎵挎潵鐨勬垨鐩存帴瀹氫箟鐨勩?緙栬瘧鍣ㄥ湪緙栬瘧鏈熼棿浼氬仛濡備笅宸ヤ綔
聽聽聽 a. 鐢熸垚涓涓獀irtual Function talbe(vtbl), 鐢ㄦ潵瀛樻斁class 鐨剉irtual function鐨勫湴鍧
聽聽聽 b. 鍦ㄦ瘡涓涓猚lass object涓紝娣誨姞涓涓澶栫殑pointer member(vptr)錛屽畠鎸囧悜class vtbl鐨勫湴鍧
聽聽聽
聽聽聽 4. 甯︽湁涓涓?Virtual Base Class 鐨?Class
聽聽聽 榪欑鎯呭喌鏄湪瀵煎嚭綾葷殑瀹夋彃涓涓獀irtual base classes鐨勬寚閽堬紝鐢ㄦ潵鍦ㄨ繍琛屾椂瀛樺彇virtual base class 鐨勬垚鍛樸備緥濡傦細

聽1聽聽聽聽class聽X聽{聽public:聽int聽i;聽};聽
聽2聽聽聽聽class聽A聽:聽publicvirtual聽X聽聽聽{聽public:聽int聽j;聽};聽
聽3聽聽聽聽class聽B聽:聽publicvirtual聽X聽聽聽{聽public:聽double聽d;聽};聽
聽4聽聽聽聽class聽C聽:聽public聽A,聽public聽B聽{聽public:聽int聽k;聽};聽
聽5
聽6聽聽聽聽//聽cannot聽resolve聽location聽of聽pa->X::i聽at聽compile-time聽
聽7聽聽聽聽void聽foo(聽const聽A*聽pa聽)聽{聽pa->i聽=1024;聽}聽
聽8聽聽聽聽//聽鍦ㄧ紪璇戞湡鍙兘鐢熸垚濡備笅褰㈠紡:
聽9聽聽聽聽//聽void聽foo(const聽A*聽pa)聽{聽pa->_vbcX->i聽=聽1024;聽}聽//聽_vbcX:聽virtual聽base聽class聽X
10聽聽聽聽
11聽聽聽聽main()聽
12聽聽聽聽{聽
13聽聽聽聽聽聽聽聽foo(聽new聽A聽);聽
14聽聽聽聽聽聽聽聽foo(聽new聽C聽);聽
15聽聽聽聽
16聽聽聽聽聽聽聽聽//
17聽聽聽聽}
18
19

聽聽聽聽
聽聽聽 娉ㄦ剰:銆鍦ㄥ悎鎴愮殑default constructor涓紝鍙湁base class subobjects鍜宮ember class objects浼氳鍒濆鍖栵紝鍏跺畠鎵鏈夌殑nostatic data member閮戒笉浼氭墽琛屽垵濮嬪寲鐨勬搷浣滐紟瑕佹垜浠嚜宸辨墜鍔ㄧ殑鍘繪墽琛屽垵濮嬪寲鐨勬搷浣滐紟

聽聽聽 鍏跺疄鎶婃彙涓涓師鍒欙細瑕佷笉瑕佸悎鎴愪竴涓瀯閫犲嚱鏁幫紝渚濇嵁緙栬瘧鍣ㄧ殑闇瑕佷笌鍚︼紝鍚堟垚鍑烘潵鐨刢onstructor涔熷彧鏄畬鎴愰偅浜涚紪璇戝櫒鎵闇姹傘?br />聽聽聽
聽聽聽 涓や釜閿欒鐨勮鐐癸細
聽i. 浠諱綍鏃跺欙紝濡傛灉娌℃湁瀹氫箟default constructor錛屽氨浼氳鍚堟垚涓涓嚭鏉ャ?鑰屾槸鏍規(guī)嵁緙栬瘧鍣ㄧ殑闇瑕佸喅瀹氭槸鍚︾敓鎴愪竴涓猟eault constructor)
聽ii. 緙栬瘧鍣ㄧ敓鎴愬嚭鏉ョ殑default constructor浼氭槑紜殑鍒濆鍖栨瘡綾諱腑鐨勬瘡涓涓猟ata member.


2.2 Copy Constructor鐨勬瀯寤烘搷浣?br />聽聽聽 鏈変笁縐嶆儏鍐典笅浼氭湁涓涓狢opy Constructor鐨勬搷浣滐細
聽i.聽聽 瀵逛竴涓猳bject鍋氭槑紜殑鍒濆鍖栨搷浣溌犅?/ class X{ ....};聽聽 X x;聽聽聽 X xx = x;
聽ii.聽 褰撴煇涓猳bject浣滀負鍙傛暟浼犻掔粰鏌愪釜鍑芥暟聽聽// void foo(X x) { .... }
聽iii. 鍑芥暟浼犲洖涓涓猚lass object瀵硅薄聽聽// void foo(){ X xx; return xx;}

聽聽聽 1. Default Memberwise Initialization(緙虹渷鐨勬寜鎴愬憳鍒濆鍖?
聽聽聽 濡傛灉涓涓被娌℃湁explicit copy constructor鏃? class object鍦ㄦ墽琛宑opy constructor鏃訛紝鍐呴儴浠efault member initialization鐨勬墜娉曟潵瀹屾垚錛屽氨鏄妸姣忎竴涓唴寤烘垨鑰呮淳鐢熻屾潵鐨刣ata member鐨勫間粠鏌愪釜object 鎷瘋礉涓浠藉埌鍙︿竴涓猳bject韜笂錛屽member class object鏄互閫掑綊鐨勬柟寮忚皟鐢╩emberwise initialization鐨勩?br />聽聽聽
聽聽聽 榪欑鍒濆鍖栨槸閫氳繃鍦ㄥ繀瑕佹椂鐢熸垚涓涓猚opy constructor鎴栭氳繃 bitwise copy 鏉ュ畬鎴愮殑銆?濡傛灉瑕侀氳繃bitwise鏉ュ畬鎴愯繖榪欐牱鐨勬搷浣滐紝閭d箞蹇呴』琛ㄧ幇鍑篵itwise copy semantise.聽
聽聽聽
聽聽聽 C++ Standard涓篃鎶奵opy constructor鍒嗘垚trial 鍜宯otrivial涓ょ綾誨瀷錛屽彧鏈塶otrivial鐨勫疄浣撴墠浼氳鍚堟垚浜庣▼搴忎腑銆傚喅瀹氫竴涓猚opy constructor鏄惁涓簍rivial鍦ㄤ簬綾繪槸鍚﹁〃鐜板嚭鎵璋撶殑"Bitwise copy sematics".
聽聽聽
聽聽聽 2. Bitwise Copy Semantics
聽聽聽 鍦?bitwise copy sematics 涓嬶紝涓嶄細鏋勯犲嚭涓涓猟efault copy constructor. 渚嬪錛?br />聽

聽1聽聽聽class聽Word
聽2聽聽聽聽{
聽3聽聽聽聽public:聽
聽4聽聽聽聽聽聽聽聽Word(constchar*);
聽5聽聽聽聽聽聽聽聽~Word(){聽delete聽[]str;聽}
聽6聽聽聽聽聽聽聽聽//
聽7聽聽聽聽private:
聽8聽聽聽聽聽聽聽聽int聽cnt;
聽9聽聽聽聽聽聽聽聽char*str;
10聽聽聽聽}聽聽
11聽聽聽聽浠ヤ笂鐨勬槸涓涓〃鐜板嚭Bitwise聽copy聽sematics鐨勭被錛岃屼互涓嬫槸涓涓病鏈夎〃鐜板嚭bitwise聽copy聽sematics鐨勭被
12聽聽聽聽class聽Word
13聽聽聽聽{
14聽聽聽聽public:聽
15聽聽聽聽聽聽聽聽Word(constchar*);
16聽聽聽聽聽聽聽聽~Word(){聽delete聽[]str;聽}
17聽聽聽聽聽聽聽聽//
18聽聽聽聽private:
19聽聽聽聽聽聽聽聽int聽cnt;
20聽聽聽聽聽聽聽聽String聽str;
21聽聽聽聽}
22聽聽聽聽
23聽聽聽聽class聽String聽
24聽聽聽聽{
25聽聽聽聽public:聽
26聽聽聽聽聽聽聽聽String(constchar*);
27聽聽聽聽聽聽聽聽String(conststring&);聽//聽String鐨勬樉紺篶opy聽constructor
28聽聽聽聽聽聽聽聽~String();
29聽聽聽聽聽聽聽聽//.
30聽聽聽聽}
31聽聽聽聽榪欑鎯呭喌涓嬩細鍚堟垚涓涓猚opy聽constructor浠ヨ皟鐢╟lass聽String聽object鐨刢opy聽constructor.
32聽聽聽聽inline聽Word::Word(const聽Word&聽wd)
33聽聽聽聽{
34聽聽聽聽聽聽聽聽str.String::String(wd.str);
35聽聽聽聽聽聽聽聽cnt聽=聽wd.cnt;
36聽聽聽聽}聽聽聽聽
37

聽聽聽聽聽聽聽
聽聽聽 3. 涓嶈〃鐜板嚭Bitwise Copy Sematics鐨勭壒鎬х殑鎯呭喌
聽聽聽 浠ヤ笅鐨勫嚑縐嶆儏鍐礳lass涓嶈〃鐜板嚭 Bitwise Sematics:
聽聽聽聽聽聽聽 a. 褰揷lass 鍐呭惈鏈変竴涓猰ember object, 鑰屽悗鑰呯殑class 澹版槑鏈変竴涓猚opy constructor鏃?鍚堟垚鎴栧0鏄庣殑閮藉彲浠?錛屽氨涓嶈〃鐜板嚭Bitwise Sematics
聽聽聽聽聽聽聽 b. 褰揷lass 緇ф壙鑷竴涓猙ase class, 鑰屽悗鑰呭瓨鍦ㄦ湁涓涓猚opy constructor(鍚堟垚鎴栧0鏄庣殑閮藉彲浠?, 灝變笉琛ㄧ幇鍑築itwise Sematics.
聽聽聽聽聽聽聽 c. 褰撶被澹版槑浜嗕竴涓垨澶氫釜virtual function鏃?br />聽聽聽聽聽聽聽 d. 褰揷lass媧劇敓鑷竴涓戶鎵垮垱涓查摼錛屽叾涓湁涓涓垨澶氫釜virtual base classes鏃? 綾誨氨涓嶈〃鐜板嚭Bitwise Sematics
聽聽聽 榪欏洓縐嶆儏鍐靛拰default constructor鐢熸垚鐨勬槸鍚︿竴涓猼rivial鏄竴鏍風(fēng)殑, 涔熸槸婊¤凍緙栬瘧鍣ㄧ殑闇姹傘?br />聽聽聽聽聽聽
聽聽聽 4. 閲嶆柊璁懼畾Virtual Table 鐨勬寚閽?br />聽聽聽 瀵逛簬浠ヤ笂錛氬綋綾誨0鏄庝簡涓涓垨澶氫釜virtual function鐨勬儏鍐碉紝紼嬪簭浼氫負綾誨璞″仛濡備笅涓や釜鎵╁紶鎿嶄綔錛?br />聽聽聽聽聽聽聽 (1) 澧炲姞涓涓獀tbl鐨勬寚閽堬紝鍐呭惈virtual function鐨勬寚閽堝湴鍧銆?br />聽聽聽聽聽聽聽 (2) 鍦ㄧ被瀵硅薄鍐呭畨鎻掍竴涓獀ptr鎸囬拡錛屾寚鍚憊irtual function table.
聽聽聽 瀵逛簬鎶婁竴涓猙ase class object 浠ュ叾derived class object鐨勫煎垵濮嬪寲鎿嶄綔鐨勬椂鍊欙紝浼氬彂鐢熷垏鍓?sliced)鎿嶄綔銆傝繖鏃朵篃瑕佷繚璇乿tbl鐨勬紜拰vtpr鐨勬紜с?br />聽聽聽
聽聽聽 5. 澶勭悊Virtual Base Class Subobject
聽聽聽 濡傛灉涓涓猚lass object鏄互鍙﹀涓涓猳bject浣滀負鍒濆鍊肩殑璇濓紝鑰屽悗鑰呭張鏈変竴涓獀irtual base class suboject鐨勮瘽錛岄偅涔堜篃浼氫嬌bitwise copy sematics澶辨晥銆備緥濡傦細

聽1聽聽聽聽class聽Raccoon聽:聽publicvirtual聽ZooAnimal{
聽2聽聽聽聽public:
聽3聽聽Raccoon(){聽聽;聽}
聽4聽聽Raccoon(int聽val)聽{聽;聽}
聽5聽聽private:
聽6聽聽//
聽7聽聽聽聽};
聽8
聽9聽聽聽聽class聽RedPanda聽:聽public聽Raccoon{
10聽聽聽聽public:
11聽聽RedPanda()聽{聽.;聽}
12聽聽RedPanda(int聽val)聽{聽.;聽}
13聽聽private:
14聽聽//
15聽聽聽聽};
16聽聽聽聽鎵ц濡備笅鎿嶄綔鏃朵細瑕佹眰鍚堟垚涓涓猚opy聽constructor:
17聽聽聽聽RedPanda聽little_red;
18聽聽聽聽Raccoon聽little_critter聽=聽little_re;聽聽//聽榪欓噷緙栬瘧鍣ㄥ繀欏繪槑紜殑鎶妉ittle_critter鐨剉irtual聽base聽class聽pointer/offset鍒濆鍖栥?br />19
20聽聽聽聽//聽濡傛灉鍙槸榪欐牱鐨勬搷浣滅敤bitwise聽copy聽灝卞彲浠ヤ簡
21聽聽聽聽Raccoon聽rocky;
22聽聽聽聽Raccoon聽little_critter聽=聽rocky;聽聽聽//聽鐢ㄧ畝鍗曠殑bitwise聽copy聽灝卞彲浠ユ悶瀹氫簡
23
24


2.3 紼嬪簭杞寲璇箟瀛?Program Transformation Semantics)
聽鎸囩殑鏄▼搴忓湪鎵ц鐨勬槸鍊欒鍋氱殑綾誨瀷鍜屾搷浣滅殑杞崲銆?涓嬮潰渚嬪瓙鍙嶆槧浜嗕笁縐嶈漿鎹㈡搷浣滐細

聽1聽#include聽"X.h"
聽2
聽3聽X聽foo(聽X聽x0)
聽4聽{
聽5聽聽X聽xx;
聽6
聽7聽聽//.,聽瀵箈x鍜寈0榪涜鎿嶄綔
聽8
聽9聽聽return聽XX;
10聽}
11

聽1. 鏄庣‘鐨勫垵濮嬪寲鎿嶄綔(Explicit Initialization)
聽渚嬪錛?br />

1 X聽x0
2 void 聽foo_bar()
3 {
4 聽聽X聽x1(x0);
5 聽聽X聽x2聽 = 聽x0;
6 聽聽X聽x3聽 = 聽X(x0);
7 聽}

8


聽瀵圭▼搴忓仛涓や釜闃舵鐨勮漿鍖栵細
聽i. 閲嶅啓姣忎竴涓畾涔夛紝鍏朵腑鐨勫垵濮嬪寲鎿嶄綔閮戒細琚墺闄?br />聽ii. 綾葷殑Copy constructor鎿嶄綔浼氳瀹夋彃榪涘幓
聽杞寲鍚庡彲鑳芥垚涓鴻繖鏍風(fēng)殑(浼爜)錛?br />聽榪欎篃灝辨槸璇村墠闈笁縐嶇殑鍒濆鍖栨搷浣滈兘浼氳漿鎹㈡垚Explicit Initialization.

聽1void聽foo_bar()
聽2聽{
聽3聽聽X聽x1;聽
聽4聽聽X聽x2;
聽5聽聽X聽x3;
聽6
聽7聽聽x1.X::X(x0);
聽8聽聽x2.X::X(x0);
聽9聽聽x3.X::X(x0);
10聽}
11
12

聽2. 鍙傛暟鐨勫垵濮嬪寲(Argument Initialization)
聽渚嬪涓嬮潰錛?br />

聽1void聽foo(X聽x0){聽;聽}
聽2void聽call()
聽3聽{
聽4聽聽X聽xx;
聽5
聽6聽聽//.聽xxx聽鍒濆鍖栧強鍏舵搷浣?/span>
聽7
聽8聽聽foo(xx);
聽9聽}
10聽杞崲鍚庣殑鎿嶄綔涓猴細
11void聽call()
12聽{
13聽聽X聽xx;
14
15聽聽X聽__temp0;
16聽聽__temp0.X::X(xx);
17聽聽foo(__temp0);聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//聽foo聽鍑芥暟搴斿彉鎴愶細void聽foo(X&聽x0);
18聽聽__temp0.X::~X();聽聽
19聽}
20
21

聽榪欏氨鏄負浠涔堝綋浼犲煎埌瀛欐暟鐨勬椂鍊欙紝涓嶄細鎶婂嚱鏁板唴瀵逛紶鍏ュ肩殑鎿嶄綔緇撴灉涓嶄細琚慨鏀癸紝鍥犱負瀹冨湪鍑芥暟鍐呮湰鏉ヤ慨鏀圭殑灝變笉鏄閮ㄤ紶浜虹殑閭d釜鍙橀噺銆?/p>


聽3. 榪斿洖鍊肩殑鍒濆鍖?Return Value Initialization)
聽渚嬪錛?
聽X bar()
聽{
聽聽X xx;
聽聽// ....
聽聽return xx;
聽}聽

聽杞寲涓哄涓嬩吉鐮?
聽void bar(X& __result)
聽{
聽聽X xx;
聽聽xx.X::X();聽聽 // 緙栬瘧鍣ㄧ敓鎴愮殑涓涓己鐪佺殑鏋勯犲嚱鏁拌皟鐢?/p>

聽聽// 澶勭悊 ....

聽聽__result.X::X(xx);聽聽聽 // 緙栬瘧鍣ㄧ敓鎴愮殑copy constructor璋冪敤鎿嶄綔
聽聽return;
聽}

聽濡備笅鐨勬搷浣滆漿鍖栦負錛?br />聽void foo()
聽{
聽聽X xx = bar();
聽}

聽琚漿鍖栦負錛?br />聽void foo()
聽{
聽聽X xx;
聽聽bar(xx);聽聽 // 娉ㄦ剰榪欓噷涓嶇敤鎵ц default constructor
聽}

聽閽堝榪欑杞崲錛屽彲浠ヤ粠浣跨敤灞傞潰涓婅繘琛屼紭鍖栧拰鍦ㄧ紪璇戝櫒灞傞潰涓婂仛浼樺寲鎿嶄綔銆傚湪緙栬瘧鍣ㄥ眰闈笂鐨勬搷浣滃氨鏄噰鐢∟RV(Named Return Value)鎶鏈?br />聽濡傦細
聽x bar()
聽{
聽聽X xx;
聽聽// ....
聽聽return xx;
聽}
聽浼樺寲涓猴細
聽void bar(X& __result)
聽{
聽聽__result.X::X();

聽聽//....聽 鐩存帴鐨勫鐞?__result

聽聽//
聽聽return ;
聽}聽

2.4 鎴愬憳鍒濆鍖栭槦浼?Member Initialization List)
聽榪欓噷鏈変袱鐐硅娉ㄦ剰錛?br />聽1. 浠ヤ笅鐨勫洓縐嶆儏鍐典笅蹇呴』浣跨敤 member intialization list
聽聽I.聽聽 褰撳垵濮嬪寲涓涓猺eference member鏃?br />聽聽II.聽 褰撳垵濮嬪寲涓涓猚onst member鏃?br />聽聽III. 褰撳垵濮嬪寲涓涓猙ase class 鐨刢onstructor錛岃屽畠鎷ユ湁涓緇勫弬鏁版椂
聽聽IV.聽 褰撹皟鐢ㄤ竴涓猰ember class鐨刢onstructor, 鑰屽畠鎷ユ湁涓緇勫弬鏁版椂

聽聽鍏跺畠鎯呭喌涓嬪彲浠ョ敤鍦ㄦ瀯閫犲嚱鏁板唴鍒濆鍖栦篃鍙互

聽2. 鍏充簬鍒濆鍖栫殑嬈″簭闂錛?br />聽聽緙栬瘧鍣ㄧ殑鍒濆鍖栫殑欏哄簭鏄寜member澹版槑嬈″簭鏉ヤ緷嬈$殑鍒濆鍖栫殑銆傚畠浼氬畨鎻掍竴浜涗唬鐮佸埌鏋勯犲嚱鏁板唴錛屽茍鏀懼湪浠諱綍鍏跺畠鐢ㄦ埛鍒濆鍖栫殑浠g爜涔嬪墠.



鐚╃尒 2006-10-30 14:33 鍙戣〃璇勮
]]>
Inside The C++ Object Model 瀛︿範(fàn)絎旇 -- 鍏充簬瀵硅薄http://www.shnenglu.com/jzp/articles/5826.html鐚╃尒鐚╃尒Tue, 18 Apr 2006 09:31:00 GMThttp://www.shnenglu.com/jzp/articles/5826.htmlhttp://www.shnenglu.com/jzp/comments/5826.htmlhttp://www.shnenglu.com/jzp/articles/5826.html#Feedback1http://www.shnenglu.com/jzp/comments/commentRss/5826.htmlhttp://www.shnenglu.com/jzp/services/trackbacks/5826.html 涓. C/C++ 璇█涓殑鏂規(guī)硶鍜屾暟鎹?/strong>

聽聽聽 1. C璇█鐨勬暟鎹拰鏂規(guī)硶聽聽聽聽 璇█涓暟鎹拰澶勭悊(鍑芥暟)鏄垎寮鐨勶紝璇█鏈韓涓嶆敮鎸佹暟鎹拰鍑芥暟鐨勫叧鑱旀с傝繖縐嶆柟娉曟垜浠О涔嬩負錛氱▼搴忔х殑錛涘畠鏄敱"鍒嗗竷鍦ㄥ悇涓互鍔熻兘涓哄鍚戠殑鍑芥暟涓?d鐨勭畻娉曟墍椹卞姩錛屽畠浠鐞嗙殑鏄叡鍚岀殑鏁版嵁銆?/p>

聽聽聽聽 2. C++璇█鏁版嵁鍜屾柟娉?/strong>
聽聽聽聽 C++涓槸閫氳繃ADT(Abstract Data Type, ADT)鏉ュ疄鐜扮殑銆?C++鍙互鍦ㄤ笉鍚屽眰嬈′笂榪涜鎶借薄錛岄犳垚鐨勫鏉傚害鍙兘涔熶笉涓鏍楓?br />聽聽聽聽 涔︿腑浠庣畝鍗曞埌澶嶆潅鍥涗釜灞傛鐨勬娊璞? 綆鍗曠被銆佺戶鎵褲佷竴涓弬鏁扮殑Template銆佷袱涓弬鏁扮殑妯℃澘銆?br />


浜?C++鍔犱笂灝佽鍚庣殑甯冨眬鎴愭湰(Layout Costs for Adding Encapsulation)

聽聽聽 1. C++涓殑瀵硅薄鐨勫竷灞
聽聽聽 a. data member:聽 鐩存帴鐨勫寘娑靛湪姣忎竴涓猚lass object(娉ㄦ剰: 綾誨璞★紝涓嶆槸綾?涔嬩腑錛岃繖鍜孋 struct鐨勬儏鍐墊槸涓鏍風(fēng)殑
聽聽聽 b. member function: 瀹冧笉鍑虹幇鍦╟lass object 涔嬩腑.
聽聽聽聽聽聽 non-inline member: 瀹冧細浜х敓涓涓鏁扮殑瀹炰綋. 濡傛灉鏄潪static鐨刦unciton, 姣忎釜function浼氬姞涓婁竴涓猼his鎸囬拡浣滀負function鐨勭涓涓弬鏁?
聽聽聽聽聽聽 inline member: 浼氬湪姣忎竴涓嬌鐢ㄨ呰韓涓婁駭鐢熶竴涓嚱鏁扮殑瀹炰綋銆傝繖涓鑸槸涓轟簡鎻愰珮鏁堢巼銆?br />聽聽聽
聽聽聽 2. C++甯冨眬鍜屽瓨鍙栦笂鐨勯澶栧紑閿
聽聽聽 a. virtual function 鏈哄埗: 鐢ㄤ互鏀寔涓涓湁鏁堢殑"鎵ц鏈熺粦瀹?runtime binding)"聽
聽聽聽 b. virtual base class


涓? C++瀵硅薄妯″瀷(The C++ Object Model)

聽聽聽 1. 綆鍗曞璞℃ā鍨?A Simple Object Model)
聽聽聽 榪欑妯″瀷涓紝姣忎釜object鏄竴緋誨垪鐨剆lots, 姣忎釜slot鎸囧悜涓涓猰ember. 姣忎釜member鎸夊叾鐢蟲槑鐨勬搴忓悇鍗犵敤涓涓猻lot. 榪欓噷鐨刴ember鍖呮嫭data member 鍜?function member. 姣忎釜member鏄氳繃slot鐨勭儲寮曟潵璁塊棶鐨勩?br />聽聽聽 鍏蜂綋鐨勬ā鍨嬪弬鐪?聽
聽聽聽 1.1 Simple Object Model.JPG

聽聽聽 2. 琛ㄦ牸椹卞姩妯″瀷(A Table-driven Object Model)
聽聽聽 榪欑妯″瀷涓妸class object鐨刴embers鍒嗙粍鏀懼湪涓涓猟ata member table 鍜屼竴涓猣unction member table涓紝class object鍐呭惈涓や釜鎸囧悜table鐨勬寚閽? member function table 鏄竴緋誨垪鐨剆lots, 姣忎釜slot鎸囧悜涓涓猣unction member. data member table 鍒欐槸鐩存帴鐨勫寘娑墊湁data鏈韓銆?br />聽聽聽 鍏蜂綋鐨勬ā鍨嬪弬鐪?聽
聽聽聽 1.2 Member Table Object Model.JPG

聽聽聽 3. C++瀵硅薄妯″瀷(The C++ Object Model)
聽聽聽 C++鐨勫璞℃ā鍨嬪涓?
聽聽聽 a. nostatic data members 琚洿鎺ョ殑閰嶇疆鍦ㄦ瘡涓涓猚lass object涔嬪唴銆?br />聽聽聽 b. static data member 銆乻tatic 鍜?nonstatic function members鍏ㄩ儴琚斁鍦ㄦ墍鏈夌殑class object 涔嬪銆?br />聽聽聽 c. virtual functions 鍒欐槸浠ヤ笅鍒楁楠ゆ敮鎸佺殑錛?
聽聽聽聽聽聽聽 i. 姣忎竴涓猚lass 浜х敓涓鍫嗘寚鍚憊irtual functions鐨勬寚閽堬紝鏀懼湪琛ㄦ牸涔嬩腑錛屾垜浠О榪欎釜琛ㄦ牸涓猴細virtual table(vtbl).
聽ii. 姣忎釜寰梒lass object 琚坊鍔犱簡涓涓寚閽堬紝鎸囧悜鐩稿叧鐨剉irtual table錛屾垜浠妸class object鐨勮繖涓寚閽堢О涔嬩負vptr(virtual pointer)錛涜繖涓獀ptr鐨勮瀹氬拰閲嶇疆鏄敱綾葷殑constructor銆乨estructor 鍜?copy assignment 榪愮畻絎﹁嚜鍔ㄥ畬鎴愮殑錛涙瘡涓被鐨則ype_info object涔熸槸緇忕敱virtual table鎸囧嚭鐨勶紝閫氬父鏄斁鍦ㄨ〃鏍肩殑絎竴涓猻lot澶勩?br />聽聽聽 鍏蜂綋鐨勬ā鍨嬪弬鐪?聽
聽聽聽 1.3 C++ Object Model.JPG

聽聽聽 d. 鍔犱笂緇ф壙(Adding Inheritance)
聽聽聽 鍦?A Simple Object Model 涓紝姣忎竴涓熀綾誨彲浠ヨderived class object鐨勪竴涓猻lot鎸囧嚭錛岃slot鍐呭惈base class subobject鐨勫湴鍧銆?br />聽聽聽 鍦ㄨ櫄鎷熺戶鎵跨殑鎯呭喌涓嬶紝base class 涓嶇鍦ㄧ戶鎵塊摼涓媧劇敓澶氬皯嬈★紝姘歌繙鍙湁涓涓疄浣?subobject). 涔︿腑浠ostream緇ф壙浣撶郴璇存槑銆?/p>

聽聽聽 C++涓殑base class subobject鐨刣ata members鐩存帴鏀劇疆浜巇erived class object涓傞偅涔堝畠鐨刦unction members鏄庝箞澶勭悊鐨勫憿錛?鎴戞病鏈夌悊瑙h繖鍧?
聽聽聽 瀵逛簬virtual base class, C++ 2.0 鏄湪class object涓坊鍔犱竴涓叧鑱?virtual base class object鐨勬寚閽堛?/p>

聽聽聽 e. 瀵硅薄妯″瀷瀵圭▼搴忕殑褰卞搷
聽聽聽 鎴戣寰椾功涓婄殑榪欐浠g爜闈炲父濂界殑浣撶幇浜嗕笉鍚屾ā鍨嬪紼嬪簭鐨勫獎鍝?br />聽聽聽 棰勫畾涔?class X 濡備笅錛?br />聽聽聽

class 聽X
{
public :
聽聽聽聽
virtual ~ X() {聽聽}
聽聽聽聽X
& 聽X( const 聽X & 聽rhs) {聽聽}

聽聽聽聽
virtual void 聽foo() {聽聽}
}


// 聽瀹氫箟涓涓柟娉?/span>
X聽foobar()
{
聽聽聽聽X聽xx;
聽聽聽聽X聽
* px聽 = new 聽X();
聽聽聽聽
//
聽聽聽聽xx.foo();
聽聽聽聽px
-> foo();

聽聽聽聽
//
聽聽聽聽delete聽px;
聽聽聽聽
return 聽xx;
}


// 聽榪欎釜鍑芥暟鍙兘鐨勮漿鍖栦負錛?/span>
void 聽foobar(X & 聽_result)
{
聽聽聽聽_result.X::X();

聽聽聽聽
//
聽聽聽聽px聽 = new (聽 sizeof (X)聽);
聽聽聽聽
if (px聽 != 0 )
聽聽聽聽聽聽聽聽px
-> X::X();

聽聽聽聽
// 聽榪欓噷鏄笉浣跨敤virtual聽鏈哄埗鐨刦oo璋冪敤
聽聽聽聽
// 聽娉ㄦ剰榪欓噷鐨勮皟鐢ㄦ柟娉曪紝涓嶆槸鐢╲tbl,聽
聽聽聽聽
// 聽榪欐牱濡傛灉鏈変粠class聽X聽緇ф壙鐨勭被鍒濆鍖栨垨璧嬪肩粰X鍩虹被鏃訛紝
聽聽聽聽
// 聽璋冪敤foo鐨勬柟娉曟槸X鐨勬柟娉?聽鏄紪璇戞椂紜畾鐨?/span>
聽聽聽聽foo( & _result);

聽聽聽聽
// 聽鏄敤virtual聽鏈哄埗鐨刦oo璋冪敤,聽瀹冩槸榪愯鏃剁‘瀹氱殑
聽( * px -> vtbl[ 2 ])(px);

聽聽聽聽聽
// 聽delete聽px聽
聽聽聽聽聽 if (px聽 != 0 )
{
聽聽聽聽聽聽聽聽聽(
* px -> vtbl[ 1 ])(px);聽聽 // 聽destructor
聽聽聽聽聽聽聽聽聽_delete(px);
聽聽聽聽聽}


聽聽聽聽聽
//
聽聽聽聽聽 return 聽;



鍥? 鍏抽敭璇嶆墍甯︽潵鐨勫樊寮?A Keyword Distinction)

聽聽聽 璁ㄨ浜哻lass 鍜?struct 鐨勫樊寮傚拰閫夋嫨

浜? 瀵硅薄鐨勫樊寮? A Object Distinction)

聽聽聽 1. C++紼嬪簭璁捐妯″瀷鏀寔涓夌programming paradigms.
聽聽聽 a. 紼嬪簭妯″瀷(procedural model) 灝辨槸鍍?C 涓鏍瘋繘琛岀紪紼?br />聽聽聽 b. 鎶借薄鏁版嵁綾誨瀷妯″瀷(abstract data type model, ADT) 鐢ㄥ璞¤繘琛岀紪紼?br />聽聽聽 c. 闈㈠悜瀵硅薄妯″瀷(object-oriented model)
聽聽聽 妯″瀷涓湁涓浜涘郊姝ょ浉鍏崇殑綾誨瀷錛岄氳繃涓涓娊璞$殑base class琚皝瑁呰搗鏉?涔熷氨鏄細鎺ュ彛)銆傜被鍨嬩箣闂寸殑鎿嶄綔鏄氳繃鎺ュ彛榪涜鐨勩?/p>

聽聽聽 綰補鐨勪互涓縐峱aradigm鍐欑▼搴忔槸濂界殑.(鍝堝搱錛屽ソ鍍忚繖涓嶅お鍙兘錛屾垜榪樺仛涓嶅埌)

聽聽浜?聽闈㈠悜瀵硅薄妯″瀷(object-oriented model)
聽聽聽 a . C++涓鎬佹敮鎸佹х殑鏀寔鏄氳繃: pointer 鍜?reference鏉ュ疄鐜扮殑.
聽聽聽 澶氭侀氳繃涓嬮潰涓夌鏂規(guī)硶鏉ユ敮鎸?
聽聽聽聽聽聽聽 i. 緇忕敱涓緇勯殣鍚殑杞寲鎿嶄綔:聽聽聽shape *ps = new circle();
聽聽聽聽聽聽聽 ii. 緇忕敱virtual function 鏈哄埗聽聽ps->rotate();
聽聽聽聽聽聽聽 iii. 緇忕敱 dynamic_cast鍜宼ypeid鏉ユ敮鎸?
聽聽聽聽聽聽聽聽聽聽聽聽 if(circle *pc = dynamic_cast<circle*>(ps)) ...
聽聽聽澶氭佸唴瀛橀渶姹?br />聽聽聽聽聽聽 i. 鍏?nonstatic data members 鐨勬誨拰澶у皬
聽聽聽聽聽聽 ii. 浠諱綍瀛楄妭瀵歸綈鐨勯澶栧~鍏?padding)
聽聽聽聽聽聽 iii. 鏀寔virtual 鑰屼駭鐢熺殑棰濆璐熸媴
聽聽聽聽
聽聽聽 b. 鎸囬拡鐨勭被鍨?br />聽聽聽 "鎸囧悜涓嶅悓綾誨瀷鐨勫悇鎸囬拡"鐨勫樊寮傦紝涓嶅湪浜庡叾鎸囬拡鐨勮〃紺烘硶涓嶅悓錛屼篃涓嶅湪浜庡叾鍐呭鐨勪笉鍚岋紝 鑰屾槸鍏跺鍧鍑烘潵鐨刼bject鐨勭被鍨嬩笉鍚屻備篃灝辨槸璇?鎸囬拡綾誨瀷"浼氭暀瀵肩紪璇戝櫒濡備綍瑙i噴鏌愪釜鐗瑰畾鍦板潃涓殑鍐呭瓨鍐呭鍙婂叾澶у皬.

聽聽聽聽c. 聽鍔犱笂澶氭佷箣鍚?Adding Polymorphism)
聽聽聽 浠ュ涓嬩負渚?聽聽聽聽

聽1 class 聽Bear聽:聽 public 聽ZooAnimal
聽2 {聽
聽3 public :聽
聽4 聽聽聽聽Bear();聽
聽5 聽聽聽聽 ~ Bear();聽
聽6
聽7 聽聽聽聽 //
聽8 聽聽聽聽 void 聽rotate();聽
聽9 聽聽聽聽 virtual void 聽dance();聽
10
11 聽聽聽聽 //
12 protected :聽
13 聽聽聽聽 enum 聽Dances聽 {聽聽} ;聽
14
15 聽聽聽聽Dances聽dances_known;聽
16 聽聽聽聽 int 聽cell_block;聽
17 }
;聽
18
19 ///
20 Bear聽b(聽 " Yogi " 聽);聽
21 Bear聽 * pb聽 = & b;聽
22 Bear聽 & rb聽 = * pb;聽
23

聽聽聽 鍏蜂綋鐨勫唴瀛樺竷灞濡偮?br />聽聽聽聽
聽聽聽 1.5 Layout of Object and Pointer of Derived Class.JPG

聽聽聽 //
聽聽聽 鐜版湁聽聽聽

1Bear聽b;
2ZooAnimal聽*pz聽=&b;
3Bear聽*pb聽=&b;
4

浠ヤ笂姣忎釜閮芥寚鍚態(tài)ear object鐨勭涓涓猙yte錛?font color="#ff0000" size="2">鍏墮棿鐨勫樊鍒槸錛宲b鎵娑電洊鐨勫湴鍧鍖呭惈鏁翠釜鐨凚ear object, 鑰宲z鎵娑電洊鐨勫湴鍧鍙寘鍚獴ear object涓殑 ZooAnimal subobject閮ㄥ垎銆備綘鍙兘鐢╬z鏉ュ鐞咮ear涓殑virtual functions, 鑰屼笉鑳界洿鎺ョ殑澶勭悊Bear涓殑鍏朵粬浠諱綍members.
聽聽聽 娉ㄦ剰pz鐨勭被鍨嬪皢鍦ㄧ紪璇戞椂紜畾浠ヤ笅涓ょ偣:
聽聽聽聽 i. pz鍥哄畾鐨勫彲鐢ㄦ帴鍙?br />聽聽聽 聽ii. pz鐨勬帴鍙g殑access level錛涘洜涓哄瓙綾葷殑access level鍙兘鏄笉鍚屼簬鍩虹被鐨勶紝緙栬瘧鏃朵細媯嫻嬫槸鍚﹀彲浠ヨ漿鎹€?/p>

聽聽聽 e. 瀵硅薄璧嬪奸棶棰?br />聽

聽Bear聽b;聽
聽ZooAnimal聽za聽
= 聽b;聽

// 聽ZooAnimal::rotate()聽invoked聽
聽za.rotate();聽


聽聽聽聽榪欓噷鏈変袱涓棶棰?br />聽聽聽聽i. za涓轟粈涔堣皟鐢ㄧ殑鏄痁oomAnimal::rotate鐨勫疄浣撹屼笉鏄?Bear鐨勫疄浣?
聽聽 絳旓細za騫朵笉鏄竴涓狟ear, 瀹冨彧鏄竴涓猌oomAnimal, 澶氭佺殑榪欑鐗規(guī)т笉鑳界敤鍦ㄧ洿鎺ュ瓨鍙栫殑objects涓娿傛墍浠ヂ?za.rotate()璋冪敤鍙兘鏄?ZooAnimal::rotate()

聽聽聽聽ii. 濡傛灉鍒濆鍖栧嚱鏁板皢涓涓猳bject鐨勫唴瀹瑰畬鍏ㄦ嫹璐濆埌鍙︿竴涓猳bject涓幓錛屼負浠涔坺a鐨剉pt涓嶆槸鎸囧悜B(tài)ear鐨剉irtual table鍛紵
聽聽聽聽絳旓細緙栬瘧鍣ㄥ湪鍒濆鍖栨垨璧嬪兼搷浣滄椂錛屽鏋滄煇涓猳bject鍚湁涓涓垨澶氫釜vptrs, 閭d箞榪欎簺vptrs鐨勫唴瀹逛笉浼氳鍘熷璞″垵濮嬪寲鎴栨敼鍙?
聽渚嬪涓婁緥鐨?ZooAnimal za = b, 榪欓噷鐨剉ptr騫朵笉浼氳 b 鐨剉ptr鎵鏇夸唬.
聽聽聽
聽聽聽


聽聽聽


聽聽聽



鐚╃尒 2006-04-18 17:31 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲激情成人网| 黑人一区二区| 亚洲午夜久久久久久久久电影网| 欧美成熟视频| 牛人盗摄一区二区三区视频| 亚洲高清视频的网址| 亚洲第一成人在线| 欧美69wwwcom| 制服丝袜亚洲播放| 亚洲永久免费视频| 国精品一区二区| 亚洲国产欧美一区二区三区丁香婷| 美日韩丰满少妇在线观看| 亚洲乱码国产乱码精品精天堂| 亚洲精品护士| 国产一区二区高清不卡| 欧美搞黄网站| 国产精品久久久久毛片大屁完整版| 欧美一区激情| 久久亚洲综合色| 一区二区三区三区在线| 午夜一级在线看亚洲| 91久久中文字幕| 亚洲午夜激情| 亚洲福利精品| 亚洲综合另类| 99xxxx成人网| 日韩一级成人av| 亚洲影视九九影院在线观看| 午夜精品久久久久久久白皮肤 | 久久riav二区三区| 亚洲人精品午夜| 亚洲在线一区二区| 亚洲精品日韩精品| 久久精品国产欧美亚洲人人爽| 亚洲美女在线一区| 欧美一级专区免费大片| 夜夜嗨av色一区二区不卡| 久久久91精品| 欧美影院久久久| 欧美特黄一区| 亚洲国产一区二区在线| 国内精品视频666| 一区二区三区你懂的| 91久久精品日日躁夜夜躁欧美| 亚洲自拍啪啪| 亚洲综合视频网| 欧美国产极速在线| 欧美韩国日本一区| 一区二区三区在线视频观看| 亚洲尤物在线视频观看| 亚洲视频在线观看视频| 欧美成人综合一区| 欧美成人在线影院| 国产一区视频在线观看免费| 亚洲色诱最新| 亚洲一区二区三区免费视频| 免费久久99精品国产| 老巨人导航500精品| 国产一区二区三区不卡在线观看 | 欧美成人官网二区| 一区二区在线观看视频在线观看| 欧美亚洲综合久久| 久久久999精品免费| 国产精品久久久久免费a∨| 日韩视频一区二区在线观看| 91久久夜色精品国产网站| 免费短视频成人日韩| 欧美激情女人20p| 亚洲国产日韩美| 欧美成人日韩| 亚洲美女淫视频| 亚洲视频网站在线观看| 欧美午夜电影网| 亚洲伊人一本大道中文字幕| 午夜在线播放视频欧美| 国产日韩欧美精品| 久久久噜久噜久久综合| 老牛影视一区二区三区| 91久久久久久| 欧美日韩免费| 亚洲综合国产| 欧美大片免费| 亚洲一区二区欧美| 国产亚洲一区精品| 麻豆久久婷婷| 亚洲免费av电影| 欧美一级欧美一级在线播放| 激情久久久久久| 欧美高清在线精品一区| 亚洲精品国产系列| 一本色道久久综合亚洲精品按摩 | 99国产一区| 国产精品啊v在线| 久久精品在线播放| 亚洲国产精品成人va在线观看| 一区二区三区三区在线| 国产九色精品成人porny| 久久九九久久九九| 亚洲精选大片| 久久久999精品视频| 亚洲精品欧洲| 国产日韩欧美黄色| 欧美日韩p片| 欧美制服丝袜第一页| 亚洲欧洲综合| 久久久水蜜桃av免费网站| 亚洲最新视频在线| 韩日欧美一区二区| 欧美揉bbbbb揉bbbbb| 久久久久久久尹人综合网亚洲| 亚洲精品国产拍免费91在线| 久久九九精品99国产精品| 日韩一级二级三级| 伊人久久大香线蕉综合热线| 欧美色图麻豆| 欧美美女bbbb| 久久综合九色九九| 欧美亚洲三区| 亚洲视频免费在线| 亚洲美女中文字幕| 亚洲成色精品| 欧美a级大片| 久久久视频精品| 欧美夜福利tv在线| 亚洲五月婷婷| 99re6这里只有精品| 一区视频在线| 国产一区二区成人久久免费影院| 欧美日韩中文字幕| 欧美人与性动交cc0o| 久久综合九色99| 欧美一区二区三区在线看| 亚洲调教视频在线观看| 亚洲精品系列| 亚洲欧洲一级| 亚洲啪啪91| 91久久久精品| 亚洲欧洲精品一区二区精品久久久| 久久午夜国产精品| 久久蜜桃资源一区二区老牛| 久久国产精品电影| 欧美中文字幕久久| 欧美一区二区三区四区高清| 小嫩嫩精品导航| 欧美一区综合| 久久精品在这里| 久久欧美肥婆一二区| 久久综合色8888| 蜜桃av一区二区在线观看| 久久一区中文字幕| 免费一级欧美在线大片| 欧美激情视频网站| 亚洲黄色成人| 国产精品99久久久久久久女警 | 美女黄网久久| 欧美激情一区二区三级高清视频| 欧美激情亚洲另类| 欧美日韩精品免费看| 欧美午夜精品伦理| 黄色欧美日韩| 亚洲高清在线观看一区| 亚洲国产成人精品女人久久久| 欧美激情一区在线| 99亚洲一区二区| 亚洲综合日韩在线| 久久久在线视频| 欧美大片在线看免费观看| 欧美久久久久久久| 国产九色精品成人porny| 精品不卡在线| 日韩视频免费| 欧美一区二区三区男人的天堂 | 久久激情婷婷| 亚洲第一色中文字幕| 亚洲免费播放| 欧美在线free| 欧美日韩国产va另类| 国产麻豆视频精品| 亚洲伦理网站| 久久精品国产免费看久久精品| 欧美成人tv| 亚洲视屏在线播放| 久久麻豆一区二区| 欧美日韩亚洲成人| 国内综合精品午夜久久资源| 99热这里只有精品8| 久久久精品动漫| 一本色道88久久加勒比精品 | 亚洲精品乱码视频| 欧美影院视频| 国产精品国产自产拍高清av| 一区二区三区在线免费视频| 亚洲欧美国产毛片在线| 免费不卡在线观看| 亚洲夜晚福利在线观看| 欧美成年人在线观看| 国产一区二区三区久久 | 亚洲国产成人在线| 久久久www成人免费毛片麻豆|