锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
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)
濡傚浜庝笅闈㈢殑綾?聽
聽
聽鍙兘鐨勮漿鎹㈡槸榪欐牱鐨?
聽//
聽瀵逛簬濡備笅鐨勭戶鎵垮眰嬈?
聽class Vertex聽聽 : virtual public Point { ... };
聽class Vertex3d : public Point3d, public Vertex { ... };
聽class PVertex聽 : public Vertex3d { ... };
聽綾籔oint3d鐨勬瀯閫犲彲鑳芥槸:
聽//
聽瀵逛簬Vertex3d鐨勬瀯閫犲彲鑳芥槸濡備笅:
聽
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:
聽
聽聽鍙兘涓涓墿灞曞涓?
聽
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. 鍚堟垚紺轟緥
聽
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箞瀹冧滑浼氫互鍏跺師鏉ョ殑鏋勯犻『搴忕浉鍙嶇殑欏哄簭琚皟鐢?
聽
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)
渚嬪:
聽
鐢ㄤ笅闈㈢殑鏂瑰紡榪涜澶勭悊:
聽聽 (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 );
聽聽聽聽 }
聽聽聽 杞崲鍙兘鐨勭粨鏋滄槸:
聽
紺轟緥浠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爜:
聽鍦ㄦ棭鏈熺殑緙栬瘧鍣ㄤ腑浼氬嚭閿? 涓嶈繃鍦?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爜:聽
聽聽聽聽聽 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
聽紺轟緥鏁版嵁:
聽聽聽 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)
聽聽聽 濡傦細
聽//
聽瑕佹敮鎸佸鎬侊紝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)
聽聽聽聽
聽聽聽 瀵逛簬鏈夊涓垚鍛樺璞$殑綾伙紝鍒欐寜鎴愬憳瀵硅薄鍦ㄧ被鐨勫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 鐨勬垚鍛樸備緥濡傦細
聽聽聽聽
聽聽聽 娉ㄦ剰:銆鍦ㄥ悎鎴愮殑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 />聽
聽聽聽聽聽聽聽
聽聽聽 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澶辨晥銆備緥濡傦細
2.3 紼嬪簭杞寲璇箟瀛?Program Transformation Semantics)
聽鎸囩殑鏄▼搴忓湪鎵ц鐨勬槸鍊欒鍋氱殑綾誨瀷鍜屾搷浣滅殑杞崲銆?涓嬮潰渚嬪瓙鍙嶆槧浜嗕笁縐嶈漿鎹㈡搷浣滐細
聽
聽
聽1. 鏄庣‘鐨勫垵濮嬪寲鎿嶄綔(Explicit Initialization)
聽渚嬪錛?br />
聽
聽瀵圭▼搴忓仛涓や釜闃舵鐨勮漿鍖栵細
聽i. 閲嶅啓姣忎竴涓畾涔夛紝鍏朵腑鐨勫垵濮嬪寲鎿嶄綔閮戒細琚墺闄?br />聽ii. 綾葷殑Copy constructor鎿嶄綔浼氳瀹夋彃榪涘幓
聽杞寲鍚庡彲鑳芥垚涓鴻繖鏍風(fēng)殑(浼爜)錛?br />聽榪欎篃灝辨槸璇村墠闈笁縐嶇殑鍒濆鍖栨搷浣滈兘浼氳漿鎹㈡垚Explicit Initialization.
聽2. 鍙傛暟鐨勫垵濮嬪寲(Argument Initialization)
聽渚嬪涓嬮潰錛?br />
聽榪欏氨鏄負浠涔堝綋浼犲煎埌瀛欐暟鐨勬椂鍊欙紝涓嶄細鎶婂嚱鏁板唴瀵逛紶鍏ュ肩殑鎿嶄綔緇撴灉涓嶄細琚慨鏀癸紝鍥犱負瀹冨湪鍑芥暟鍐呮湰鏉ヤ慨鏀圭殑灝變笉鏄閮ㄤ紶浜虹殑閭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爜涔嬪墠.
聽
聽聽聽聽 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 />聽聽聽 鍏蜂綋鐨勬ā鍨嬪弬鐪?聽
聽聽聽
聽聽聽 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 />聽聽聽 鍏蜂綋鐨勬ā鍨嬪弬鐪?聽
聽聽聽
聽聽聽 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 />聽聽聽 鍏蜂綋鐨勬ā鍨嬪弬鐪?聽
聽聽聽 聽
聽聽聽 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 />聽聽聽
鍥? 鍏抽敭璇嶆墍甯︽潵鐨勫樊寮?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)
聽聽聽 浠ュ涓嬩負渚?聽聽聽聽
聽聽聽 鍏蜂綋鐨勫唴瀛樺竷灞濡偮?br />聽聽聽聽
聽聽聽
聽聽聽 //
聽聽聽 鐜版湁聽聽聽
浠ヤ笂姣忎釜閮芥寚鍚態(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 />聽
聽聽聽聽榪欓噷鏈変袱涓棶棰?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鎵鏇夸唬.
聽聽聽
聽聽聽
聽聽聽
聽聽聽
聽
聽
聽