锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Effective C++ 緇ф壙涓庨潰鍚戝璞¤璁?br>涔︿綔鑰咃細Scott Meyers
鍘熺瑪璁頒綔鑰咃細Justin
========================
Item 32 錛?public 緇ф壙鎰忓懗鐫 is-a 鍏崇郴
--------------------------------------------------
tag: public inheritance 鍏湁緇ф壙 is-a
姣忎竴涓被鍨嬩負 Derived 鐨勫璞″悓鏃朵篃鏄竴涓被鍨嬩負 Base 鐨勫璞★紝鍙嶄箣涓嶆垚绔嬨?br> 瀹為檯鎯呭喌涓緢澶?#8220;鏄竴涓?#8221;鐨勪綋鐜板茍涓嶉偅涔堢函綺癸細澶у笀璇?#8220;楦?#8221;閮戒細椋烇紝浣嗘槸瀹為檯涓婃槸鏈変笉浼氶鐨?#8220;楦?#8221;鐨勩?
鍦ㄥ叕鏈夌戶鎵夸腑錛屾湁涓ょ鍔炴硶鏉ヨВ鍐寵繖縐?#8220;涓嶇函綺?#8221;錛?br> - 澶氶噸緇ф壙銆傚浜?#8220;楦?#8221;鐨勪緥瀛愶紝璁捐涓涓?#8220;楦?#8221;綾伙紝鐒跺悗浠庝腑媧劇敓鍑轟竴涓?#8220;涓嶄細椋炵殑楦?#8221;綾誨拰涓涓?#8220;浼氶鐨勯笩”綾伙紝鐒跺悗鍐嶅湪瀹冧滑涔嬩腑鍒嗗埆媧劇敓鍏朵粬鍏蜂綋鐨?#8220;楦?#8221;浠?br> - 鍏佽榪愯鏃跺嚭閿欍傝繕鏄?#8220;楦?#8221;鐨勪緥瀛愶紝瀵逛簬姣忎竴涓?#8220;楦?#8221;綾葷殑媧劇敓綾伙紝涓嶇瀹冩槸涓嶆槸鑳介錛岄兘浼氭湁涓?#8220;椋?#8221;鐨勫嚱鏁般備笉鍚岀殑鏄紝鑳介鐨?#8220;楦?#8221;灝辯洿鎺ラ浜嗭紝涓嶈兘椋炵殑“楦?#8221;鍒欎細鍦?#8220;椋?#8221;鍑芥暟閲岃錛?#8221;瀵逛笉璧鳳紝鎴戜笉鑳介錛屾壘鍒漢鍘誨惂……”(鎵璋撶殑榪愯鏃墮敊璇紝runtime error)
Item 33 錛?閬垮厤閬帺緇ф壙鑰屾潵鐨勫悕縐?br>--------------------------------------------------
tag: scopes
·derived classes 鍐呯殑鍚嶇О浼氶伄鎺?base classes 鍐呯殑鍚嶇О銆?br> ·鍙互浣跨敤 Using 澹版槑寮忔垨杞鍑芥暟 (forwarding functions錛夈?br>
鍏堝湪鏈湴鍩熶腑鏌ユ壘(local scope錛屾瘮濡傝鍑芥暟鍐呴儴)鏄惁鏈夎鍚嶅瓧鐨勫畾涔夛紝濡傛灉娌℃湁鎵懼埌
寰澶栦竴灞傚悕瀛楀煙(姣斿璇村嚱鏁版墍鍦ㄧ殑綾?涓煡鎵撅紝濡傛灉娌℃湁鎵懼埌
鍐嶅線澶栦竴灞傚悕瀛楀煙(姣斿璇村嚱鏁版墍鍦ㄧ被鐨勭埗綾?涓煡鎵撅紝濡傛灉娌℃湁鎵懼埌
緇х畫蹇樺涓灞傚悕瀛楀煙涓煡鎵?姣斿璇村嚱鏁版墍鍦ㄧ被鐨勭埗綾葷殑鐖剁被錛岀瓑絳?錛屼竴鐩存壘鍒板叏灞鍚嶅瓧鍩?global scope)榪樻槸娌℃壘鍒扮殑璇濓紝灝辨姤鍛婇敊璇?/p>
鍦?#8220;媧嬭懕”鐨勫唴閮ㄦ煇灞傚畾涔変簡鍜屽閮ㄦ煇灞備竴鏍峰悕瀛楃殑鍑芥暟錛氫嬌寰椾綅浜庡唴閮ㄧ殑鍑芥暟“灞忚斀”浜嗗閮ㄧ殑鍚屽悕鍑芥暟(鍝曚袱涓嚱鏁版嫢鏈変笉鍚岀殑鍙傛暟琛?銆?br> 絎竴錛屽湪鍏湁緇ф壙涓紝涓婅堪鐨勬儏鍐墊槸涓嶅厑璁稿瓨鍦ㄧ殑錛屽洜涓轟粠瀹氫箟涓婃潵璇達紝鍏湁緇ф壙涓殑瀛愮被搴旇鍏峰鐖剁被鎵鏈夌殑鐗瑰緛鍜屽姛鑳斤紝搴旇“鏄竴涓?#8221;鐖剁被銆?br> 絎簩錛屽鏋滃湪涓婅堪鎯呭喌涓渶瑕佽皟鐢?璁塊棶琚?#8220;灞忚斀”鐨勫嚱鏁?瀵硅薄錛屾湁涓や釜鏂規硶鍙互閲囩敤錛?
using銆傜敤using“澹版槑”榪囧畬鏁寸殑鍚嶅瓧鍚庯紝灝卞彲浠?#8220;鐪嬭”騫朵嬌鐢ㄨ繖涓嚱鏁?瀵硅薄浜嗐?
韙㈢毊鐞冨嚱鏁?forwarding functions)銆傜紪鍐欎竴涓嚱鏁幫紝鎶婄湡姝g殑媧昏涪緇欏埆浜?#8230;…
涓ょ鏂規硶紺轟緥瑙佷笅錛孌erived_0鏄湁“灞忚斀”闂鐨勭被錛孌erived_1鍜孌erived_2鍒嗗埆鏄噰鐢ㄤ簡絎竴縐嶅拰絎簩縐嶆柟娉曠殑綾匯?
class Base {
public :
virtual void func_1();
virtual void func_1( int param);
}
class Derived_0: public Base {
public :
virtual void func_1();
}
class Derived_1: public Base {
public :
using Base::func_1;
virtual void func_1();
}
class Derived_2: private Base {
public :
virtual void func_1();
virtual void func_1( int param)
{ Base::func_1(param);}
}
Item 34 錛?鍖哄垎鎺ュ彛緇ф壙鍜屽疄鐜扮戶鎵?br>--------------------------------------------------
tag: function interfaces, function implementations.
·澹版槑涓涓?pure virtual 鍑芥暟浠ヨ derived classes 鍙戶鎵垮嚱鏁版帴鍙?br> ·澹版槑 鏅歷irtual 鍑芥暟浠ヨ derived classes 緇ф壙璇ュ嚱鏁扮殑鎺ュ彛鍜岀己鐪佸疄鐜?br> ·澹版槑 non-virtual 鍑芥暟浠ヤ護 derived classes 緇ф壙鍑芥暟鐨勬帴鍙e強涓浠藉己鍒舵у疄鐜般?br>
class AClass {
public :
virtual void interface_1() = 0 ;
virtual void interface_2()
{ /* the default implementation..*/ }
void interface_3()
{ /* the compulsory implementation..*/ }
// ..
} ;
class AClassDerived {
public :
virtual void interface_1()
{ /* OK you have to implement this..*/ }
virtual void interface_2()
{ /* you can, but don't have to implement this..*/ }
// void interface_3()
// {you can't implement your own..}
} ;
class AClass {
public :
virtual void interface_1. 5 () = 0 ;
protected :
void default_interface_1. 5 ()
{ /* ..*/ }
} ;
class AClassDerived {
public :
virtual void interface_1. 5 ()
{
// you can either do this
default_interface_1. 5 ();
// or implement in your own way..
}
} ;
Item 35 錛?鑰冭檻 virtual 鍑芥暟鎰忓鐨勫叾浠栭夋嫨
--------------------------------------------------
tag: tr1::function tr1::bind (紲ヤ功涓婂疄渚?,
Template Method, Strategy ,
·浣跨敤 non-virtual interface(NVI)鎵嬫硶錛屽嵆 Template Method 璁捐妯″紡鐨勪竴縐嶇壒孌婂艦寮忋備互public non-virtual鎴愬憳鍑芥暟鍖呰9杈冧綆璁塊棶鎬х殑virtual鍑芥暟
·灝唙irtual鍑芥暟鏇挎崲涓?#8220;鍑芥暟鎸囬拡鎴愬憳鍙橀噺”錛屽嵆Strategy璁捐妯″紡鐨勪竴縐嶅垎瑙h〃鐜板艦寮?br> ·浠r1::function鎴愬憳鍙橀噺鏇挎崲virtual鍑芥暟錛屽洜鑰屽厑璁鎬嬌鐢ㄤ換浣曞彲璋冪敤鐗╋紙callable entiry錛夋惌閰嶄竴涓吋瀹逛簬闇姹傜殑絳懼悕寮忋備篃鏄疭trategy璁捐妯″紡鐨勬煇縐嶅艦寮忋?br> ·灝嗙戶鎵夸綋緋誨唴鐨?virtual鍑芥暟鏇挎崲涓哄彟涓涓戶鎵夸綋緋誨唴鐨?virtual鍑芥暟銆傚嵆Strategy璁捐妯″紡鐨勪紶緇熷疄鐜版墜娉曘?br> ----------------------------------
涓錛?Non-Virtual Interface 鎵嬫硶瀹炵幇 Template Method 妯″紡
錛氳瀹㈡埛閫氳繃 public non-virtual 鎴愬憳鍑芥暟闂存帴璋冪敤 private virtual 鍑芥暟,姝ゅ嵆NVI鎵嬫硶錛孴emplate Method 璁捐妯″紡鐨勪竴縐嶈〃鐜板艦寮忋?br> 榪欎釜 public non-virtual 鍑芥暟鎴愪負 virtual 鍑芥暟鐨勫瑕嗗櫒(wrapper)銆?br> 浼樼偣鍦ㄤ簬鍙湪 wrapper 涓仛涓浜涗簨鍓嶅伐浣滃拰浜嬪悗宸ヤ綔銆?
NVI 鎵嬫硶涓璿irtual function 涓嶄竴瀹氬緱鏄?private.
----------------------------------
浜岋細 Function Pointers 瀹炵幇 Strategy 妯″紡
錛氳繖縐嶆柟娉曠殑瀹炶川錛屽氨鏄妸鎺ュ彛鍑芥暟鐨勫疄鐜版嬁鍒頒簡綾諱箣澶栥傜被涔嬩腑鍙0鏄庢帴鍙g殑褰㈠紡錛屽彧瀹氫箟涓涓嚱鏁版寚閽堛傜湡姝e共媧葷殑鍑芥暟錛堝疄鐜幫級閮戒笉鏄被鐨勬垚鍛樸?br> 榪欐牱鍋氬甫鏉ヤ簡涓瀹氱殑鐏墊椿鎬э紝鍏蜂綋閲囩敤鍝瀹炵幇涓庣被鐨勭戶鎵垮叧緋繪槸鐙珛鏃犲叧鑱旂殑錛涘悓鏃訛紝闈炵被鎴愬憳鍑芥暟涔熸湁灞闄愭э細鏃犳硶璁塊棶綾葷殑闈炲叕鏈夋垚鍛樸傚鏋滄妸鍑芥暟瀹氫箟涓哄弸鍏冩垨鍒╃敤鍏湁鍑芥暟杈撳嚭縐佹湁鎴愬憳錛屽張浼氱牬鍧忓師璁捐鐨?灝佽銆傚涓嬩唬鐮佹墍紺猴細
class AClass
{
public :
typedef void *(Interface)( /* param.. */ );
explicit AClass( Interface pint = defaultInterface) : pInterface(pint)
{}
private :
Interface pInterface;
} ;
鍦ㄦ瀯閫燗Class瀵硅薄鐨勬椂鍊欏嵆鍙寚瀹欼nterface鐨勭湡韜紝铏界劧錛屽畠鏃犳硶鐩存帴璁塊棶AClass鐨勯潪鍏湁鎴愬憳銆?br> 鎸囬拡鍦–++閲岀畝鍗曚竴浜涳紝鏇存帹宕囩敤瀵硅薄(濡傛櫤鑳芥寚閽坱r1)鏉ョ鐞嗘帴鍙e嚱鏁般?鏄笉鏄兂鍒癷tem13錛?))
鍘熺悊鍜屽嚱鏁版寚閽堟槸涓鏍風殑錛屽彧涓嶈繃鍥犱負鐢ㄤ簡瀵硅薄鏉ョ鐞嗚祫婧愶紝浣垮緱搴旂敤鏇村姞鐏墊椿銆傚綋鐒訛紝瑕佷粯鍑烘洿澶氫竴鐐圭殑浠g爜浣撶Н鍜岃繍琛屾椂闂翠唬浠楓?/p>
class AClass
{
// all are the same with the funtion pointer version
// except for:
typedef std::tr1::function < void ( /* param.. */ ) > Interface;
} ;
---------------------------------
涓夛細 鍙ゅ吀絳栫暐妯″紡瀹炵幇錛屼篃鏄垜瑙夊緱姣旇緝婕備寒涓斿鏄撶悊瑙g殑瀹炵幇鏂瑰紡銆?/p>
鐢ㄤ袱涓被鎼炲畾錛?br> class AInterface
{
public:
virtual void DoInterface(/* param.. */);
};
AInterface defaultInterface;
class AClass
{
public:
explicit AClass(AInterface * pinter = &defaultInterface) : pInter(pinter)
{}
void TryInterface()
{
pInter->DoInterface();
}
private:
pInterface * pInter;
};
Item 36 錛氱粷涓嶉噸鏂板畾涔夌戶鎵胯屾潵鐨刵on-virtual鍑芥暟
--------------------------------------------------
tag:
浠諱綍鎯呭喌涓嬮兘涓嶈閲嶆柊瀹氫箟涓涓戶鎵胯屾潵鐨刵on-virtual鍑芥暟錛?/p>
Item 37 錛氱粷涓嶉噸鏂板畾涔夌戶鎵胯屾潵鐨?緙虹渷鍙傛暟鍊?br>--------------------------------------------------
tag: 闈欐佺被鍨嬶紙static type錛?nbsp; 鍔ㄦ佺粦瀹?nbsp; 闈欐佺粦瀹?nbsp; 鍓嶆湡緇戝畾 鍚庢湡緇戝畾 bound bind
virtual 鍑芥暟涓哄姩鎬佺粦瀹?dynamically bound),鑰岀己鐪佸弬鏁板煎嵈鏄潤鎬佺粦瀹?statically bound)銆?br> 闈欐佺被鍨?( static type )錛?br> 鍦ㄧ▼搴忎腑琚0鏄庢椂鎵閲囩敤鐨勭被鍨嬨?br> Shape* ps; //闈欐佺被鍨嬩負 Shape*, ps娌℃湁鍔ㄦ佺被鍨嬶紝鍥犱負涓烘寚鍚戜換浣曞璞°?br> Shape* pc = new Circle; //闈欐佺被鍨嬩負 Shape*錛?pc鐨勫姩鎬佺被鍨嬩負 Circle*
Shape* pr = new Rectangle; //闈欐佺被鍨嬩負 Shape*, pr鐨勫姩鎬佺被鍨嬩負 Rectangle*
鍔ㄦ佺被鍨?( dynamic type ) :
鐩墠鎵鎸囧璞$殑綾誨瀷錛?br> virtual 鍑芥暟緋誨姩鎬佺粦瀹氳屾潵錛岃皟鐢ㄤ竴涓獀irtual鍑芥暟鏃訛紝璋冪敤鍝竴浠藉疄鐜頒唬鐮侊紝鍙栧喅浜庡彂鍑鴻皟鐢ㄧ殑閭d釜瀵硅薄鐨勫姩鎬佺被鍨嬨?br>
class AClass
{
public :
virtual void func( int param = 123 )
{
// ..
}
} ;
class AClassDerived : public AClass
{
public :
// problematic overwriting the default parameter..
virtual void func( int param = 456 )
{
// ..
}
} ;
int main()
{
AClass * pA = new AClassDerived;
pA -> func();
}
鐢變簬鍑芥暟榛樿鍙傛暟鐨勯潤鎬佺粦瀹氱壒鎬э紝pA->func()鎵ц鏃秔aram浜嬪疄涓婅璧嬩簣浜?23錛岃岄潪瀛愮被涓湡鏈涚殑456錛岃櫧鐒舵帴涓嬫潵鎵ц鐨勬槸瀛愮被鐨勫嚱鏁板疄鐜?#8230;…
C++鑰冭檻鍒版墽琛屾晥鐜囧拰澶嶆潅鎬ф柟闈㈢殑浠d環錛岃瀹氫簡鍙兘鏄潤鎬佺粦瀹氱殑銆?br>
瑙e喅鏂瑰紡錛?br> 鍙互鐢ㄩ潪铏氬嚱鏁版帴鍙?NVI)鏉ヨВ鍐寵繖涓棶棰橈紝鐪嬩唬鐮?br> class AClass
{
public:
void func(int param = 123)
{
funcImpl(param);
}
private:
virtual void funcImpl( int real_param ) = 0;
//..
};
class AClassDerived : public AClass
{
private:
virtual void funcImpl( int real_param )
{
//do whatever you feel like to do here..
}
//..
};
Item 38 錛氶氳繃 composition 濉戞ā鍑?has-a 鎴?is-implemented-in-terms-of
--------------------------------------------------
tag: has-a composition is-implemented-in-terms-of 銆佹牴鎹甽ist瀹炵幇set(紲ヤ功涓婁緥錛?br>
·澶嶅悎(composition)鐨勬剰涔夊悓public緇ф壙瀹屽叏涓嶅悓銆?br> ·鍦ㄥ簲鐢ㄥ煙(application domain), 澶嶅悎鎰忓懗鐫 has-a,
鍦ㄥ疄鐜板煙(implementation domain),澶嶅悎鎰忓懗鐫 is-implemented-in-terms-of
composition鏄被鍨嬩箣闂寸殑涓縐嶅叧緋伙紝鍗蟲煇縐嶇被鍨嬬殑瀵硅薄鍐呭惈瀹冪綾誨瀷鐨勫璞°?br> composition銆?layering鍒嗗眰銆?nbsp; containment鍐呭惈銆乤ggregation鑱氬悎銆?embedding鍐呭祵
composition鎰忓懗鐫has-a 鎴?is-implemented-in-terms-of銆?/p>
Item 39 錛氭槑鏅鴻屽鎱庡湴浣跨敤 private 緇ф壙
--------------------------------------------------
tag: private inheritance
Private inheritance鎰忓懗鐫 implemented-in-terms-of.鍙湁瀹炵幇閮ㄥ垎琚戶鎵匡紝鎺ュ彛閮ㄥ垎琚暐鍘匯?br> 鑻?D 浠?private 褰㈠紡緇ф壙 B, 鎰忔濇槸 D 瀵硅薄鏍規嵁 B 瀵硅薄瀹炵幇鑰屽緱銆?br>
鍏湁緇ф壙涓殑瀛愮被瀵硅薄鏄彲浠ヨ杞崲涓哄畠鐨勭埗綾誨璞$殑(“鏄竴涓?#8221;鐨勫叧緋?錛岃岀鏈夌戶鎵夸腑榪欑杞崲鏄笉鎴愮珛鐨勩?br> 鍙﹀涓鐐癸紝縐佹湁緇ф壙涓埗綾葷殑鎵鏈夊叕鏈夊拰淇濇姢鎴愬憳(public鍜宲rotected)鍒頒簡瀛愮被涓紝閮藉彉鎴愪簡縐佹湁鎴愬憳銆?/p>
鍥犱負涓婇潰鐨勭壒鎬э紝縐佹湁緇ф壙騫朵笉婊¤凍“鏄竴涓?#8221;妯″瀷鐨勯渶瑕併傛洿鍙滅殑鏄紝縐佹湁緇ф壙騫朵笉鑳戒唬琛ㄤ竴縐嶈璁℃濊礬(鍏湁緇ф壙浠h〃浜?#8220;鏄竴涓?#8221;鐨勬ā鍨嬭璁?錛岃屼粎浠呮槸“鏈変竴涓?#8221;妯″瀷鐨勪竴縐嶅疄鐜版墜孌?縐佹湁緇ф壙榪囨潵鐨勬墍鏈夋垚鍛橀兘鏄鏈夌殑錛屼粠榪欎釜瑙掑害鏉ヨ瀹冨氨鍙槸“瀹炵幇”)銆?br> 鍙︿竴縐嶆墜孌靛ぇ甯堝湪Item38涓湁鎻愯繃錛屽氨鏄敤綾繪垚鍛樼殑鏂瑰紡鏉ユ瀯閫狅紝鍚嶆洶composition銆?br> 鏃㈢劧涓よ呴兘鑳藉疄鐜?#8220;鏈変竴涓?#8221;妯″瀷錛岄偅涔堝浣曢夋嫨鍛紵鑳界敤composition灝辯敤composition錛屽繀闇縐佹湁緇ф壙鐨勬椂鍊欐柟鎵嶇鏈夌戶鎵褲?/p>
姣斿鎴戜滑鏈変釜AClass錛歝lass AClass{
public:
virtual void Interface_1(/*..*/);
};
浠ヤ笅涓虹鏈夌戶鎵匡細class BClass : private AClass{
private:
virtual void Interface_1(/*..*/);
//..
};
鑰屼笅闈㈢殑composition鍙互杈懼埌涓鏍風敋鑷蟲洿濂界殑鏁堟灉錛歝lass AnotherAClass: public AClass{
public:
virtual void Interface_1(/*..*/);
//..
};
class DClass{
private:
AnotherAClass* a;
//..
};
BClass鍜孌Class閮藉疄鐜頒簡“鏈変竴涓?#8221;錛屼絾鐩告瘮涔嬩笅榪樻槸鑳藉垎杈ㄥ嚭闀跨煭錛?/p>
DClass涓殑AnotherAClass鏄鏈夋垚鍛橈紝闄や簡瀹冭嚜宸辨病鏈変漢鑳藉璁塊棶淇敼錛涜岀鏈夌戶鎵跨殑BClass涓嶈兘淇濊瘉鍏?#8220;鎷ユ湁”鐨凙Class瀹炵幇閮ㄥ垎涓嶄細琚涓夎呬慨鏀癸紝鍗充嬌鏄鏈夌戶鎵挎潵鐨勩?涓轟粈涔堣繖涔堣錛熺湅涓嬪幓……)
BClass縐佹湁緇ф壙浜咥Class錛岀浉褰撲簬瀹?#8220;鏈変簡涓涓?#8221;AClass鍙互鐢紝鍙互鐜┿侫Class涓殑鍏湁/淇濇姢鎴愬憳閮藉彉鎴愪簡BClass鐨勪漢錛屼絾鏄湪浜彈浣跨敤榪欎簺鎴愬憳鐨勫悓鏃訛紝BClass榪樿鎵挎媴鎻愪緵榪欎簺鎴愬憳緇欏埆浜烘湇鍔$殑涔夊姟銆?br> ITEM35涓浘緇忔彁鍒幫細铏氭嫙鍑芥暟鏈哄埗鍜屽叕鏈?縐佹湁/淇濇姢浣撳埗鏄病鏈変換浣曞叧緋葷殑銆傚洜姝ゅ湪渚嬪瓙涓殑Interface_1鏈夊彲鑳藉湪浠ヤ笅鐨勬儏鍐典腑琚浛浠g劧鍚?#8220;璋冪敤”錛?
涓涓狢Class鍏湁緇ф壙浜咮Class
CClass瀹氫箟浜嗚嚜宸辯殑Interface_1鐗堟湰
鏈変竴涓狟Class鐨勬寚閽堬紝鎸囧悜涓涓狢Class鐨勫璞★紝鏌愪釜鎿嶄綔涓皟鐢ㄤ簡Interface_1(CClass鐨勫疄鐜扮増鏈?
榪欐椂鍊橞Class鍙兘瑕佹湁鎰忚浜嗭細瀹冪殑浣滆呭茍娌℃湁鎵撶畻璁╁畠鐨勭戶鎵胯呬慨鏀笲Class鐗堟湰鐨処nterface_1錛屼絾浜嬪疄鏄疌Class榪濊儗浜嗗畠鐨勬剰蹇楋紒
寰堟洸鎶樺搱錛熷笇鏈涙垜涓嬫璇葷殑鏃跺欒繕鑳界湅鎳侤#錕?
DClass鐢變簬鍙槸瀹氫箟浜嗕竴涓寚鍚慉notherAClass鐨勬寚閽堬紝閭d箞鍦ㄥ畾涔塂Class鐨勬枃浠朵腑灝變笉闇瑕乮nclude AClass鎴朅notherAClass鐨勫ご鏂囦歡銆備簬鏄氨閬垮厤浜嗙紪璇戜緷璧?compilation dependecies)
鑰孊Class鍥犱負鏄戶鎵夸簡AClass錛屽湪BClass鐨勬枃浠朵腑灝遍渶瑕佸姞涓夾Class鐨勫ご鏂囦歡錛屼篃灝變笉鍙伩鍏嶇殑浜х敓浜嗙紪璇戞椂鐨勪緷璧栥?
鐢辨鐪嬫潵錛岀粷澶ч儴鍒嗘儏鍐典笅錛岀粍鍚堟柟寮?composition)鏄浼樹簬縐佹湁緇ф壙鐨勩備箣鎵浠ヨ“緇濆ぇ閮ㄥ垎”錛屾槸鍥犱負澶у笀璇翠簡錛?br> 瀵逛簬EBO(Empty Base Optimization)鐨勬儏鍐碉紝縐佹湁緇ф壙灝辨樉鐜板嚭浜嗗畠鐨勪紭鍔褲?br> 鎵璋揈BO灝辨槸榪欐牱鐨勪竴縐嶆儏鍐碉紝鏈変竴縐嶇壒孌婄殑綾伙紝瀹冩病鏈夐潪闈欐佹暟鎹垚鍛?non-static data member)錛屼篃娌℃湁铏氬嚱鏁?浜庢槸涓嶄細闇瑕佺┖闂村瓨鍌ㄨ櫄琛?銆?br> 鎵浠ヨ繖鏍風殑涓縐嶇被鍏跺疄涓嶅崰鐢ㄤ換浣曠┖闂達紝涓嶈繃鍥犱負C++涓嶅厑璁?瀛楄妭鐨勫璞″瓨鍦紝鑰屼笖寰堝緙栬瘧鍣ㄩ兘浼氭坊鍔犻澶栫殑絀洪棿鏉ュ疄鐜板瓧鑺傚榻愶紝浜庢槸榪欑鐗規畩鐨勭被鐨勫疄闄呭ぇ灝忓簲璇ユ槸1涓猚har瀵硅薄鐨勫ぇ灝忋?br> 鍦ㄨ繖縐嶇被涓紝寰寰浼氭湁寰堝typedef錛宔num錛岄潤鎬佹暟鎹垚鍛樻垨鑰呮槸闈炶櫄鍑芥暟銆傛墍浠ヤ粬浠繕鏄湁浠峰肩殑銆?br> 闇瑕佸湪“鏈変竴涓?#8221;鍏崇郴涓埄鐢ㄨ繖縐嶇被鐨勬椂鍊欙紝濡傛灉閲囩敤composition錛岄偅涔堟牴鎹笂闈㈢殑緇撹錛屽氨闇瑕佷粯鍑洪澶栫殑絀洪棿鏉?#8220;瀛樻斁”榪欎釜鏈潵涓嶅崰絀洪棿鐨勭被銆?br> 鐒惰屽鏋滄槸縐佹湁緇ф壙鍛紝灝卞彲浠ラ伩鍏嶈繖縐嶆儏鍐點?/p>
Item 40 錛氭槑鏅鴻屽鎱庡湴浣跨敤澶氶噸緇ф壙
--------------------------------------------------
tag: Multiple Inheritance, MI
MI 鐨勪紭涓庡姡銆?
MI 鐨勭涓涓棶棰樺氨鏄悕瀛楀啿紿侊紝 鏈緇忓吀鐨勪緥瀛愬氨鏄捇鐭抽棶棰?(diamond problem)銆?br> 璁炬兂 A 涓湁涓涓嚱鏁板彨鍋?GetName()錛?B 鍜?C 涓兘灝嗘湁榪欎竴鍑芥暟鎴愬憳錛岃繖涓椂鍊?D::GetName() 鐨勭湡姝e疄鐜版槸鏉ヨ嚜 B 鐨勮繕鏄?C 鐨勫憿錛熶簩涔夋у嚭鐜頒簡 (ambiguity) 銆?
涓嶈繃濡傛灉鐪熺殑鍙戠敓浜嗚繖縐嶆儏鍐碉紝瑕佽В鍐崇殑鏂規硶涔熶笉鏄病鏈夛紝鍙互榪欐牱鍋氾細
D d錛?br> d.B::GetName(); //Calling B's implementation
鍙﹀涓涓珮闃朵竴鐐圭殑鏂規硶鍙仛铏氱戶鎵?(virtual inheritance) 銆傚浜庡湪铏氭嫙緇ф壙涓殑鐖剁被錛屽叾涓殑鎴愬憳閮戒繚璇佷笉浼氬湪鍚庨潰鐨勫瓙綾諱腑鍑虹幇浜屼箟鐜拌薄 (ambiguity) 銆?/p>
class A
{
public:
void GetName();
};
class B : virtual public A { };
class C : virtual public A { };
class D : public B, public C { }
D d;
d.GetName(); //there is no ambiguity here.
浣嗘槸铏氱戶鎵夸笉鏄病鏈変唬浠風殑錛屽ぇ甯堣榪欑鎶鏈細浣垮緱鏈緇堜唬鐮佸彉寰楁洿澶э紝璁塊棶铏氭嫙緇ф壙涓殑鐖剁被鎴愬憳涔熶細鍙樺緱鏇存參涓浜涖?
榪欎釜涔熶笉闅劇悊瑙c傚拰絀洪棿鎹㈡椂闂翠竴鏍鳳紝鍜屼笉緇欑墰鍚冭崏鐗涘氨涓嶅共媧諱竴鏍楓?( 鍙﹀鐨勪竴涓唬浠鋒垜榪樻病鑳藉畬鍏ㄧ悊瑙i忓交錛氫功涓婅鍥犱負铏氱戶鎵夸腑鍩虹被鐨勫垵濮嬪寲鏄敱緇ф壙鍏崇郴涓渶搴曞眰鐨勫瓙綾昏礋璐g殑錛屽洜姝ゅ浜庤繖浜涙渶搴曚笅鐨?“ 瀚″瓩 ” 綾繪潵璇達紝灝變笉鏄偅涔堟柟渚夸簡 )
浜庢槸澶у笀寤鴻鍙湁鍦ㄥ繀瑕佺殑鏃跺欐墠浣跨敤铏氱戶鎵匡紝鑰屽湪铏氱戶鎵夸腑鐨勫熀綾婚噷涔熶笉瑕佹斁緗暟鎹垚鍛橈紝榪欐牱灝變笉鐢ㄦ媴蹇冨垵濮嬪寲鐨勯棶棰樹簡銆?
涓嶈繃瀛樺湪灝辨槸鍚堢悊錛岃繕鏄湁闇瑕佺敤鍒?MI 鐨勬椂鍊欍備竴涓湪涔︿腑鎻愬埌鐨勪嬌鐢?MI 鐨勬儏褰㈡槸錛氬綋闇瑕佷粠涓涓被 AClass 涓戶鎵挎帴鍙o紝鍙堥渶瑕佷粠鍙﹀涓涓被 BClass 涓戶鎵垮疄鐜扮粏鑺傛椂錛屽氨鍙互鑰冭檻鍦ㄥ叕鏈夌戶鎵?AClass 鐨勫悓鏃跺張縐佹湁緇ф壙 BClass 銆傞亾鐞嗗ぇ鑷村氨鏄繖鏍鳳紝灝變笉緙栭犵▼搴忕敾铔囨坊瓚充簡銆?
鎬葷粨涓涓嬶細 MI 姣?SI(Single Inheritance) 瑕佸鏉傚鏄撳嚭閿?( 姣斿璇撮捇鐭抽棶棰?) 錛屽嵆浣垮彲浠ョ敤铏氱戶鎵挎潵瑙e喅閽葷煶闂錛屼絾鏄叾甯︽潵鐨勪唬鐮佷綋縐澶э紝璁塊棶鏁堢巼涓嬮檷浠ュ強鍒濆鍖栭棶棰樿繕鏄笉鑳藉拷瑙嗙殑銆傛渶鍚庤瘽璇村洖鏉ワ紝闇瑕佺敤鍒?MI 鐨勬椂鍊欙紝灝忓績鐐圭敤渚挎槸
Item 26 錛?灝藉彲鑳藉歡鍚庡彉閲忓畾涔夊紡鐨勫嚭鐜版椂闂?br>--------------------------------------------------
tag:
·灝藉彲鑳藉歡鍚庡彉閲忓畾涔夊紡鐨勫嚭鐜幫紝浠ュ鍔犵▼搴忕殑娓呮櫚搴﹀茍鏀瑰杽紼嬪簭鏁堢巼銆?br>
瀹氫箟鍙橀噺鍖呭惈浜嗚鍙橀噺瀵硅薄鐨勬瀯閫犳搷浣滐紝濡傛灉鍥犱負鏌愪釜鍘熷洜(濡傛姏鍑哄紓甯革紝鏉′歡璇彞鏈墽琛岀瓑)鑰屾病鏈夌湡姝g敤鍒拌繖涓彉閲忥紝閭d箞鏋勯犺鍙橀噺鎵鑰楄垂鐨勬椂闂村拰璧勬簮灝辯櫧璐逛簡銆?
鍦ㄥ嵆灝嗕嬌鐢ㄥ彉閲忓墠鍐嶅畾涔夊畠瀵圭悊瑙d唬鐮佷篃鏈夊ソ澶勶細瑕佹兂鐭ラ亾鏌愪釜鍙橀噺鏃跺仛浠涔堢敤鐨勶紵璇繪帴涓嬫潵鐨勪唬鐮佷究鏄?
鎬濊冮錛屼互鍙婄瓟妗堬細
//鏂規硶A錛氬驚鐜瀹氫箟
Widget w;
for (int i = 0; i < n; ++i){
w = some_value_dependent_on_i;
//..
}
//鏂規硶B:寰幆鍐呭畾涔?br> for (int i = 0; i < n; ++i) {
Widget w(some_value_dependent_on_i);
//..
}
鏂規硶A璋冪敤浜?嬈℃瀯閫犲嚱鏁般?嬈℃瀽鏋勫嚱鏁般乶嬈℃嫹璐濆嚱鏁幫紱
鏂規硶B璋冪敤浜唍嬈℃瀽鏋勫嚱鏁般乶嬈℃瀽鏋勫嚱鏁般?
褰?鎷瘋礉鎿嶄綔鐨勫紑閿 姣?鏋勯?鏋愭瀯鎿嶄綔 瑕佸粔浠風殑鏃跺欙紝涓鑸潵璇碅鏂規硶鏄笂閫夈?
浣嗘槸A鏂規硶涓璞$殑浣滅敤鍩熸瘮B鏂規硶涓洿澶э紝涔熷氨榪濊儗浜嗕唬鐮佺殑闆嗕腑鎬у拰鍙淮鎶ゆу師鍒欍?
鍥犳錛岄櫎闈?
鎷瘋礉鎿嶄綔姣旀瀯閫?鏋愭瀯鎿嶄綔寮閿灝忥紝騫朵笖姝ら儴鍒嗕唬鐮佸鎬ц兘(performance)瑕佹眰寰堥珮錛?姝ゆ椂閫夋嫨涓篈)
鍚﹀垯B鏂規硶榪樻槸鏇村悎鐞嗐?
Item 27 錛?灝戝仛杞瀷鍔ㄤ綔
--------------------------------------------------
tag: cast 杞瀷 const_cast dynamic_cast reinterpret_cast static_cast
·灝介噺閬垮厤杞瀷錛岀壒鍒槸娉ㄩ噸鏁堢巼鐨勪唬鐮佷腑閬垮厤 dynamic_casts.灝介噺灝嗚杞瀷鐨勮璁¤漿鍖栦負鏃犻渶杞瀷銆?br> ·鑻ヨ漿鍨嬪繀欏伙紝璇曠潃灝嗗畠闅愯棌浜庢煇涓嚱鏁拌儗鍚庛傚鎴烽殢鍚庡彲浠ラ殢鏃惰皟鐢ㄨ鍑芥暟錛岃屼笉闇灝嗚漿鍨嬫斁榪涗粬浠嚜宸辯殑浠g爜涓?br> ·鍙﹀彲浣跨敤 C++ style杞瀷錛屼篃涓嶈浣跨敤鏃у紡杞瀷銆傚墠鑰呮洿瀹規槗鍒嗚鯨銆?br>
綾誨瀷杞崲鐨勪笁縐嶅艦寮?鍓嶉潰涓ょ閮芥槸C椋庢牸鐨勬棫寮忕被鍨嬭漿鎹?錛?br> (T)expression
T(expression)
C++ Style:
const_cast錛氳緗垨鏄幓闄ゅ璞$殑const灞炴с?
dynamic_cast錛氫富瑕佺敤浜庣戶鎵垮叧緋誨眰嬈′腑鐨勫悜涓娿佸悜涓嬭漿鎹紝浠ュ強綾諱箣闂寸殑浜ゅ弶杞崲銆備細榪涜杞崲瀹夊叏鎬ф鏌ャ?
static_cast錛氬彲鐢ㄤ簬鍐呯疆綾誨瀷鐨勮漿鎹紝浠ュ強緇ф壙鍏崇郴灞傛涓殑鍚戜笂杞崲銆傛病鏈夎漿鎹㈠畨鍏ㄦф鏌ャ?
reinterpret_cast錛氱畝鍗曠殑寮哄埗灝嗕竴涓寚閽堣漿鎹負鍙﹀涓縐嶆寚閽堟垨鏁存暟綾誨瀷錛屼笉鍋氫換浣曟鏌ャ?
綾誨瀷杞崲榪樺彲鑳藉紩鍙戦澶栫殑浠g爜榪愯銆傛瘮濡傝dynamic_cast灝變細閫氳繃璋冪敤strcmp鏉ユ瘮杈冪被鐨勫悕縐幫紝浠庤屽畬鎴愮戶鎵垮叧緋諱腑涓嶅悓綾誨璞$殑杞崲錛岃繖涓椂鍊欏氨涓嶄粎浠呮槸綆鍗曠殑鍙樺彉綾誨瀷浜嗐傚洜姝わ紝璇?#8220;綾誨瀷杞崲浠呮槸鍛婅瘔緙栬瘧鍣ㄦ妸涓縐嶇被鍨嬬殑鏁版嵁褰撴垚鍙﹀涓縐嶆潵鍙備笌璁$畻”鍏跺疄鏄竴涓悊瑙d笂鐨勮鍖恒?br> 綾誨瀷杞崲涔熸湁鍙兘甯︽潵棰濆寮閿錛氭瘮濡備功涓敤static_cast榪涜鐨勭戶鎵垮叧緋葷殑鍚戜笂杞崲錛屽氨浼氳嚜浣滀富寮犲湴鐢熸垚涓涓復鏃剁殑瀵硅薄銆?/p>
dynamic_cast 閫氬父鏄湪涓涓瀹氫負 derived class 瀵硅薄涓婃墽琛?derived class鎿嶄綔鍑芥暟錛屼絾鎵嬩笂鍙湁涓涓?#8220;鎸囧悜base”鐨刾ointer鎴杛eference銆?br> 鍙互鐢ㄤ互涓嬩袱縐嶆柟娉曟潵閬垮厤榪欎釜闂錛?br> 1. 浣跨敤瀹瑰櫒騫跺湪鍏朵腑瀛樺偍鐩存帴鎸囧悜 derived class 瀵硅薄鐨勬寚閽堬紙閫氬父涓烘櫤鑳芥寚閽堬級錛屼互娑堥櫎閫氳繃base class鎺ュ彛澶勭悊瀵硅薄鐨勯渶瑕併?br> 2. 鍦╞ase class鍐呮彁渚泇irtual鍑芥暟鍋氫綘鎯沖鍚勪釜derived classes鍋氱殑浜嬨?br> 瑕侀伩鍏嶆墍璋撶殑“榪炰覆錛坈ascading錛塪ynamic_casts”
鍦–++涓紝涓や釜鎸囧悜鍚屼竴涓璞$殑涓嶅悓鎸囬拡鍙兘鎷ユ湁涓嶅悓鐨勫湴鍧鍊箋?br> 鍥犳錛屼笉浠呰灝藉彲鑳界殑閬垮厤杞崲綾誨瀷錛岃屼笖鍦ㄤ笉寰椾笉浣跨敤綾誨瀷杞崲鐨勬椂鍊欙紝涔熷簲璇ヨ冭檻灝嗚漿鎹㈢殑浠g爜鐢ㄥ嚱鏁板皝瑁呰搗鏉ャ?
Item 28 錛?閬垮厤榪斿洖 handles 鎸囧悜瀵硅薄鍐呴儴鎴愬垎
--------------------------------------------------
tag: 榪斿洖鍊?br>
閬垮厤榪斿洖 handles錛堝寘鎷瑀eference銆乸ointer銆乮terator錛夋寚鍚戝璞″唴閮ㄣ?br> 澧炲姞灝佽鎬э紝甯姪const鎴愬憳鍑芥暟鐨勮涓哄儚涓猚onst錛屽茍灝嗗彂鐢?#8220;鎮瀭handles”鐨勫彲鑳芥ч檷鑷蟲渶浣庛?br>
濡傛灉鍙渶瑕佽璁塊棶錛屽氨浣跨敤const鐨勮繑鍥炲鹼紝涓嶈寮鏀懼啓鐨勬潈闄愩?br> 鏈夊彲鑳戒駭鐢熸偓鍨傛寚閽?dangling pointer)涔熸槸鏆撮湶瀵硅薄鍐呴儴鎴愬憳handles鐨勫悗鏋滀箣涓銆?br>
涓涓繑鍥炲璞″唴閮ㄦ垚鍛樼殑鍑芥暟錛屽湪鐢ㄦ埛涓嶆紜嬌鐢ㄧ殑鎯呭喌涓嬶紝灝辨湁鍙兘浜х敓鎮瀭鎸囬拡銆?br> class AClass{//..};
class BClass{
//..
const AClass& FuncReturningARef();
//..
}
//a possible user's code
BClass AnObjectOfB;
const AClass *pAClass = &(AnObjectOfB.FunReturningARef());
//After the call pAClass becomes a dangeling pointer..
Item 29 錛?緙栧啓瀵瑰紓甯稿厤鐤?exception-safe)鐨勪唬鐮?br>--------------------------------------------------
tag: Exception safety
·Exception safety functions鍗充嬌鍙戠敓寮傚父涔熶笉鍥炴硠闇插瓧鍏冩垨鍏佽浠諱綍鏁版嵁緇撴瀯璐ュ潖銆傚尯鍒嗕負涓夌鍙兘鐨勪繚璇侊細鍩烘湰鍨嬨佸己綾誨瀷銆佷笉鎶涘嚭寮傚父鍨?br> ·寮虹儓淇濊瘉鍨嬮氬父鑳戒互 copy-and-swap 瀹炵幇錛屼絾寮虹儓淇濊瘉鍏靛尓瀵規墍鏈夊嚱鏁伴兘鍙疄鐜版垨鍏峰鐜板疄鎰忎箟銆?br> ·鍑芥暟鎻愪緵鐨?#8220;Exception-safe淇濊瘉”閫氬父鍙瓑浜庡叾鎵璋冪敤涔嬪悇涓嚱鏁扮殑“Exception-safe淇濊瘉"涓殑鏈寮辮呫?/p>
瀵瑰紓甯稿厤鐤殑鍑芥暟鍦ㄥ紓甯稿彂鐢熺殑鏃跺欏簲璇ュ叿澶囦袱涓壒寰侊細
涓嶆硠婕忎換浣曡祫婧?鍐呭瓨銆侀攣絳夌瓑)
涓嶉犳垚浠諱綍鏁版嵁緇撴瀯鐨勬崯鍧?
騫惰兘澶熸彁渚涜嚦灝戜互涓嬩繚璇佷腑鐨勪竴欏癸細
Exception-safe functions 鎻愪緵浠ヤ笅涓変釜淇濊瘉涔嬩竴錛?br> 鍩烘湰鐨勪繚璇侊細褰撳紓甯告姏鍑烘椂錛岀▼搴忎腑鐨勫璞°佹暟鎹厤閬牬鍧忋?
杈冨己鐨勪繚璇侊細褰撳紓甯告姏鍑烘椂錛岀▼搴忕殑鐘舵佷笉浼氳鏀瑰彉銆傝嫢鎴愬姛璋冪敤鍑芥暟錛屽垯緋葷粺榪涘叆鎴愬姛鍚庣殑鐘舵侊紱濡傛灉鍑芥暟涓洜寮傚父鑰屽嚭閿欙紝緋葷粺搴旇鐣欏湪璋冪敤鍑芥暟鍓嶇殑鐘舵侊細
鏈寮虹殑淇濊瘉錛氫笉浼氭湁寮傚父鎶涘嚭銆備緥濡傚鍐呯疆綾誨瀷鐨勬搷浣滃氨涓嶄細鎶涘嚭寮傚父銆傝繖鏄渶鐞嗘兂鐨勶紝浣嗕篃寰堥毦鍋氬埌銆傛洿澶氱殑鍑芥暟鍙兘鍦ㄥ墠涓よ呬腑鍋氫竴閫夋嫨銆?/p>
涓轟簡鑳藉鎻愪緵杈冨己鐨勪繚璇侊紝涔熷嵆緋葷粺鐨勭姸鎬佷笉鍥犲紓甯告姏鍑轟笌鍚﹁屽彉鍖栵紝澶у笀鍙堥噸鏂版彁鍑轟簡“鍏堟嫹璐濆悗浜ゆ崲”(copy-and-swap)榪欎竴鏂規硶璁烘潵銆?br> 鐢ㄤ笉閭d箞涓ヨ皚鐨勮娉曪細涓轟簡閬垮厤鍦ㄦ搷浣滃璞℃椂瑙﹀彂寮傚父褰卞搷緋葷粺鐘舵侊紝“鍏堟嫹璐濆悗浜ゆ崲”鍏堟槸鍒涘緩浜嗕竴涓復鏃跺璞★紝灝嗘墍鏈夌殑鎿嶄綔閮芥柦鍔犲湪璇ヤ復鏃跺璞′笂銆傚鏋滄病鏈夊嚭閿欙紝鎶婅繖涓鐞嗚繃鐨勪復鏃跺璞″拰鐪熸闇瑕佸鐞嗙殑瀵硅薄浜ゆ崲涓閫氾紝綆楁槸欏哄埄瀹屾垚浠誨姟錛涘鏋滄湁閿欏茍鎶涘嚭浜嗗紓甯革紝鍘熺郴緇熺姸鎬佷篃涓嶄細琚獎鍝嶏紝鍥犱負鐪熸闇瑕佸鐞嗙殑瀵硅薄鏍規湰娌℃湁琚姩榪囥?br> 褰撶劧錛屽ぉ涓嬫病鏈夊厤璐圭殑鍗堥銆?br> “鍏堟嫹璐濆悗浜ゆ崲”涓嶄粎鑰楄垂浜嗕竴涓復鏃跺璞$殑瀛樺偍浠d環錛屽悓鏃舵敮鍑虹殑榪樻湁鍚庨潰浜ゆ崲瀵硅薄鏃剁殑鏃墮棿鍜岃祫婧愬紑閿銆傚洜姝わ紝瀵瑰紓甯稿厤鐤殑杈冨己淇濊瘉鏄緢濂藉緢寮哄ぇ錛屼絾鏄疄闄呬腑騫朵笉鏄換浣曟椂鍊欓兘闇瑕佸仛鍒伴偅涔堥珮鐨勪繚璇併傛潃楦″矀闇鐢ㄧ墰鍒錛?/p>
鏈鍚庤鎻愰啋鐨勬槸錛屽寮傚父鍏嶇柅鐨勫嚱鏁頒篃絎﹀悎“鐭澘鐞嗚”錛氭湪妗惰兘瑁呯殑姘翠笌鍏舵渶鐭殑閭e潡鏈ㄦ澘鏈夊叧錛屽嚱鏁板寮傚父鍏嶇柅鐨勭▼搴︿篃鐢卞嚱鏁頒腑紼嬪害鏈浣庣殑浠g爜(鍖呮嫭鍏惰皟鐢ㄧ殑鍑芥暟)鍐沖畾銆傛煇涓嚱鏁板鏋滆皟鐢ㄤ簡鍙﹀涓涓竴鍑虹幇寮傚父灝卞穿婧冪殑鍑芥暟錛岄偅涔堣繖涓嚱鏁板氨涓嶈兘鎻愪緵鍩烘湰鐨勫紓甯稿厤鐤繚璇併?/p>
Item 30 錛?閫忓交浜嗚В inlining
--------------------------------------------------
tag: inline
·灝嗗ぇ澶氭暟 inlining 闄愬埗鍦ㄥ皬鍨嬨佽棰戠箒璋冪敤鐨勫嚱鏁拌韓涓娿傚彲浣挎棩鍚庣殑璋冪敤榪囩▼鍜屼簩榪涘埗鍗囩駭鏇村鏄擄紝涔熶嬌紼嬪簭鐨勯熷害鎻愬崌鏈轟細鏇村ぇ銆?br> ·涓嶈鍙洜涓?function templates 鍑虹幇鍦ㄥご鏂囦歡錛屽氨灝嗕粬浠0鏄庝負 inline.
浣跨敤鍐呰仈鍑芥暟(inline function)鍙互鐪佸幓涓鑸嚱鏁拌皟鐢ㄧ殑鍏ユ爤鎿嶄綔寮閿錛屾瘮瀹?macro)瑕佸ソ鐢ㄣ備粠緙栬瘧鍣ㄧ殑瑙掑害鏉ョ湅錛屾病鏈夊嚱鏁拌皟鐢ㄧ殑浠g爜瑕佹洿瀹規槗浼樺寲銆?br> 浣嗘槸澶╀笅娌℃湁鍏嶈垂鐨勫崍槨愶紝浠ョ┖闂存崲鏃墮棿鐨勫唴鑱斿嚱鏁板悓鏃朵篃甯︽潵浜嗘洿澶х殑紼嬪簭鍗犵敤絀洪棿錛屾洿鐢氳呰繕浼氬洜涓鴻繖鍙樺ぇ鐨勪唬鐮佺┖闂村鑷撮澶栫殑鍐呭瓨鎹㈤〉鎿嶄綔錛岄檷浣庢寚浠ょ紦瀛?instruction cache)鐨勫懡涓巼……榪欎簺閮芥槸浣跨敤鍐呰仈鍑芥暟闇瑕佽冭檻鍒扮殑璐熼潰褰卞搷銆?Scott榪樻槸杈╄瘉鍦版彁閱掍簡涓鐐癸細褰撳唴鑱斿嚱鏁伴潪甯哥煭灝忔椂錛岀浉姣斾竴鑸剰涔変笂鐨勫嚱鏁拌皟鐢紝瀹冭兘澶熷府鍔╃紪璇戝櫒鐢熸垚鏇村皬鐨勬渶緇堜唬鐮佸拰榪愯鏃舵洿楂樼殑鎸囦護緙撳瓨鍛戒腑鐜?
鍐呰仈鍑芥暟鐨勫0鏄庡彲浠ユ槸鏄懼紡鐨勶細浣跨敤inline鍏抽敭瀛楋紱涔熷彲浠ユ槸闅愬紡鐨勶細鍦ㄧ被鐨勫畾涔変腑瀹氫箟鍑芥暟銆?/p>
鍐呰仈鍑芥暟涓鑸岃█閮芥槸瀹氫箟鍦ㄥご鏂囦歡涓紝榪欐槸鍥犱負澶у鏁扮紪璇戝櫒鐨勫唴鑱斿姩浣滈兘鏄彂鐢熷湪緙栬瘧榪囩▼涓?涔熸湁鐫閾炬帴鐢氳嚦鏄繍琛屼腑鎵嶈繘琛屽唴鑱旂殑錛屼絾鏄亢浠繖閲岄殢澶ф祦錛岃涓昏鐭涚浘)
铏界劧鍐呰仈鍑芥暟鍜屽嚱鏁版ā鏉挎湁涓鐐圭浉浼鹼細瀹冧滑閮藉嚑涔庡畾涔夊湪澶存枃浠朵腑錛屼絾鏄繖涓よ呬箣闂存病鏈夊繀鐒惰仈緋伙紝鑰岄潪鏈夌殑紼嬪簭鍛樻兂鐨勯偅鏍?#8220;鍑芥暟妯℃澘涓瀹氭槸鍐呰仈鐨?#8221;)
鍐呰仈鍑芥暟鐨勫畾涔変粎浠呮槸瀵圭紪璇戝櫒鎻愬嚭鍐呰仈鐨勮姹傘傜紪璇戝櫒瀹屽叏鏈夊彲鑳藉拷瑙嗚繖涓姹傦紝浜庢槸鏌?#8220;鍐呰仈鍑芥暟”鏈夊彲鑳藉湪鏈鍚庤繕鏄敓鎴愪簡涓鑸嚱鏁扮殑浠g爜錛?/p>
璇鋒眰鍐呰仈鐨勫嚱鏁版湁鍙兘澶繃浜庡鏉?
璇鋒眰鍐呰仈鐨勫嚱鏁版湁鍙兘鏄櫄鍑芥暟(铏氬嚱鏁扮殑鐪熸瀹炰綋瑕佸湪榪愯鏃舵墠鑳藉緱鐭ワ紝璁╃紪璇戝櫒緙栬瘧闃舵鍘誨仛鍐呰仈瀹炲湪鏈夌偣寮轟漢鎵闅?
璇鋒眰鍐呰仈鐨勫嚱鏁版病浠涔堥棶棰橈紝浣嗘槸鍦ㄤ唬鐮佷腑鏈夌敤鍑芥暟鎸囬拡鐨勬柟寮忚皟鐢ㄨ鍑芥暟(榪欐牱緙栬瘧鍣ㄤ篃娌″姙娉曪紝濡傛灉涓嶇敓鎴愪竴鑸嚱鏁板摢鏉ョ殑鍑芥暟鎸囬拡錛?
榪欎簺鎯呭喌涓嬬‘瀹炰笉搴旇鎶婂嚱鏁頒綔涓哄唴鑱斿嚱鏁般備竴涓?#8220;鍐呰仈鍑芥暟”鏄惁鏈緇堢敓鎴愪簡鍐呰仈鍑芥暟錛岃繕寰楃紪璇戝櫒璇翠簡綆椼?br> 鐒惰岀紪璇戝櫒騫朵笉鏄昏兘甯姪鎴戜滑鍋氬嚭姝g‘鐨勫喅瀹氾紝榪樻湁涓浜涙儏鍐墊槸闇瑕佹垜浠嚜宸卞仛鍑哄垽鏂殑錛?/p>
璇鋒眰鍐呰仈鐨勫嚱鏁版槸鏋勯?鏋愭瀯鍑芥暟(琛ㄩ潰涓婄湅璧鋒潵鏌愪釜鏋勯?鏋愭瀯鍑芥暟寰堢煭灝忕敋鑷蟲槸絀虹殑錛屼絾鏄負浜嗘瀯閫?鏋愭瀯綾諱腑鐨勫叾浠栨垚鍛橈紝緙栬瘧鍣ㄦ湁鍙兘浼?#8220;鑷”鍦板啓鍏ュ繀瑕佺殑浠g爜錛岃繖鏍風殑鏋勯?鏋愭瀯鍑芥暟灝辨湁鍙兘涓嶉傚悎鍐嶅仛鍐呰仈浜?榪欎竴鐐瑰師鏂囦腑鏈夋洿璇︾粏鐨勮鏄庛?
褰撶紪鍐欐敮鎸佸簱鏃?library)涔熶笉寤鴻浣跨敤鍐呰仈鍑芥暟錛屽洜涓轟竴鏃︾敤鎴蜂嬌鐢ㄤ簡榪欎簺鍚湁鍐呰仈鍑芥暟鐨勫簱騫剁紪璇戜簡鑷繁鐨勭▼搴忥紝榪欎簺鍐呰仈鍑芥暟灝卞凡緇?#8220;鍐欐”鍦ㄤ粬浠殑紼嬪簭涓簡銆傚綋鏃ュ悗瀵瑰師鍏堢殑搴撳仛浜嗘洿鏂頒慨鏀癸紝鐢ㄦ埛灝卞繀欏婚噸鏂扮紪璇戞暣涓▼搴忔墠鑳界敤涓婃柊鐨勮ˉ涓併傝屼竴鑸殑鍑芥暟灝變笉浼氭湁榪欎釜闂錛氫粬浠槸鍔ㄦ侀摼鎺ョ殑錛岀敤鎴鋒牴鏈劅瑙変笉鍒頒換浣曟敼鍔ㄣ?
鑰冭檻鍒板緢澶氳皟璇曞櫒(debugger)鏃犳硶璋冭瘯鍐呰仈鍑芥暟(鏈潵灝辨病鏈夎繖涔堜竴涓?#8220;鍑芥暟”錛屽彨浜哄鎬庝箞璁炬柇鐐癸紵)錛屽湪璋冭瘯鐗堟湰涓篃涓嶅緩璁嬌鐢ㄥ唴鑱斿嚱鏁般?
鏈夐偅涔堝闇瑕佹敞鎰忕殑鍦版柟錛屽ぇ甯堟渶鍚庢葷粨浜嗕竴涓嬶細鐢ㄥソ鍐呰仈鍑芥暟鐨勭涓姝ュ氨鏄細涓嶇敤鍐呰仈鍑芥暟銆傚茍娌℃湁閭d箞澶氱殑鍑芥暟鐪熸闇瑕佸唴鑱旓紝鍥犱負80%鐨勭▼搴忚繍琛屾椂闂撮兘鏄姳鍦ㄤ簡20%鐨勪唬鐮佷腑銆傜浜屾鏄妸鍐呰仈鍑芥暟褰撴垚鏄墜宸ヤ紭鍖栫殑鎵嬫錛屼粎浠呭湪闈炲父闇瑕佹晥鐜囧拰浼樺寲鐨勪唬鐮佷腑浣跨敤鍐呰仈銆?
Item 31 錛?灝嗘枃浠墮棿鐨勭紪璇戜緷瀛樺叧緋婚檷鑷蟲渶浣?br>--------------------------------------------------
tag: Handle class錛孖nterface classes , 鎺ュ彛綾?瀹炵幇綾伙紝
·鐩鎬緷浜庡0鏄庡紡錛屼笉瑕佺浉渚濅簬瀹氫箟寮忋備袱涓墜孌墊潵瀹炵幇錛欻andle classes 鍜?Interface classes.
·紼嬪簭搴撳ご鏂囦歡搴旇浠?“ 瀹屽叏涓斾粎鏈夊0鏄庡紡 ”(full and declaration-only forms)鐨勫艦寮忓瓨鍦紝涓嶈鏄惁娑夊強 templates.
澶у笀璇翠簡錛孋++鐨勮璁¤繕鏄湁緙洪櫡鐨勶細瀹冩棤娉曟妸鎺ュ彛(interface)鐨勮璁″拰瀹炵幇(implementation)鐨勮璁″畬鍏ㄥ垝鍒嗗紑鏉ャ?br> 姣斿璇村湪涓涓被鐨?鎺ュ彛)澹版槑褰撲腑錛屾繪槸鎴栧鎴栧皯鐨勪細娉勬紡涓浜涘疄鐜頒笂鐨勭粏鑺傦紝铏界劧榪欐牱鍋氫笌鎺ュ彛鐨勮璁″茍娌℃湁澶鑱旂郴銆?/p>
class AClass {
public :
void interface_1();
std::string interface_2();
private :
// implementation details are leaking as below..
std::string internalData_1;
BClass internalData_2;
}
寰寰榪橀渶瑕佸紩鐢ㄥ叾浠栧ご鏂囦歡涓浉鍏沖璞$殑瀹氫箟(濡備笅闈㈢殑浠g爜)錛屼粠鑰屼駭鐢熶簡瀵硅繖浜涘ご鏂囦歡鐨?鍦ㄧ紪璇戞椂鐨?渚濊禆銆傚洜姝ゆ瘡嬈¤繖浜涙枃浠朵腑鐨勬煇涓湁鍙樺寲鏃訛紝渚濊禆瀹冪殑鎵鏈夋枃浠墮兘闇瑕侀噸鏂扮紪璇戙?br> #include < string >
#include " BClass.h " //
銆愭敞鎰忋戣繖閲岃矊浼奸昏緫涓嶆槸寰堥『錛氬氨綆楁病鏈夐偅浜涚鏈夋垚鍛樼殑澹版槑錛屾帴鍙e嚱鏁扮殑榪斿洖鍊煎鏋滄槸string鎴栨槸BClass絳夌被鍨嬶紝涓嶈繕鏄竴鏍烽渶瑕佷緷璧栧紩鐢ㄥ叾浠栧ご鏂囦歡鍚楋紵
榪欐槸涓ょ涓嶄竴鏍風殑鎯呭喌錛屽疄鐜板拰鎺ュ彛銆?br> 鍓嶉潰璇寸殑瀹炵幇緇嗚妭鐨勬硠婕忔槸浼氬鑷寸紪璇戜緷璧栫殑錛屽洜涓虹紪璇戝櫒闇瑕佷簡瑙h繖浜涚被鍨嬪璞$殑澶у皬榪涜屼負鍏跺垎閰嶅唴瀛樼┖闂達紱
浣嗘槸鎺ュ彛錛屾瘮濡傝鍑芥暟鐨勮繑鍥炲兼垨鏄弬鏁拌〃涓殑鍙傛暟錛屽氨涓嶉渶瑕佺紪璇戝櫒鍘昏冭檻鍒嗛厤鍐呭瓨鐨勯棶棰橈紝鍥犳涔熷氨娌℃湁鎵璋撶殑緙栬瘧渚濊禆浜嗐?/p>
灝嗙被鍒嗗壊涓轟袱涓猚lasses錛屼竴涓彧鎻愪緵鎺ュ彛錛屽彟涓涓礋璐e疄鐜拌鎺ュ彛銆?br> class AClassImpl
{
private :
// implementation details are moved here..
std::string internalData_1;
BClass internalData_2;
}
class AClass
{
public :
void interface_1();
std::string interface_2();
private :
// there is only a pointer to implementation
std::tr1::shared_ptr < AClassImpl > pImpl;
}
// a constructor: instantiations of AClass and AClassImpl should always be bound together.
AClass::AClass( // ..) : pImpl(new AClassImpl( // ..))
{ }
鍒嗙鐨勫叧閿湪浜庝互“澹版槑鐨勪緷瀛樻?#8221;鏇挎崲“瀹氫箟鐨勪緷瀛樻?#8221;錛氳澶存枃浠跺敖鍙兘鑷垜婊¤凍錛屽鏋滀笉琛岋紝灝辮瀹冧笌鍏朵粬鏂囦歡鍐呯殑澹版槑寮忥紙鑰岄潪瀹氫箟寮忥級鐩鎬緷錛?br> ·鑻ヤ嬌鐢?object references 鎴?object pointers 鍙互瀹屾垚浠誨姟錛屽氨涓嶈浣跨敤 objects.浣嗗鏋滆瀹氫箟鏌愮被鍨嬬殑object錛屽氨闇瑕佺敤鍒板畾涔夊紡錛屻?br> ·灝介噺浠lass澹版槑寮忔浛鎹lass瀹氫箟寮忋?br> ·涓哄0鏄庡紡鍜屽畾涔夊紡鎻愪緵涓嶅悓鐨勫ご鏂囦歡銆?/p>
絎簩縐嶆柟娉曚腑錛屾娊璞$被/鎺ュ彛綾繪彁渚涗簡鎵鏈夋帴鍙g殑綰櫄鍑芥暟褰㈠紡錛氫細鏈夎綾葷殑瀛愮被鍘誨疄鐜拌繖浜涙帴鍙c?br> 鍦ㄦ娊璞$被/鎺ュ彛綾諱腑榪樹細鏈変竴涓潤鎬?static)鐨勫伐鍘傚嚱鏁?姣斿create()/produce()/factory()……錛夛紝榪欎釜鍑芥暟瀹為檯涓婅搗鍒頒簡鏋勯犲嚱鏁扮殑浣滅敤錛屽畠“鍒墮?#8221;鍑哄瓙綾誨璞℃潵瀹屾垚鐪熸鐨勪換鍔★紝鍚屾椂榪斿洖榪欎釜瀵硅薄鐨勬寚閽?閫氬父鏄櫤鑳芥寚閽堝shared_ptr)銆傚嚟鍊熻繖涓繑鍥炵殑鎸囬拡灝卞彲浠ヨ繘琛屾甯哥殑鎿嶄綔錛屽悓鏃朵笉浼氭湁緙栬瘧渚濊禆鐨勬媴蹇冦備竴涓畝闄嬬殑浠g爜瑙佷笅錛?
class AClass: public AClassFactory {
public :
AClass() {}
void interface_1();
std:: string interface_2();
virtual ~ AClass();
}
class AClassFactory {
public :
virtual void interface_1() = 0 ;
virtual std::string interface_2() = 0 ;
virtual ~AClassFactory() { /* .. */ }
static std::tr1::shared_ptr < AClassFactory > Produce( /* .. */ )
{
// this factory function could be more complicated in practice..
return std::tr1::shared_ptr < AClassFactory > ( new AClass);
}
}
// AClassFactory could be used in this way..
std::tr1::shared_ptr < AClassFactory > pAClassObject;
pAClassObject = AClassFactory::Produce( /* .. */ );
// pAClassObject->..
Item 18 錛?鎺ュ彛搴旇瀹規槗琚紜嬌鐢紝涓嶆槗琚鐢?br>--------------------------------------------------
tag錛氭秷闄ゅ鎴風殑璧勬簮綆$悊璐d換 tr1::shared_ptr cross-DLL problem
鐢ㄦ埛浣跨敤鎺ュ彛鏃跺嵈娌℃湁鑾峰緱棰勬湡鐨勮涓猴紝榪欎釜浠g爜涓嶅簲璇ラ氳繃緙栬瘧銆?br>
鐢ㄩ敊鐨勫彲鑳芥湁錛?br> ·璋冪敤鎺ュ彛鏃惰緭鍏ヤ簡閿欒鐨勫弬鏁般?br> 濡?涓涓帴鍙楀勾銆佹湀銆佹棩涓哄弬鏁扮殑鎺ュ彛鍑芥暟錛岀敤鎴峰彲浠ヨ交鏄撶粰鍑哄悇縐嶉敊璇殑杈撳叆)錛?br> 瑙e喅鍔炴硶錛氱敤瀵硅薄鏉ョ害鏉熷弬鏁拌緭鍏ョ殑鑼冨洿(涓嶆帴鍙楃畝鍗曠殑鏁存暟浣滀負杈撳叆錛岃屾槸Date銆丮on銆乊ear瀵硅薄)
struct Day{ explicit Day(int d):val(d){} int val;}
class Month{
public:
static Month May(){ return Month(5); }
private:
explicit Month(int m);
}
Date d(Month::Mar(),Day(20),Year(1995));
·鐢ㄥ父瑙勭殑鐢ㄦ硶璋冪敤“鐗瑰埆”璁捐鐨勬帴鍙c傛墍浠ラ渶瑕佸敖鍙兘鐨勬妸鑷繁鐨勮璁″線甯歌涓婇潬錛氭暟鎹璞$殑琛屼負瑕佸敖鍙兘絎﹀悎鍐呭緩瀵硅薄(姣斿int)鐨勮涓猴紱鎺ュ彛鐨勫悕瀛楀拰鎰忎箟瑕佸敖鍙兘涓鑷?姣斿STL涓殑瀹瑰櫒鍩烘湰閮芥湁涓涓彨鍋歴ize鐨勮繑鍥炲鍣ㄥぇ灝忕殑鎺ュ彛)……榪欐牱鍋氶紦鍔辯敤鎴峰幓姝g‘鐨勭湅寰呭拰浣跨敤浣犵殑鎺ュ彛銆?
·蹇樹簡澶勭悊璋冪敤鎺ュ彛鍚庣殑閬楃暀闂銆傚洜姝や笉瑕佽鐢ㄦ埛鍘?#8220;璁板緱”鍋氫竴浜涗簨鎯呫?br> 濡傝璁′竴涓帴鍙h繑鍥炰竴涓寚鍚戞煇鏂板緩瀵硅薄鐨勬寚閽堬紝璇ユ帴鍙g殑鐢ㄦ埛闇瑕?#8220;璁板緱”鍘婚噴鏀捐繖涓寚閽堟墍鎸囩殑瀵硅薄錛氬鏋滅敤鎴峰繕浜嗛噴鏀炬垨閲婃斁浜嗗ソ鍑犳錛屽悗鏋滃氨鏄疈#錕?
瑙e喅鐨勫姙娉曚箣涓鏄璇ユ帴鍙h繑鍥炰竴涓櫤鑳芥寚閽?鍡?#8230;…鍗拌薄妯$硦浜嗭紵鍘葷湅Item14)錛岃繖鏍風敤鎴風敤瀹屼簡灝卞彲浠?#8220;蹇樿”榪欎釜鎸囬拡錛氬畠鑷繁浼氬鐞嗗悗浜嬨?
·鎵璋撶殑“璺―LL闂”(cross DLL problem)錛氬湪涓涓狣LL涓璶ew涓涓璞★紝鐒跺悗瀵硅薄琚紶鍒板彟澶栦竴涓狣LL閲岃delete銆傚ぇ甯堟帹鑽愮敤shared_ptr鍥犱負瀹冭В鍐充簡榪欎釜闂銆?
浠d環錛氶澶栧璞$殑鍒涘緩鍜岄攢姣侀渶瑕佹椂闂寸┖闂淬傛瘮濡俠oost鐨剆hared_ptr灝辨槸鏅氭寚閽堢殑涓ゅ嶅ぇ灝忥紝榪樻湁棰濆鐨勫璞℃搷浣滄椂闂?榪囩▼鍔ㄦ佸唴瀛樺垎閰嶇瓑銆?br> 瀹為檯涓婃湁浜涘簳灞備唬鐮佹牴鏈病榪欎釜璧勬湰鎻愪緵榪欐牱鐨?#8220;璞崕瑁呭”錛屼笉榪囨湁榪欐牱鐨勬濇兂榪樻槸寰堥噸瑕丏……
Item 19 錛氳璁lass鐘瑰璁捐type
----------------------------------------
tag錛歝lass design
·灝忓績璁捐綾葷殑鍒涘緩鍜岄攢姣佹柟寮忋傛瘮濡傝Item8鍜孖tem16
·璁ょ湡鑰冭檻濡備綍鍖哄垎綾葷殑鏋勯犲嚱鏁板拰璧嬪鹼紙assignment錛夋搷浣滅銆傚嵆鍒濆鍖栦笌璧嬪肩殑宸埆銆?br> ·娉ㄦ剰瀹炵幇綾葷殑浼犲?passed by value)銆傝繖涓疄闄呬笂鏄湪璇磋娉ㄦ剰鎷瘋礉鏋勯犲嚱鏁扮殑瀹炵幇銆?
·鍒囧嬁蹇界暐綾誨闈炴硶杈撳叆鐨勫鐞嗐傚叾瀹炴槸瑕佹敞鎰忓悇縐嶅嚭閿欐儏鍐碉紝鏄惁闇瑕佹姏鍑哄紓甯鎬互鍙婂浣曞疄鐜板紓甯稿鐞嗐?
·闇瑕佸瑙嗙被鎵鍦ㄧ殑緇ф壙浣撶郴銆?br> 濡傛灉璇ョ被鏈夌埗綾伙紝閭d箞蹇呭畾瑕佸彈鍒扮埗綾葷殑涓浜涢檺鍒訛紝鐗瑰埆鏄嚱鏁版槸鍚︿負铏氭瀯錛涘鏋滆綾繪湁瀛愮被錛岄偅涔堝氨瑕佽冭檻鏄笉鏄竴浜涘嚱鏁伴渶瑕佸畾涔変負铏氬嚱鏁幫紝姣斿璇存瀽鏋勫嚱鏁般?
·璋ㄦ厧瀹炵幇綾誨璞′笌鍏朵粬綾誨瀷瀵硅薄鐨勮漿鎹€傝繖涓鐐圭◢鏈変簺澶嶆潅錛氬鏋滄湁灝員1杞崲涓篢2鐨勯渶姹傦紝灝辨湁闅愬紡杞崲鍜屾樉寮忚漿鎹袱縐嶆柟寮忋?br> 瀵逛簬鍓嶈咃紝鍙互緙栧啓涓涓?闅愬紡鐨?杞崲鍑芥暟(鍙傝僆tem15閲岄潰鐨勯殣寮忚漿鎹㈠挴锝?錛屾垨鑰呮槸閫氳繃棰濆緙栧啓涓涓猅2鐨勬瀯閫犲嚱鏁版潵瀹炵幇T1鍚慣2鐨勮漿鎹€?br> 瀵逛簬鍚庤咃紝Scott璇村啓涓涓?鏄懼紡鐨?杞崲鍑芥暟灝卞彲浠ヤ簡銆?鍚屾牱錛屽湪Item15閲屼篃鏈夋樉寮忚漿鎹㈠嚱鏁扮殑渚嬪瓙)
·闇瑕佽冭檻璇ョ被闇瑕佸弬涓庡摢浜涜繍綆椼傚緢鏄庢樉錛屽鏋滈渶瑕佸弬涓嶢榪愮畻灝辮鐩稿簲瀹氫箟綾葷殑A榪愮畻絎﹀嚱鏁般傚ぇ甯堝湪榪欓噷鎻愮殑鍙﹀涓鐐規槸錛岃繖浜涜繍綆楃鍙峰嚱鏁版湁浜涘簲璇ユ槸鎴愬憳鍑芥暟錛屾湁浜涗笉搴旇銆傚師鍥犲湪Item23銆?4銆?6銆?55鎴戣繕娌$湅鍒幫紝鐣欑┖銆?
·涓嶈鎻愪緵涓嶅簲璇ユ毚闇茬殑鏍囧噯鍑芥暟銆傝繖閲岀殑鏍囧噯鍑芥暟鎸囩殑鏄瀯閫?鏋愭瀯/鎷瘋礉絳夌瓑鍙兘鐢辯紪璇戝櫒“鑷効”涓轟綘鐢熸垚鐨勫嚱鏁幫紝濡傛灉涓嶅笇鏈涘畠浠腑鐨勪竴浜涜澶栫晫璋冪敤錛屽氨澹版槑涓虹鏈?private)銆傛病鍗拌薄浜嗭紵闄嶇駭鍒癐tem6閲嶆柊瀛︿範锝?
·娉ㄦ剰璁捐綾繪垚鍛樼殑璁塊棶鏉冮檺銆傚叕鏈?public)銆佷繚鎶?protected)銆佺鏈?private)搴旇鐢ㄥ摢涓縐嶏紵鏈夋病鏈夐渶瑕佸畾涔夊弸鍏冿紵鎴栬呮槸騫茶剢鏉ヤ竴涓被涓被錛熼兘闇瑕佽冭檻銆?br> ·璁ょ湡瀹℃煡綾葷殑闅愭ч檺鍒躲傛ц兘涓婄殑瑕佹眰銆佷嬌鐢ㄨ祫婧愮殑闄愬埗鎴栨槸鍑洪敊鏃剁殑澶勭悊閮芥湁鍙兘褰卞搷鍒扮被鐨勫叿浣撹璁″拰瀹炵幇銆?
·璋ㄦ厧鑰冭檻綾葷殑閫傜敤鑼冨洿銆備篃灝辨槸璇村鏋滄煇涓璁′細鍙兘鐢ㄥ湪寰堝鏂歸潰錛岄傜敤浜庤澶氫笉鍚岀殑瀹為檯瀵硅薄銆備篃璁歌繖涓椂鍊欎綘闇瑕佽璁$殑涓嶆槸涓涓被錛岃屾槸涓涓被妯℃澘銆?
鏈鍚庝竴鐐瑰叾瀹炲簲璇ユ斁鍦ㄧ涓浣嶏細浣犵湡鐨勯渶瑕佸畾涔変竴涓被鍚楋紵濡傛灉浠呬粎鏄湪緇ф壙鏌愮被鐨勫熀紜涓婂姞涓涓や釜鎴愬憳錛屾槸涓嶆槸闈炴垚鍛樺嚱鏁版垨妯℃澘灝卞凡緇忓浜嗘崗錛?
絎?9鎷涘叾瀹炴洿鍍忔槸涓猚heck list錛屽湪鍑嗗鍔ㄦ墜璁捐涔嬪墠錛屼竴涓姣斿鎵撳嬀鍒掑弶錛屽簲璇ュ彲浠ユ彁鍓嶉伩鍏嶅緢澶氫漢闂存儴鍓?#8230;…
Item 20 錛?鐢?浼燾onst寮曠敤 鏇挎崲 浼犲?br>-------------------------------------------
tag錛?const寮曠敤 鍊間紶閫?br>
C++浼犻掑璞$殑鏃跺欓粯璁ゆ槸浼犲肩殑(pass-by-value)錛岃岃繖鏍風殑浼犻掕嚜鐒舵槸鏄傝吹鐨勶細榪欏綋涓寘鍚簡涓存椂瀵硅薄鐨勬瀯閫?鏋愭瀯錛屼互鍙婁復鏃跺璞′腑鐨勫璞$殑鏋勯?鏋愭瀯錛岃繍姘旇儗鐐硅繕鍙兘鏈夊璞′腑鐨勫璞′腑鐨勫璞$殑鏋勯?鏋愭瀯……(鏈夊ソ鐨勪笉瀛︼紝鍘誨C@#錕?)
·鐩稿浜庝紶“鍊?#8221;錛屼竴涓洿濂界殑鏇夸唬鏂規硶鏄紶“const寮曠敤”(pass-by-reference-to-const)銆?br> ·浼犲間笌浼犳寚閽堢殑涓涓尯鍒槸錛岄氳繃浼犲間紶閫掔殑瀵硅薄騫朵笉鏄師鏉ョ殑瀵硅薄錛岃屾槸涓涓鍒跺搧錛屾墍浠ラ殢渚夸綘鎵撳畠楠傚畠錛岀湡韜兘涓嶄細鍙楀埌褰卞搷銆?br> ·鑰岄氳繃浼犳寚閽堢殑瀵硅薄鍜屽師鏉ョ殑瀵硅薄灝辨槸鍚屼竴瀹朵紮錛屾敼鍔ㄤ竴涓彟澶栦竴涓篃鍙楀埌鐩稿悓鐨勫獎鍝嶃傝岃繖鏈夋椂鍊欏茍涓嶆槸鎴戜滑鎯寵鐨勭粨鏋溿?br> ·鑰冭檻鍒頒紶鍊間唬浠峰お楂橈紝浼?#8220;const寮曠敤”灝辨垚浜嗕竴涓緢濂界殑鏇夸唬鍝併?
·浼?#8220;const寮曠敤”鐨勫彟澶栦竴涓ソ澶勫湪浜庨伩鍏嶄簡“鍓ョ毊闂”(slicing problem錛屼警鎹峰ぇ甯堢殑鐗堟湰鏄?#8220;瀵硅薄鍒囧壊闂”錛屾垜鐢ㄨ繖涓腑鏂囧悕瀛楁槸涓轟簡鏇村鏄撹浣?))
鐢ㄤ紶鍊兼柟寮忎紶鍙傜殑鍑芥暟錛屽鏋滄煇鍙傛暟鐨勭被鍨嬫槸涓涓埗綾誨璞★紝鑰屽疄闄呬紶閫掔殑鍙傛暟鏄竴涓瓙綾誨璞★紝鍙湁璇ュ璞$殑鐖剁被閮ㄥ垎浼氳鏋勯犲茍浼犻掑埌鍑芥暟涓紝瀛愮被閮ㄥ垎鐨勬垚鍛橈紝浣滀負鐖剁被瀵硅薄鐨?#8220;鐨?#8221;錛屽氨琚娣嬫穻鐨勫墺鎺変簡……
鑰屽鏋滅敤浼?#8220;const寮曠敤”鏂瑰紡錛屽氨娌℃湁榪欑鎯ㄦ棤浜洪亾鐨勭姸鍐碉細鏈潵鐖剁被鐨勬寚閽堝氨鍙互鐢ㄦ潵鎸囧悜涓涓瓙綾誨璞★紝澶╃粡鍦頒箟銆?
渚嬪錛氬浜庡唴緗被鍨?bulit-in type)瀵硅薄浠ュ強STL涓殑榪唬鍣ㄣ佸嚱鏁板璞★紝Scott榪樻槸寤鴻浣跨敤浼犲兼柟寮忎紶閫掞紝鍘熷洜鏄粬浠湰鏉ュ氨鏄璁捐鎴愰傚悎浼犲間紶閫掔殑銆?br> (涓漢瑙傜偣錛氬ぇ甯堣錛?#8220;……it's not unreasonable to choose pass-by-value銆?#8221;錛屾敞鎰忚繖閲屾湁鍙ユ綔鍙拌瘝錛氬叾瀹炲浠ヤ笂綾誨瀷鐢ㄤ紶“const寮曠敤”鏂瑰紡浼犻掍篃鏄彲浠ョ殑銆?
濡傛灉浣犺涓轟笂闈袱縐嶆儏鍐靛彲浠ョ敤浼犲間紶閫掓槸鍥犱負瀹冧滑錛屾瘮濡傝鍐呯疆綾誨瀷瀵硅薄錛岀殑澶у皬鏈潵灝卞皬錛岃繘鑰屽緱鍑哄皬鏁版嵁綾誨瀷灝卞彲浠ョ敤浼犲間紶閫掞紝灝辨墦閿欑壒閿欎簡銆傚皬瀵硅薄鐨勬瀯閫?鏋愭瀯榪囩▼瀹屽叏鍙兘寰堟亹鎬栥?br> 鍐嶉涓姝ワ紝鍝曟煇涓被鍨嬪緢灝忥紝瀹冪殑鏋勯?鏋愭瀯鍑芥暟涔熺畝鍗曞埌鍙互蹇界暐涓嶈錛屾垜浠繕鏄笉鑳戒互姝ゆ柇瀹氬彲浠ョ敤浼犲間紶閫掕繖縐嶇被鍨嬬殑瀵硅薄錛氬洜涓虹紪璇戝櫒寰寰浼氬仛鍑轟竴浜涜牏浜嬨備功涓殑涓涓緥瀛愭槸錛屽浜庝竴浜涚紪璇戝櫒鍙互鎺ュ彈鎶婁竴涓猟ouble綾誨瀷瀵硅薄瀛樺叆瀵勫瓨鍣紝浣嗘槸濡傛灉浣犵粰瀹冧竴涓彧鏈変竴涓猟ouble鎴愬憳鐨勫璞′氦緇欏畠錛屽畠鍗存嫆緇濆皢璇ュ璞″瓨鍏ュ瘎瀛樺櫒銆?浠涔堜簨璁╃紪璇戝櫒鎻掍竴鎵嬶紝涓嶆槸闂涔熸湁浜嗛棶棰?#8230;…)
鏈鍚庤繕鏈変釜鐞嗙敱錛岃櫧鐒舵煇瀵硅薄鐜板湪寰堝皬錛屽彲鏄殢鐫紺句細鐨勫彂灞曚漢綾葷殑榪涙錛屾湁鍙兘涓ゅ勾鍚庡畠灝變細鍙樻垚涓涓簽鐒跺ぇ鐗╋紝鍒版椂鍊欑敤浼犲間篃浼氬彉寰椾笉鍚堥傘?
·闄や簡鍐呯疆綾誨瀷鍜孲TL鐨勮凱浠e櫒銆佸嚱鏁板璞″錛屽叾浠栫殑瀵硅薄浼犻掓椂錛岀敤浼?#8220;const寮曠敤”浠f浛浼犲煎惂銆?
Item 21錛?nbsp; 璇ユ崲鍥炲璞℃椂鍒繑鍥炲畠鐨剅eference
---------------------------------------------------
tag錛?nbsp;
濡傛灉涓涓嚱鏁板彲鑳借繑鍥炰竴涓鍘熸潵涓嶅瓨鍦ㄧ殑瀵硅薄鐨勫紩鐢紝閭d箞鍑芥暟灝辮鑷繁鍘誨垱寤鴻繖涓璞★細瑕佷箞鍦ㄦ爤涓?stack)瑕佷箞鍦ㄥ爢涓?heap)銆?/p>
絎竴縐嶆儏鍐典腑錛屽嚱鏁頒腑瀹氫箟浜嗗眬閮ㄥ璞★紝鐒跺悗榪斿洖瀵硅瀵硅薄鐨勫紩鐢ㄣ傚璞″湪鍑芥暟緇撴潫鍚庤嚜鍔ㄩ攢姣侊紝寮曠敤鎸囧悜鏃犳晥鐨勫湴鍧銆?/p>
絎簩縐嶆儏鍐碉紝鍑芥暟浣跨敤new鍔ㄦ佸垱寤轟簡涓涓璞★紝鐒跺悗榪斿洖瀵硅瀵硅薄鐨勫紩鐢ㄣ傜矖鐪嬫病鏈夐棶棰橈紝鍥犱負榪欎釜榪斿洖鐨勫紩鐢ㄨ繕鏄湁鏁堢殑銆?br> 浣嗘槸緇嗘兂灝變細鍙戠幇錛氭垜浠兘紜繚榪欎釜瀵硅薄琚紜殑鏀跺洖(delete)鍚楋紵
涔︿腑涓句簡涓涓緢濂界殑渚嬪瓙錛氫竴涓?榪愮畻絎﹀嚱鏁幫紝鎺ュ彈涓や釜涔樻硶榪愮畻鏁幫紝榪斿洖涓涓Н銆?br> 濡傛灉鍦ㄥ嚱鏁頒腑鍔ㄦ佸垱寤轟竴涓璞℃潵瀛樺偍涔樼Н錛屽茍榪斿洖瀵硅繖涓柊瀵硅薄鐨勫紩鐢紝閭d箞涓嬮潰鐨勮綆楀氨浼氬甫鏉ュ唴瀛樻硠婕忥細
Y=A*B*C
鍥犱負鍦ㄨ繖涓?#8220;榪炵畫”涔樻硶涓紝鏈変袱涓?#8220;涔樼Н瀵硅薄”琚垱寤猴紝浣嗘槸鎴戜滑涓㈠け浜嗙涓嬈′箻娉曞垱寤虹殑瀵硅薄鐨勬寚閽堛?br> 鎵浠ヨ繖鏍風殑鍋氭硶鏄笉濡ョ殑銆?
涔熻澶у笀鏈夎闂繃錛氶偅涔堝浜庣涓縐嶆儏鍐墊垜浠彲涓嶅彲浠ヨ繑鍥炰竴涓潤鎬?static)瀵硅薄鐨勫紩鐢紵涔︿腑鐢ㄤ簡鍚屾牱鐨勪緥瀛愭潵鍥炵瓟錛歂O銆?br> if (A*B == C*D) {//..}
濡傛灉榪斿洖闈欐佸璞$殑寮曠敤錛屼笂闈㈢殑鍒ゆ柇璇彞姘歌繙寰楀埌true鍊鹼紝鍥犱負“==”鍙蜂袱杈圭殑榪愮畻緇撴灉鏄寚鍚戝悓涓鍧楁暟鎹殑寮曠敤銆?
涓嶇煡閬撴槸涓嶆槸鍚庨潰鍙堟湁鍒ㄦ牴闂鐨勫鐢熻拷闂細閭f垜鑳戒笉鑳界敤涓涓潤鎬佸璞$殑鏁扮粍鏉ュ瓨鏀句笉鍚屾榪愮畻鐨勭粨鏋滐紵澶у笀鎳掑緱涓句緥瀛愪簡錛屾垜鐚滄兂涔熸病蹇呰錛氳繖鏍風殑鏂規甯︽潵鐨勫壇浣滅敤鍙婂叾寮閿鏈韓灝卞凡緇忓ぇ浜庡師鏉ヨ瑙e喅鐨勯棶棰樹簡鍚э紵
涓嶈灝濊瘯鍦ㄥ嚱鏁頒腑榪斿洖瀵瑰眬閮ㄥ璞?瀛樺偍浜庢爤)鐨勫紩鐢紝涔熶笉瑕佸鍔ㄦ佸垱寤虹殑瀵硅薄(瀛樺偍浜庡爢)鍋氬悓鏍風殑锠簨錛岃屽鏋滅湡鏈夋墦綆椼侀潪甯告復鏈涖佸崄鍒嗘兂瑕佽繑鍥炲闈欐佸璞$殑寮曠敤錛屽湪榪欎箞鍋氫箣鍓嶄篃瑕佽冭檻娓呮浼氫笉浼氭湁涓婇潰渚嬪瓙涓殑鎯呭喌鍑虹幇銆?br> 鑷沖皯錛岃繑鍥炲璞′笉浼氭湁涓婇潰鍒楀嚭鐨勭縐嶉敊璇嵄闄╋紝浠呬粎鏄湁鍙兘甯︽潵鍒涘緩棰濆瀵硅薄鐨勫紑閿鑰屽凡錛岃岃繖涓紑閿鐨勫彲鑳借繕鏈夊彲鑳借鎺掗櫎錛屽鏋滀綘鐢ㄧ殑緙栬瘧鍣ㄨ凍澶熻仾鏄庣殑璇濄?/p>
Item 22錛?nbsp; 灝嗘垚鍛樺彉閲忓0鏄庝負private
-----------------------------------------------------
濡傛灉鏁版嵁鎴愬憳閮芥槸縐佹湁鐨勶紝閭d箞璁塊棶榪欎簺鎴愬憳灝卞彧鑳介氳繃鍑芥暟榪涜銆備簬鏄敤鎴峰氨涓嶉渶瑕佽垂蹇冭冭檻鍒板簳瑕佺敤浠涔堟柟寮忓幓璁塊棶鏁版嵁鎴愬憳錛氬洜涓哄彧鏈夊畾涔変簡鐨勫嚱鏁板彲浠ョ敤銆?
閫氳繃瀹氫箟鏁版嵁鎴愬憳涓虹鏈夛紝鍙互瀹炵幇鍑芥暟鏉ヨ璁°佺害鏉熸垨紱佹瀵硅繖浜涙垚鍛樼殑鍚勭璁塊棶(璇?鍐欑瓑)銆傝屽鏋滃皢鍏惰涓哄叕鏈?public)錛屼綘灝嗘棤娉曞緱鐭ヤ綘鐨勬垚鍛樹細琚皝鏀瑰姩錛屼篃涓嶇煡閬撲細鏄庢牱鐨勬敼鍔ㄣ?
鑰屾洿閲嶈鐨勫ソ澶勬槸灝佽(encapsulation)錛氬彲浠ユ柟渚跨殑閫氳繃淇敼鍑芥暟鏉ユ敼鍙樻垚鍛樼殑璁塊棶鏂瑰紡錛涘湪鎴愬憳琚闂椂閫氱煡鍏朵粬瀵硅薄錛涘疄鐜板綰跨▼涓殑鍚屾絳夌瓑銆?br> 灝佽鐨勫ソ澶勭┒鍏舵湰璐紝鏄氳繃瀵圭敤鎴烽殣钘忔暟鎹垚鍛樻潵淇濊瘉綾昏涓虹殑涓鑷存?class invariant)銆傚洜涓烘帴鍙h鎴愬憳璁塊棶鍑芥暟闄愬埗浜嗭紝綾葷殑浣滆呬篃涓鴻嚜宸辨棩鍚庝慨鏀圭被鐨勫疄鐜扮暀浜嗗悗璺細濡傛灉鎵鏈夌殑鎴愬憳閮芥槸鍏湁鐨勶紝瀵逛換浣曚唬鐮佺殑淇敼閮芥湁鍙兘褰卞搷鍒板鐣岀殑浣跨敤銆?鍥犳Scott璇?#8220;Public means unencapsulated, and practically speaking, unencapsulated means unchangeable, especially for classes that are widely used.”)
閭d箞鍙笉鍙互澹版槑涓轟繚鎶?protected)鍛紵鍏跺疄閬撶悊鍜屽墠闈㈢殑鍏湁鏄竴鏍風殑銆傚叕鏈夌殑鎴愬憳瀵圭被鐨勫閮ㄥ畬鍏ㄥ紑鏀撅紝鑰屼繚鎶ょ殑鎴愬憳瀵圭被鐨勭戶鎵胯呭畬鍏ㄥ紑鏀俱傝繖涓氨鍍忎袱涓尯闂達細(-infinity, +infinity) 鍜?(0, +infinity)錛屼袱鑰呯殑澶у皬鏄竴鏍風殑銆?
浠庡垎瑁呯殑瑙掑害錛屽彧鏈変袱縐嶈闂駭鍒細縐佹湁錛屽強鍏朵粬銆?nbsp;
Item 23錛?nbsp; 鐢?non-member銆乶on-friend 鏇挎崲 member 鍑芥暟
------------------------------------------------------
浠庨潰鍚戝璞$殑瑙掑害鏉ョ湅錛岄潪鎴愬憳鍑芥暟鏇存湁鍒╀簬鏁版嵁鐨勫皝瑁呫?br>
涓涓暟鎹垚鍛樿瓚婂皯鐨勪唬鐮佽闂埌錛岃鎴愬憳鐨勫皝瑁呯▼搴﹀氨瓚婇珮銆傝秺灝戝嚱鏁板彲浠ョ洿鎺ヨ闂竴涓暟鎹垚鍛橈紝璇ユ垚鍛樼殑灝佽紼嬪害灝辮秺楂樸?br> 綾葷殑鏁版嵁鎴愬憳搴旇瀹氫箟涓虹鏈夈傚鏋滆繖涓墠鎻愭垚绔嬶紝閭d箞鑳藉璁塊棶涓涓暟鎹垚鍛樼殑鍑芥暟渚垮彧鑳芥槸璇ョ被鐨勬垚鍛樺嚱鏁幫紝鎴栨槸鍙嬪厓鍑芥暟銆?br> 浜庢槸涓轟簡鏇村ソ鐨勫皝瑁呮暟鎹紝鍦ㄥ彲浠ュ畬鎴愮浉鍚屽姛鑳界殑鍓嶆彁涓嬶紝搴旇浼樺厛鑰冭檻浣跨敤闈炴垚鍛樺茍涓旈潪鍙嬪厓鍑芥暟銆?br> 榪欓噷鐨?#8220;闈炴垚鍛樺茍涓旈潪鍙嬪厓鍑芥暟”鏄拡瀵規暟鎹垚鍛樻墍鍦ㄧ殑綾昏岃█鐨勶紝涔熷氨鏄榪欎釜鍑芥暟瀹屽叏鍙互鏄叾浠栫被鐨勬垚鍛橈紝鍙鏄笉鑳界洿鎺ヨ闂偅涓暟鎹垚鍛樺氨鍙互銆?
浠庣伒媧繪т笂鏉ヨ錛岄潪鎴愬憳鍑芥暟鏇村皯緙栬瘧渚濊禆(compilation dependency)錛屼篃灝辨洿鍒╀簬綾葷殑鎵╁睍銆?br> 渚嬶細涓涓被鍙兘鏈夊涓垚鍛樺嚱鏁幫紝鍙兘鏈変竴涓嚱鏁伴渶瑕丄.h錛屽彟澶栦竴涓嚱鏁拌鍖呭惈B.h錛岄偅涔堝湪緙栬瘧榪欎釜綾繪椂灝遍渶瑕佸悓鏃跺寘鍚獳.h鍜孊.h錛屼篃灝辨槸璇磋綾誨悓鏃朵緷璧栦袱涓ご鏂囦歡銆?br> 濡傛灉浣跨敤闈炴垚鍛樺嚱鏁幫紝榪欎釜鏃跺欏氨鍙互鎶婅繖浜涗緷璧栧叧緋諱笉鍚岀殑鍑芥暟鍒嗗埆鍐欏湪涓嶅悓鐨勫ご鏂囦歡涓紝鏈夊彲鑳借繖涓被鍦ㄧ紪璇戞椂灝變笉闇瑕佸啀渚濊禆A.h鎴栨槸B.h浜嗐?br> 鎶婅繖浜涢潪鎴愬憳鍑芥暟鍒嗘暎瀹氫箟鍦ㄤ笉鍚屽ご鏂囦歡涓殑鍚屾椂錛岄渶瑕佺敤namespace鍏抽敭瀛楁妸瀹冧滑鍜岄渶瑕佽闂殑綾繪斁鍦ㄤ竴璧楓?br> // code in class_a.h
namespace AllAboutClassA {
class ClassA { // ..};
// ..
}
// code in utility_1.h
// ..
namespace AllAboutClassA {
void WrapperFunction_1() { // ..};
// ..
}
// ..
// code in utility_2.h
// ..
namespace AllAboutClassA {
void WrapperFunction_2() { // ..};
// ..
}
// ..
榪欐牱涓鏉ワ紝铏界劧榪欎簺闈炴垚鍛樺拰綾諱笉“浣忓湪”涓涓ご鏂囦歡閲岋紝瀹冧滑鐨?#8220;蹇?#8221;榪樻槸鍦ㄤ竴璧風殑(鍦ㄥ悓涓涓悕瀛楃┖闂? namespace, 涓?銆?br>
濡傛灉鏈夐渶瑕佹坊鍔犳柊鐨勯潪鎴愬憳鍑芥暟錛屾垜浠鍋氱殑鍙槸鍦ㄧ浉鍚岀殑鍚嶅瓧絀洪棿涓畾涔夎繖浜涘嚱鏁板氨鍙互錛岄偅涓被涓濇涓嶄細琚獎鍝嶏紝涔熷嵆鎵璋撶殑鏄撴墿灞曟у惂銆?br> 瀵逛簬綾葷殑鐢ㄦ埛鏉ヨ錛岃繖鏍風殑瀹炵幇鏂瑰紡(鎸囩敤闈炴垚鍛樺嚱鏁?灝辨洿鍔犲悎鐞嗭細
鍥犱負浣滀負綾葷殑鐢ㄦ埛錛岄渶瑕佹墿灞曠被鐨勬椂鍊欏張涓嶈兘鍘諱慨鏀瑰埆浜虹殑綾?鐗堟潈錛熷畨鍏ㄦэ紵鎴栬呮牴鏈氨娌℃湁婧愮爜錛?錛屽氨綆楁槸閫氳繃緇ф壙璇ョ被鐨勬柟寮忎篃涓嶈兘璁塊棶鐖剁被鐨勭鏈夋暟鎹?
Item 24錛?nbsp; 鑻ユ墍鏈夊弬鏁扮殕闇綾誨瀷杞崲錛屼負姝ゅ嚱鏁伴噰鐢?non-member 鍑芥暟
------------------------------------------------------
tag: operator
鑻ラ渶瑕佷負鏌愪釜鍑芥暟鐨勬墍鏈夊弬鏁幫紙鍖呮嫭琚玹his鎸囬拡鎵鎸囩殑閭d釜闅愬柣鍙傛暟錛夎繘琛岀被鍨嬭漿鎹紝榪欎釜鍑芥暟搴旇璁句負 non-member.
---------------------
class Rational{
public:
Rational(int num = 0, int denominator = 1); //鏋勯犲嚱鏁板埢鎰忎笉涓?explicit; 鍏佽 int-to-Rational 闅愬紡杞崲
...
const Rational operator* (const Rational& rhs) const;
}
Rational oneHalf(1, 2);
result = oneHalf * 2; //right → result = oneHalf.operator*(2);
result = 2 * oneHalf; //wrong! → result = 2.operator*(oneHalf); → result = operator*(2, oneHalf);
---------------------
const Rational operator*(const Rational& lhs, const Rational& rhs){..} //non-member function.
鑻ュ嚱鏁頒笉璇ユ垚涓簃ember,涓嶄竴瀹氳鎴愪負friend.
Item 25錛?nbsp; 鑰冭檻鍐欏嚭涓涓笉鎶涘紓甯哥殑 swap 鍑芥暟
------------------------------------------------------
tag: 寮傚父澶勭悊
·褰?std::swap 瀵逛綘鐨勭被鍨嬫晥鐜囦笉楂樻椂錛屾彁渚涗竴涓?swap 鎴愬憳鍑芥暟錛屽茍紜畾鍑芥暟涓嶆姏鍑哄紓甯搞?br> ·濡傛灉浣犳彁渚涗竴涓?member swap錛屼篃璇ユ彁渚涗竴涓?non-member swap 鐢ㄦ潵璋冪敤鍓嶈咃紝
瀵逛簬 classes(闈?templates)錛岃鐗瑰寲 std::swap;
·璋冪敤 swap 鏃跺簲閽堝 std::swap 浣跨敤using 澹版槑寮忥紝鐒跺悗璋冪敤 swap 騫朵笉甯︿換浣?#8220;鍛藉悕絀洪棿璧勬牸淇グ”銆?br> ·涓?#8220;鐢ㄦ埛瀹氫箟綾誨瀷”榪涜std templates 鍏ㄧ壒鍖栨槸濂界殑錛屼絾鍗冧竾涓嶈灝濊瘯鍦?std 鍐呭姞鍏ユ煇浜涘 std 鑰岃█鍏ㄦ柊鐨勪笢瑗褲?br>
std::swap鐨勭己鐪佸疄鐜幫細鐢ㄤ簡涓涓腑闂翠復鏃跺璞★紝鐒跺悗涓や袱浜ゆ崲銆?br> 緙虹渷鐨勬柟娉曞緢綆鍗曪紝鑰屽湪涓浜涙儏鍐典笅鍗翠篃寰堣楄祫婧愶細姣斿闇瑕佷氦鎹㈢殑鏄竴涓緢澶嶆潅搴炲ぇ鐨勫璞℃椂錛屽垱寤?鎷瘋礉澶ч噺鏁版嵁浼氫嬌寰楄繖縐峴wap鐨勬晥鐜囨樉寰楅潪甯鎬綆涓嬨?br> --------------------------
鏇村姞閫傚簲鐨勫疄鐜版濊礬錛?/p>
鍦ㄧ被/妯℃澘綾?class/class template)涓畾涔変竴涓叕鏈夌殑swap鎴愬憳鍑芥暟錛岃繖涓嚱鏁拌礋璐e疄鐜扮湡姝g殑浜ゆ崲鎿嶄綔銆傚悓鏃訛紝榪欎釜鍑芥暟涓嶈兘鎶涘嚭寮傚父銆?br> 鐢ㄦ垚鍛樻槸鍥犱負浜ゆ崲鎿嶄綔涓彲鑳戒細闇瑕佽闂?浜ゆ崲綾葷殑縐佹湁鎴愬憳錛涚敤鍏湁(public)鏉ラ檺鍒舵槸涓轟簡緇欎笅闈㈢殑杈呭姪鍑芥暟(wrapper function)鎻愪緵鎺ュ彛銆?br> 鑷充簬涓嶈兘鎶涘嚭寮傚父錛屾湁涓や釜鍘熷洜錛?
涓鏄疘tem29涓墍鎻愬埌鐨勫紓甯稿畨鍏ㄦ?exception-safety)闇瑕佷笉鎶涘嚭寮傚父鐨剆wap鏉ユ彁渚涗繚闅?鏇村緇嗚妭灝卞埌鎷滆29鏉$殑鏃跺欏啀璁板綍鍚с?
浜屾槸涓鑸岃█楂樻晥鐨剆wap鍑芥暟鍑犱箮閮芥槸瀵瑰唴緗被鍨嬬殑浜ゆ崲錛岃屽鍐呯疆綾誨瀷鐨勬搷浣滄槸涓嶄細鎶涘嚭寮傚父鐨勩?
1. 濡傛灉闇瑕佷嬌鐢╯wap鐨勬槸涓涓被(鑰屼笉鏄ā鏉跨被)錛屽氨涓鴻繖涓被鍏ㄧ壒鍖杝td::swap錛岀劧鍚庡湪榪欎釜鐗瑰寲鐗堟湰涓皟鐢ㄧ涓姝ヤ腑瀹炵幇鐨剆wap鍑芥暟銆?br>
class AClass{
public :
void swap(AClass & theOtherA){
using std::swap; // 榪欎竴鍙ヤ細鍦ㄧ◢鍚庣殑絎?鐐規彁鍒?br> // 閫氳繃璋冪敤swap鏉ュ畬鎴愯綾葷殑鐗規湁浜ゆ崲鍔ㄤ綔
}
// ..
}
namespace std{
// 鍦╯td鍚嶅瓧鍩熷唴瀹氫箟涓涓叏鐗瑰寲鐨剆wap
template <> // 榪欐牱鐨勫畾涔夎鏄庢槸鍏ㄧ壒鍖?
void swap < AClass > ( AClass & a, AClass & b){
a.swap(b);
}
}
濡傛涓鏉ワ紝鐢ㄦ埛鍙互鐩存帴搴旂敤鍚屾牱鐨剆wap鍑芥暟榪涜浜ゆ崲鎿嶄綔錛岃屽綋浜ゆ崲瀵硅薄鏄渶瑕佺壒孌婂寰呯殑AClass瀵硅薄鏃訛紝涔熷彲浠ユ棤宸埆鐨勪嬌鐢ㄥ茍寰楀埌棰勬湡鐨勪氦鎹㈢粨鏋溿?
2. 濡傛灉鎴戜滑闇瑕佷氦鎹㈢殑鏄ā鏉跨被錛岄偅涔堝氨涓嶈兘鐢ㄥ叏鐗瑰寲std::swap鐨勬柟娉曚簡錛屽亸鐗瑰寲鐨剆td::swap涔熻涓嶉氾紝鍥犱負錛?br> C++涓笉鍏佽瀵瑰嚱鏁拌繘琛屽亸鐗瑰寲(鍙兘瀵圭被鍋忕壒鍖?錛屼篃 灝辨槸璇翠笉鑳藉啓鍑轟笅闈㈢殑紼嬪簭錛?br>
namespace std{
// illegal code as C++ doesn't allow partial specialization for function templates
template<typename T>
void swap< AClassTemplate<T> >(AClassTemplate<T>& a, AClassTemplate<T>& b)
{
a.swap(b);
}
}
std鍚嶅瓧絀洪棿涓殑鍐呭閮芥槸C++鏍囧噯濮斿憳浼氱殑鑰佸ぇ浠畾涔夌殑錛屼負浜嗕繚璇乻td鍐呴儴浠g爜鐨勬甯歌繍浣滐紝涓嶅厑璁稿線閲屽ご娣誨姞浠諱綍鏂扮殑妯℃澘銆佺被銆佹柟紼嬶紝閲嶈澆涔熶笉鍙互銆?br> 铏界劧鍙互鍍?.閭f牱鍐欏嚭鍏ㄧ壒鍖栫殑妯℃澘鍑芥暟錛屼絾鏄紒鍥懼湪std鐨勫悕瀛楃┖闂存坊鍔犱互涓嬮噸杞界殑swap(榪欑閲嶈澆鍙樼浉瀹炵幇浜嗗嚱鏁扮殑鍋忕壒鍖?(铏界劧浣犲彲浠ラ氳繃緙栬瘧錛屼絾鏄細鍩嬩笅闅愭偅)錛?br>
namespace std{
template <typename T>
void swap (AClass<T>& a, AClass<T>& b)
{ a.swap(b);}
}
緇欒嚜宸辯殑涓涓皬鎻愰啋錛氬洜涓哄嚱鏁板悕swap鍚庢病鏈?lt;>錛屾墍浠ヤ笉鏄亸鐗瑰寲錛岃屾槸瀵?br> namespace std{
template<class _Ty> inline
void swap(_Ty& _X, _Ty& _Y)
{/*..*/}
}
鐨勯噸杞借屽凡銆?/p>
鍩轟簬涓婇潰涓や釜鍘熷洜錛屼竴涓彉閫氱殑鏂規硶鏄湪璇ユā鏉跨被鎵鍦ㄧ殑鍚嶅瓧絀洪棿涓紪鍐欎竴涓?闈炴垚鍛樼殑鍑芥暟妯℃澘鏉ヨ皟鐢ㄨ繖涓叕鏈夌殑鎺ュ彛錛?br>
namespace AClassSpace{
template <typename T>
void swap (AClass<T>& a, AClass<T>& b)
{ a.swap(b);}
}
鍦ㄩ檺瀹氱殑鍚嶅瓧絀洪棿涓疄鐜板嚱鏁幫紝鏄負浜嗛伩鍏?#8220;姹℃煋”鍏ㄥ眬鐨勫悕瀛楃┖闂淬傝屼笖錛屼笉鍚岀殑鍚嶅瓧絀洪棿閮藉彲浠ヤ嬌鐢ㄤ竴鏍風殑鍑芥暟鍚嶅瓧鑰屼笉浼氭湁鍐茬獊銆?br> 鍩轟簬鍓嶉潰絎?3璇炬墍瀛︼紝浣跨敤闈炴垚鍛樺嚱鏁頒篃鏄簲璇ョ殑浜嗐?br> 鑷充簬涓轟粈涔堣鍑芥暟妯℃澘錛岄偅灝卞尓甯窪綆鍗曪細鍥犱負瑕佷氦鎹㈢殑鏄ā鏉緻#錕?
pimpl涔熷嵆pointer to implementation,褰撻渶瑕佷氦鎹袱涓鏉備笖鑷冭偪鐨勫璞℃椂錛屽彲浠ュ厛鐢ㄤ袱涓寚閽堝垎鍒寚鍚戠潃涓や釜瀵硅薄
涔嬪悗瀵硅繖浜涘璞$殑鎿嶄綔錛屽寘鎷氦鎹紝灝卞彧闇瑕侀氳繃榪欎袱涓寚閽堟潵榪涜(浜ゆ崲涓や釜鎸囬拡鐨勫間究瀹炵幇浜嗗璞$殑浜ゆ崲)銆?/p>
Item 13 錛氫互瀵硅薄綆$悊璧勬簮
---------------------------------------
tag錛歛uto_ptr shared_ptr RAII RSCP 鏅鴻兘鎸囬拡
瑕佸埄鐢ㄥ璞℃潵綆$悊璧勬簮錛堝彲浠ユ槸鍒嗛厤鍑烘潵鐨勫唴瀛樸佷簰鏂ラ噺絳夛級銆傝繖鏍峰彲浠ラ伩鍏嶅洜涓哄啓浠g爜鏃剁殑鐤忓拷鑰屽鑷寸殑璧勬簮嫻佸け錛堝彲浠ユ槸鍐呭瓨鐨勬硠婕忥紝涔熷彲鑳芥槸蹇樹簡瑙i攣錛夈?/p>
灝嗛噴鏀捐祫婧愮殑浠g爜鏀懼湪瀵硅薄鐨勬瀽鏋勫嚱鏁頒腑錛屽彧瑕佸璞¤鏋愭瀯錛屽氨鍙互淇濊瘉璧勬簮琚畬鏁撮噴鏀俱?
C++鐨勬瀽鏋勫嚱鏁拌嚜鍔ㄨ皟鐢ㄦ満鍒?C++’s automatic destructor invocation)鑳藉淇濊瘉褰撳璞¤劚紱繪帶鍒舵椂璇ュ璞$殑鏋愭瀯鍑芥暟琚皟鐢紙姣斿涓涓璞″湪鏌愬嚱鏁板唴閮ㄥ畾涔夛紝閭d箞鍦ㄥ嚱鏁版墽琛岀粨鏉熷悗錛岃繖涓璞$殑鏋愭瀯鍑芥暟浼氳鑷姩璋冪敤浠ラ攢姣佹瀵硅薄錛夈?
鏄釜濂藉姙娉曪紝鑷沖皯瀵規垜榪欐牱鏃跺父涓笁钀藉洓鐨勪漢鏉ヨ鏄釜紱忛煶銆備綍鍐佃繖鏍風殑瀵硅薄澶у鏁版儏鍐典笅涓嶇敤鑷繁鍐欙紝auto_ptr錛堟櫤鑳芥寚閽? smart pointer鐨勪竴縐嶏級灝卞彲浠ヨ儨浠匯?
std::auto_ptr<void *> pMem(AllocAndInitMemory());
楂樹寒鐨勯儴鍒嗗嵆璇存槑浜哸uto_ptr鐨勭敤娉曪紝涔熼檮甯︾ず鑼冧簡鎵璋撶殑RAII(Resource Acquisition Is Initialization)璧勬簮鍙栧緱鏃舵満渚挎槸鍒濆鍖栨椂鏈熴?br>
榪欓噷鐨刟uto_ptr灝卞儚鏄釜闄コ鍙嬮涜鐨勫彲鎬滃浼欙紝濂蟲湅鍙嬶紙鐢ㄦ埛錛夎瑕佷粈涔堬紝auto_ptr灝變箹涔栫殑鍘諱拱鏉ワ紙鐢寵錛夛紝鎯寵鐢ㄧ殑鏃跺欏氨璧剁揣鎷垮嚭鏉ョ粰濂沖弸鐢紝鍝曞ス蹇樹簡鏇劇粡涔頒簡鏌愪歡琛f湇錛宎uto_ptr榪樻槸浼氳佽佸疄瀹炲湴閫佸洖瀹墮噷錛屼笉鐢ㄦ媴蹇冧細寮勪涪鎴栨槸鎼炶剰銆傚棷錛屾湁鐐瑰仛涓婂笣鐨勬劅瑙夊惂錛?
涓嶈繃錛屾病鏈変粈涔堟槸鍗佸叏鍗佺編鐨勩傚ぇ甯堥┈涓婂氨璇村埌浜嗙敤瀵硅薄綆$悊璧勬簮鐨勯棶棰橈紝濂藉惂錛屽簲璇ヨ鏄渶瑕佹敞鎰忕殑鍦版柟錛?br> 棣栧厛涓嶈兘鐢ㄤ竴涓互涓婄殑瀵硅薄錛屾瘮濡傝auto_ptr錛岀鐞嗗悓涓涓祫婧愩傝繖涓緢濂界悊瑙o紝灝卞儚涓涓紓浜殑濂沖瀛愯剼韙忓鏉¤埞錛堝悓鏃跺畾涔変簡澶氫釜auto_ptr錛夛紝浣嗘槸濂瑰繀欏昏灝忓績錛屼笉鑳借澶氫釜瀵硅薄鍙傚姞鍚屼竴涓害浼氾細浠婂ぉ閫涜鐨勬椂鍊欏枈涓婁簡灝忓紶灝變笉鑳藉彨灝忕帇錛屾槑澶╀竴璧峰悆楗鏋滅害浜嗗皬鏉庡氨鍒啀鍜屽皬璧靛畾鏃墮棿錛氫竴涓祫婧愪竴嬈″彧鑳借涓涓璞℃潵綆$悊銆?br> 榪欐牱鐨勮鍒欑敤鍦╝uto_ptr涓婂氨鏄功涓鎬殑“=”琛屼負錛氫袱涓猘uto_ptr瀵硅薄A鍜孊錛孉=B榪愮畻鐨勭粨鏋滄槸A鎺ョ浜咮綆$悊鐨勮祫婧愶紝B鎸囧悜鐨勬槸null銆傦紙濡傛灉璁頒笉璧鋒潵浜嗭紝鍏蜂綋浠g爜瑙佷功錛夎繖鏍風殑琛屼負寰堝儚鏄紶閫掞細灝忔潕闄コ鏈嬪弸閫涘畬琛楀悗錛岄佸ス鍒頒漢姘戝箍鍦猴紝鍦ㄩ偅閲屽皬闄堢害濂戒簡鍜屽ス涓璧風湅鐢靛獎銆傚埌浜嗕漢姘戝箍鍦轟箣鍚庡皬闄堟悅鐫濂充漢寮蹇冪殑璧頒簡錛屽彧鍓╀笅灝忔潕涓涓鍗曠殑鑳屽獎錛屾澂鍏峰晩鏉叿……
涓轟簡閬垮紑榪欑灝村艾涓旀瀬鏄撹璇В鐨?#8220;=”鎿嶄綔錛屽嚭鐜頒簡浠hared_ptr涓轟唬琛ㄧ殑reference-counting smart pointer(RCSP)錛堝紩鐢ㄨ鏁板瀷鏅鴻兘鎸囬拡錛燂級銆傚畠浠彲浠?#8220;鍏變簨涓澶?#8221;錛岀敱涓涓叕鐢ㄧ殑reference counter鏉ヨ鏁幫紝鏌愪釜shared_ptr鍦ㄥ噯澶囨姏寮冧竴涓祫婧愭椂鍏堝弬鑰價eference counter鐨勫鹼紝濡傛灉闈為浂錛岃鏄庤繕鏈夊叾浠栫殑“濮愬”鍦ㄧ僵鐫璧勬簮錛屼笉闇瑕佷篃涓嶅彲浠ラ噴鏀捐璧勬簮錛涘鏋滃間負闆訛紝璇存槑褰撳墠鍙湁濂逛竴涓漢浜嗭紝浜庢槸鐪熸鐨勬媴褰撹搗smart pointer鐨勮矗浠伙細閲婃斁璧勬簮銆?
std::shared_ptr<void *> pMem(AllocAndInitMemory());
閲嶇偣涓嶅湪浜庢槸鐢╝uto_ptr榪樻槸shared_ptr榪樻槸鍏朵粬鐨勪粈涔堜笢涓滐紝鑰屾槸瑕侀浼氱簿紲炩斺斾嬌鐢ㄥ璞℃潵綆$悊璧勬簮銆傛瘮濡傝鐢╯tring瀵硅薄鏉ョ鐞嗕竴涓瓧絎︿覆鑰屼笉鏄墜宸ョ敵璇蜂竴鐗囧唴瀛樼劧鍚庣敤涓寚閽?#8220;鍚у敡”綺樹笂鍘誨氨寮濮嬬敤浜嗐?
涓嶈兘鍐嶅姩鎬佸垎閰嶈屽緱鐨?array 涓婁嬌鐢?auto_ptr 鎴?tr1::shared_ptr錛屽洜涓轟袱鑰呭湪鏋愭瀯鐨勬椂鍊欒皟鐢ㄧ殑鏄痙elete鑰屼笉鏄痙elete[].
瑕佹嫢鏈夐拡瀵規暟緇勮岃璁$殑錛屽彲鐢?boost::scoped_array 鍜?boost::shared_array classes.
Item 14: 鍦ㄧ鐞嗙被涓皬蹇?coping 琛屼負
--------------------------------------------
tag錛?RAII
RAII瀹堝垯錛氳祫婧愬湪鏋勯犳湡闂磋幏寰楋紝鍦ㄦ瀽鏋勬湡闂撮噴鏀俱?br>
RAII瀵硅薄琚鍒訛細
·涓嶅厑璁告嫹璐濄傚綋璧勬簮鏈韓涓嶈兘澶嶅埗鏃訛紝瀵硅薄鍙互璇?#8220;涓?#8221;銆傛庝箞鍋氾紵鍥炲埌Item6……
·浣跨敤Reference-Count錛堝紩鐢ㄨ鏁幫級錛屽彲浠ョ敤涓婅妭璇村埌鐨剆hared_ptr鏉ュ共榪欎釜浜嬶紝榪欓噷欏哄甫浠嬬粛浜唖hared_ptr鎻愪緵鐨勪竴涓帴鍙o細涓涓彲浠ュ湪鏋勯犲璞℃椂瀹氫箟鐨刣elete鎿嶄綔錛氬鏋滃璞℃槸鍐呭瓨灝辨槸閲婃斁錛屽鏋滃璞℃槸閿佸氨鏄В閿併?
·鐩存帴澶嶅埗銆傚埆浜烘湁浠涔堬紝浣犲氨鐩存帴鍘熷皝涓嶅姩涔熷鍒朵竴浠姐傚鏋滄槸鍐呭瓨鐨勮瘽璇村緱榪囧幓錛屽鏋滄槸閿侊紝鎴戞兂榪樻槸涓嶈兘榪欐牱涔辯敤鍝堛?
·縐諱氦鎵鏈夋潈銆傝繖涓笉綆楁槸鐪熸鎰忎箟鐨勫鍒訛紝縐諱氦鎵嬬畫鑰屽凡銆傛渶鍏稿瀷鐨勪緥瀛愬氨鏄痑uto_ptr鐨勫鍒惰涓恒?
Item 15錛?鍦ㄨ祫婧愮鐞嗙被涓彁渚涘鍘熷璧勬簮鐨勮闂?br>-------------------------------------------------
tag錛氳繑鍥炲師濮嬭祫婧?br>
·鍦ㄤ嬌鐢ㄥ璞$鐞嗚祫婧愮殑鍚屾椂涔熻鐣欏嚭鎺ュ彛緇欓偅浜涢渶瑕佺粫榪囧璞¤岀洿鎺ヨ闂祫婧愮殑浜恒?br>
鍐欎釜鍑芥暟鏆撮湶鍑烘寚鍚戣祫婧愮殑鎸囬拡灝卞彲浠ャ備功閲岃寰楁洿澶氱殑鏄敤鎬庢牱鐨勫嚱鏁幫細
鏄懼紡杞崲(explicit conversion)
鍙互瀹炵幇涓涓猤et鍑芥暟錛屾垨鏄?銆?>榪愮畻錛岃繑鍥炴寚鍚戣祫婧愮殑鎸囬拡銆?br>
闅愬紡鐨勮漿鎹㈠嚱鏁?implicit conversion)錛?br>
浣嗘槸涓漢瑙夊緱瀹為檯宸ヤ綔涓簲璇ユ槸涓嶆彁鍊¤繖鏍峰仛鐨勶紝鍥犱負闅愬紡鐨勮漿鎹㈡瀬鏈夊彲鑳藉彂鐢熷湪緙栫▼鑰呮病鏈夋剰璇嗙殑鎯呭喌涓嬶紝瀵艱嚧鍚庨潰鐨勪唬鐮佸嚭閿欍?br>
class Font {
public:
// ..
// implicit conversion function
operator FontHandle() const { return f; }
// ..
};
涓婇潰浠g爜鐨勫簲鐢ㄥ涓嬶紝f鏈韓涓篎ont綾誨瀷錛?changeFontSize絎竴涓弬鏁頒負FontHandle)錛屼絾鏄敱浜庨殣寮忚漿鎹紝綾誨瀷鍙樻垚浜咶ontHandle銆?br>
Font f(getFont());
int newFontSize;
//..
// implicitly convert Font to FontHandle
changeFontSize(f, newFontSize);
涓轟簡鑳藉吋瀹規洿澶氱殑API錛岄渶瑕佺暀鍑烘帴鍙f彁渚涘璧勬簮鐨勭洿鎺ヨ闂?
闅愬紡鎴栨樉紺轟富瑕佸彇鍐充簬RAII class 琚璁℃墽琛岀殑鐗瑰畾宸ヤ綔錛屼互鍙婂畠琚嬌鐢ㄧ殑鐘跺喌銆?br>
Item 16 錛?鎴愬浣跨敤new鍜?delete鏃墮噰鐢ㄧ浉鍚屽艦寮?br>---------------------------------------------------
tag錛?nbsp; new delete
·鐢╪ew鍒嗛厤涓涓唴瀛樺璞℃椂錛岃娉曟牸寮忔槸new a;鐢╠elete閲婃斁涓涓唴瀛樺璞℃椂錛岃娉曟牸寮忔槸delete a;
·鐢╪ew鍒嗛厤涓緇勫唴瀛樺璞℃椂錛岃娉曟牸寮忔槸new a [num_of_elem]; 鐢╠elete閲婃斁涓緇勫唴瀛樺璞℃椂錛岃娉曟牸寮忔槸delete [] a;
new鎴栨槸delete鍖呭惈浜嗕袱涓樁孌碉細
new錛氱敵璇峰茍鍒嗛厤鍐呭瓨絀洪棿錛涜皟鐢ㄦ瀯閫犲嚱鏁版瀯閫犲嵆灝嗕嬌鐢ㄧ┖闂寸殑瀵硅薄
delete錛氳皟鐢ㄦ瀽鏋勫嚱鏁版瀽鏋勪嬌鐢ㄧ┖闂寸殑瀵硅薄錛涢噴鏀懼唴瀛?
鍒嗛厤鍐呭瓨緇欎竴緇勫璞$殑鏃跺欙紝緙栬瘧鍣ㄤ竴鑸細鍦ㄨ繖涓鐗囧唴瀛樺墠绔?鎴栨槸鍏朵粬浠涔堝湴鏂?鎻掑叆涓灝忔淇℃伅錛岀敤鏉ユ爣鏄庤繖鐗囧唴瀛樻槸緇欏灝戜釜瀵硅薄鐨勶紝鐒跺悗鍙嶅璋冪敤鏋勯犲嚱鏁版潵鍒涘緩榪欎竴緇勫璞°傚綋鐢╠elete []鐨勬椂鍊欙紝閲婃斁鍐呭瓨鐨勬搷浣滃氨浼氫互璇ヤ俊鎭負渚濇嵁錛屽弽澶嶈皟鐢ㄥ璞$殑鏋愭瀯鍑芥暟瀵硅繖緇勫璞¤繘琛岄噴鏀俱?涓嬮潰鐨刐n]灝辨槸榪欐淇℃伅)
[n][MEM]
鑰屽鏋滃彧鏄垎閰嶅唴瀛樼粰涓涓璞★紝榪欐淇℃伅灝變笉瀛樺湪浜嗐傜洿鎺ュ湪榪欑墖鍐呭瓨涓婂簲鐢ㄦ瀽鏋勫嚱鏁般?br>
浜庢槸鐢╠elete []鍘婚噴鏀緉ew鐨勫唴瀛橈紝鎴栨槸鐢╠elete鍘婚噴鏀緉ew []鐨勫唴瀛橈紝閮戒細閫犳垚涓嶅彲棰勮鐨勫悗鏋溿?
Item 17 錛?灝唍ew璇彞鍗曠嫭鍐?br>----------------------------------
tag錛?nbsp; newed
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());榪欒璇彞鏈夐棶棰橈紝榪欎釜澶嶆潅鐨勫弬鏁拌〃鍖呭惈浜嗕笁涓姩浣滐細
·new 涓涓?Widget
·鐢╪ew鐨刉idget鍋氫負鍙傛暟鎵цshare_ptr鐨勬瀯閫犲嚱鏁?
·鎵цpriority
C++鐨勬煇涓紪璇戝櫒鍙兘涓轟簡鏁堢巼鑰岃嚜浣滀富寮狅紝瀵艱嚧榪欎笁涓姩浣滅殑鎵ц欏哄簭鏄笉紜畾鐨勶紒鍥犳涓婇潰鐨勫姩浣滄墽琛岄『搴忓彲鑳芥槸榪欐牱鐨勶細
·new 涓涓?Widget
·鎵цpriority
·鐢╪ew鐨刉idget鍋氫負鍙傛暟鎵цshare_ptr鐨勬瀯閫犲嚱鏁?nbsp;
榪欎釜鏃跺欏鏋減riority鐨勬墽琛屽嚭閿欒屽紩鍙戝紓甯革紝灝變細鍙戠敓鍐呭瓨娉勬紡(Memory Leak)錛屽洜涓簄ew鍑烘潵鐨刉idget鍐嶄篃鏃犳硶璺熻釜浜嗐?/p>
鑰岃В鍐蟲柟娉曚篃寰堢畝鍗曪紝涓嶈濡勫浘涓琛屽啓瀹屾墍鏈夌▼搴忥紝鍒嗗紑鏉ヨ佽佸疄瀹炲啓灝辨槸浜嗭細
std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());
VC++涓嬩笉浼氥?/p>
Item 5銆? 錛欳++榛樿緙栧啓鐨勫嚱鏁?br>-----------------------------------------
tag錛?榛樿鎷瘋礉鍑芥暟 copy assignment
濡傛灉娌℃湁瀹氫箟綾葷殑鏋勯犲嚱鏁?鎷瘋礉鍑芥暟/鎷瘋礉鏋勯犲嚱鏁?鏋愭瀯鍑芥暟錛岀紪璇戝櫒浼氳嚜浣滀富寮犲府浣犲畾涔夎繖浜涘嚱鏁幫紝鑰屼笖榪樻槸public澶栧姞inline鐨勩?浼拌榪欐槸鏈鍐風殑鍐烽キ浜?
甯啓鎷瘋礉鍑芥暟鏃朵粎闄愪簬甯綘澶勭悊涓涓嬭濡俰nt鐨勫唴宓岀被鍨?build-in type)浠ュ強鑷韓灝辨湁鎷瘋礉鍑芥暟鐨勭被瀵硅薄錛屽啀澶嶆潅涓鐐圭殑灝辨悶涓嶅畾浜嗐?
鏈夋椂鍊欓渶瑕佺姝㈡煇涓被瀵硅薄鐨勬嫹璐濇搷浣滐紝灝辮閬垮厤浠ヤ笂鍑芥暟鐨勮嚜鍔ㄧ敓鎴愶紝闇瑕佽嚜宸卞畾涔夎繖浜涘嚱鏁幫紝騫朵笖鏈変互涓嬬壒鎬?
private
鍙槸澹版槑錛屼笉緇欎簣瀹炵幇(give no implementation)
褰撶劧瑕佹槸榪樻槸瑙夊緱楹葷儲錛屽共鑴嗙洿鎺ョ戶鎵緽oost鐨刵oncopyable(鑷繁鍐欎竴涓被浼肩殑涔熷彲浠?錛屽氨鍙互涓嶈垂鍚圭伆涔嬪姏鐨勮幏寰椾笉鑳芥嫹璐濈殑鐗規с?
Item 7 錛氫負澶氭佸熀綾誨0鏄巚irtual鏋愭瀯鍑芥暟
--------------------------------------------
tag錛?nbsp;澶氭侊紙polymorphism錛?nbsp;铏氬嚱鏁?nbsp; virtual function 鏋愭瀯鍑芥暟
·polymorphic base classes 搴斿皢鏋愭瀯鍑芥暟瀹氫箟涓鴻櫄鍑芥暟(virtual function)
·褰揷lass鍐呰嚦灝戝惈涓涓獀irtual鍑芥暟鏃訛紝鎵嶅0鏄巚irtual鏋愭瀯鍑芥暟銆?br>
鍚﹀垯鍦ㄩ氳繃鍩虹被鎸囬拡鏋愭瀯涓涓瓙綾誨璞$殑鏃跺欙紝鍥犱負娌℃湁铏氳〃(V Table)瀵規瀽鏋勫嚱鏁扮殑鎸囧紩錛屽璞$殑鍩虹被閮ㄥ垎鏄姣佷簡錛屽璞$殑瀛愮被閮ㄥ垎鍗存病鍔炴硶寰楀埌鏋愭瀯(娌℃湁浜嗚櫄琛ㄤ腑鐨勮鏄庡畠鏍規湰涓嶇煡閬撴湁瀛愮被鐨勬瀽鏋勫嚱鏁版潵鏋愭瀯瀛愮被閮ㄥ垎錛?錛屼粠鑰屽鑷村唴瀛樻硠婕忋?
virtual鍑芥暟瀹炵幇錛?br> 瑕佸疄鐜皏irtual錛寁ptr錛坴irtual table pointer錛夋寚閽堟寚鍚戜竴涓悜鍑芥暟鎸囬拡鏋勬垚鐨勬暟緇勶紝縐頒負vtbl錛坴irtual table錛夛紱
甯︽湁virtual鍑芥暟鐨刢lass閮芥湁涓涓搴旂殑vtbl錛屽璞¤皟鐢╲irtual鍑芥暟鏃訛紝瀹為檯琚皟鐢ㄧ殑鍑芥暟鍙栧喅浜庤瀵硅薄鐨剉ptr鎵鎸囩殑閭d釜vtbl錛堝湪鍏朵腑瀵繪壘閫傚綋鐨勫嚱鏁版寚閽堬級
鍋囪鍩虹被鎸囬拡鍦ㄦ瀽鏋勬椂瑕佸仛鐨勪簨鎯呮槸濂夊懡鏁戜漢錛氭寚閽堝晩鎸囬拡錛孹X鍦板彂澶ф按浜嗭紝浣犺刀绱у幓鎶婂紶涓変竴瀹朵漢(瀛愮被瀵硅薄)鏁戝嚭鏉ャ?br> 鎸囬拡鎷跨潃鎸囦護(鏋愭瀯鍑芥暟)灝辨壘鍒頒簡寮犱笁(寮犱笁瀹跺闀匡紝瀛愮被瀵硅薄鐨勫熀綾婚儴鍒?錛氬紶涓夋槸鍚э紝浣犱竴瀹朵漢閮藉湪榪欓噷浜嗗惂錛岃窡鎴戣蛋鍚с?鏋愭瀯鍚э紝鍥炵┖浣欏唴瀛橀噷鍘誨惂@#錕?)
濡傛灉寮犱笁宸茬粡娌℃湁鍏朵粬浜叉垰浜嗭紝浠栧氨鏄紶涓夊鐨勫叏閮ㄤ漢(榪欎釜瀵硅薄鍏跺疄灝辨槸鍩虹被瀵硅薄)銆傚緢綆鍗曪紝鐩存帴璺熺潃鎸囬拡璧板氨瀹屼簨浜嗐?br> 濡傛灉寮犱笁榪樻湁涓皬寮熷彨寮犱笁鐤?寮犱笁瀹墮櫎寮犱笁澶栫殑涓閮ㄥ垎錛屽嵆瀛愮被瀵硅薄鐨勫瓙綾婚儴鍒?錛屽紶涓夊氨蹇呴』鎷跨潃鏃忚氨(V Table)璺熸寚閽堣鍝庡憖榪欐槸鎴戝紵鍟婏紝鎶婁粬涔熸瀽鏋勪簡鍚э紝寮犱笁瀹跺鎮ㄦ劅鎭╀笉灝?#8230;…涔熷緢綆鍗曪紝涓騫跺甫璧板氨瀹屾垚浠誨姟浜?瀹屾暣鏋愭瀯/閲婃斁浜嗘暣涓璞?
濡傛灉錛屽紶涓夋病浜嗘棌璋憋紝璁頒笉寰楁湁涓紶涓夌柉寮熷紵錛屽偦涔庝箮鐨勮窡浜嗘寚閽堣蛋錛屽ぇ瀹朵篃浠ヤ負寮犱笁涓瀹墮兘琚晳鍑烘潵浜嗐傜伨鍖洪噷灝卞彧鍓╀笅寮犱笁鐤竴涓漢鍦ㄧ柉璺戜簡(memory leak)
鍙︿竴鏂歸潰錛屽鏋滀笉鍑嗗鎶婃煇涓被鐢ㄤ綔澶氭佷腑鐨勫熀綾伙紝灝辨病蹇呰瀹氫箟鏋愭瀯鍑芥暟涓鴻櫄鍑芥暟銆傝繖鏍烽櫎浜嗗鍔犱唬鐮佸ぇ灝忓紑閿澶?鍥犱負闇瑕佺┖闂村瓨鏀捐櫄琛?錛屾病鏈変換浣曞ソ澶勩?榪欎釜鍊掓槸寰堝涔︿笂娌¤榪囩殑)
濡傛灉寮犱笁瀹舵湰鏉ュ氨鍙湁寮犱笁涓涓漢錛屼粬灝辨病蹇呰榪樿甯︾潃涓┖鐧界殑鏃忚氨浜嗐傞冨懡鐨勬椂鍊欒兘鎵斿氨鎵斿槢銆?
鏈鍚庢彁鍒扮殑涓鐐瑰拰鎶借薄綾繪湁鍏熾傛娊璞$被鏄湁綰櫄鍑芥暟鐨勭被錛屽彧鑳戒綔涓烘帴鍙o紝涓嶈兘鏈夎嚜宸辯殑瀵硅薄銆傚湪璁捐杞歡妗嗘灦鐨勬椂鍊欎細鏈夐渶瑕佺敤鍒版娊璞$被鐨勬椂鍊欍傚彲鏄鏋滄湁榪欎箞涓涓被錛岄渶瑕佽璁′負鎶借薄綾伙紝浣嗘槸鍗存壘涓嶅埌涓涓垚鍛樺嚱鏁板彲浠ユ媺鍘誨仛綰櫄鍑芥暟錛岄偅涔堣繖涓椂鍊欏氨鎶婃瀽鏋勫嚱鏁板畾涔変負綰櫄鍑芥暟濂戒簡銆傚彧鏄悓鏃惰繕瑕佺粰瀹冧竴涓┖鐨勫疄鐜般?
class::~class() {}
Item 8 錛氬埆璁╁紓甯擱冪鏋愭瀯鍑芥暟
-------------------------------------------
tag錛氬紓甯?try catch 鏋愭瀯鍑芥暟
·鍦ㄦ瀽鏋勫嚱鏁頒腑涓嶈兘鎶涘嚭寮傚父銆?鑻ヨ鏋愭瀯鍑芥暟璋冪敤鐨勫嚱鏁板彲鑳戒細鎶涘嚭寮傚父錛屾瀽鏋勫嚱鏁板簲璇ユ崟鎹変換浣曞紓甯革紝騫跺悶涓嬶紙涓嶄紶鎾級鎴栫粨鏉熺▼搴忋?br> ·鑻ヤ竴涓搷浣滃彲鑳藉嚭鐜板紓甯革紝瀹㈡埛闇瑕佸榪欎釜寮傚父浣滃嚭鍙嶅簲銆俢lass搴旀彁渚涗竴涓櫘閫氬嚱鏁版潵鎵ц璇ュ嚱鏁幫紝鑰屼笉鏄湪鏋愭瀯鍑芥暟鍐呰皟鐢ㄣ?/p>
寮傚父涓嶅儚鍑芥暟璋冪敤錛屼竴鏃︽姏鍑?throw)錛屽氨鍥炰笉鏉ヤ簡銆?br> 濡傛灉鍦ㄦ瀽鏋勫嚱鏁頒腑鎶涘嚭浜嗗紓甯革紝鏈変竴閮ㄥ垎閲婃斁/鎽ф瘉瀵硅薄鎴愬憳鐨勬搷浣滃彲鑳藉氨鏃犳硶榪涜銆傚洜涓烘煇涓紓甯革紝瀵艱嚧浜嗘墍鍦ㄧ殑鏋愭瀯鍑芥暟鏃犳硶瀹屾垚鍏ㄩ儴鏋愭瀯浠誨姟銆?
鍙槸瑕佹槸鐪熺殑闇瑕佸鏋愭瀯鍔ㄤ綔涓嚭鐜扮殑閿欒/寮傚父榪涜澶勭悊鍜嬪姙錛熶功涓嚜鏈夎В鍐蟲柟妗堬細浠庡樊鐨勫埌濂界殑銆?
鍦ㄦ瀽鏋勫嚱鏁板唴甯冪疆catch錛屼竴鏃﹀彂鐢熷紓甯稿氨浼氳鎹曡幏錛岀劧鍚庣畝鍗曡皟鐢╯td::abort鑷潃
鐐硅瘎錛氬共鑴嗘槸騫茶剢浜嗭紝浣嗘槸榪欐牱鐚濇浼氫笉浼氭湁鐐瑰お紿佺劧錛?
涔熸槸鍦ㄥ嚱鏁板唴甯冪疆catch錛屼絾鏄亣鍒板紓甯稿氨鎶婂畠鐩存帴鍚冨埌鑲氬瓙閲?澶у笀璇?Swallow the exception)銆?br> 鐐硅瘎錛氫竴鑸笉璇ヨ繖鏍峰鐞嗭紝姣曠珶鍙戠敓浜嗕笉濂界殑浜嬨備絾濡傛灉鐪熺殑鎯寵紼嬪簭緇х畫甯︿激涓婇樀錛屼篃紜畾榪欐牱涓嶄細鏈夐棶棰橈紝閭d篃涓嶄細鏈変漢鏈夋剰瑙併?
闄や簡鍦ㄥ嚱鏁伴噷甯冪疆catch錛屽茍閲囩敤浠ヤ笂浠諱竴鏂規硶錛屽彟澶栧疄鐜頒竴涓彲渚涚敤鎴瘋皟鐢ㄧ殑鍑芥暟鎺ュ彛錛岀敤鏉ュ鐞嗚繖浜涙湁鍙兘鍑洪敊鐨勬瀽鏋勫伐浣溿?br> 鐐硅瘎錛氬ぇ甯堢粰浜堣繖涓柟妗堥珮搴︾殑璇勪環錛屽洜涓鴻繖鏍蜂笉浣嗘湁浠ヤ笂涓ょ鏂規硶鐨勬晥鏋滐紝榪樼粰鐢ㄦ埛涓涓弬涓庡鐞嗗紓甯哥殑鏈轟細(璋冪敤鎺ュ彛鍑芥暟)銆傚鏋滅敤鎴鋒病鏈?鎴栬呭繕璁?鐢ㄨ鍑芥暟澶勭悊鏋愭瀯鐨勫姩浣滐紝閭d箞鏋愭瀯鍑芥暟涔熶細鑷鎸戣搗榪欎釜浠誨姟銆傝岃繖涓椂鍊欏鏋滆繕鍑洪棶棰橈紝鐢ㄦ埛涔熸病鏈変粈涔堢悊鐢辨潵璐f簡錛氭槸浣犺嚜宸變笉鎯寵綆$殑錛?
Item 9 錛氫笉鍦ㄦ瀯閫犲拰鏋愭瀯榪囩▼涓皟鐢?virtual 鍑芥暟
-----------------------------------------------------
tag錛?br>
鎷ユ湁铏氬嚱鏁扮殑綾誨氨鏈夎櫄琛紝铏氳〃鍙兘浼氬紩鍙戝瓙綾葷浉搴旇櫄鍑芥暟鐨勮皟鐢紝鍦ㄨ繖浜涜皟鐢ㄤ腑鏈夊彲鑳藉鏌愪簺瀛愮被瀵硅薄鎴愬憳鐨勮闂?br> 鍦ㄦ瀯閫犱竴涓瓙綾誨璞℃椂錛?nbsp; 寮濮嬫瀯閫犵埗綾婚儴鍒?-> 瀹屾垚鐖剁被閮ㄥ垎騫跺紑濮嬫瀯閫犲瓙綾婚儴鍒?-> 瀹屾垚瀛愮被閮ㄥ垎 (瀹屾垚鏁翠釜鏋勯犲伐浣?
鏋愭瀯涓涓瓙綾誨璞$殑鏃訛細 寮濮嬫瀽鏋勫瓙綾婚儴鍒?-> 瀛愮被鏋愭瀯瀹屾瘯騫跺紑濮嬫瀽鏋勭埗綾婚儴鍒?-> 瀹屾垚鏋愭瀯鐖剁被閮ㄥ垎(瀹屾垚鏁翠釜鏋愭瀯宸ヤ綔)
鍦ㄦ瀯閫犲嚱鏁扮殑絎竴姝ワ紝瀛愮被瀵硅薄鎴愬憳榪樹笉瀛樺湪錛岃皟鐢ㄨ櫄鍑芥暟鏈夊彲鑳戒細璁塊棶涓嶅瓨鍦ㄧ殑瀛愮被鎴愬憳錛?br> 鍝曞埌浜嗙浜屾錛屽洜涓哄瓙綾誨璞¤繕娌℃湁瀹屽叏鏋勯犲畬姣曪紝姝ゆ椂璋冪敤铏氬嚱鏁頒篃鏄嵄闄╃殑銆備簨瀹炰笂鍦ㄦ暣涓瀯閫犺繃紼嬩腑錛岃瀵硅薄閮借瑙嗕綔涓涓埗綾誨璞°?br> 鍙嶈繃鏉ヤ篃鏄悓鏍烽亾鐞嗭紝鍦ㄦ瀽鏋勫嚱鏁扮殑絎竴姝ワ紝瀛愮被鎴愬憳宸茬粡寮濮嬮攢姣侊紝涓嶈兘璋冪敤铏氬嚱鏁幫紱鍒頒簡絎簩姝ワ紝鏁翠釜瀛愮被閮ㄥ垎閮芥病鏈変簡錛屾洿涓嶈兘鐢ㄨ櫄鍑芥暟浜嗐?br> 鑰屽湪鏁翠釜鏋愭瀯榪囩▼涓紝璇ュ璞′篃鏄鐪嬩綔鏄埗綾誨璞$殑銆?
紜繚铏氬嚱鏁頒笉浼氬湪瀵硅薄鏋勯?鏋愭瀯榪囩▼涓璋冪敤錛?/p>
鏂規硶涔嬩竴灝辨槸鐢ㄥ弬鏁頒紶閫掍唬鏇胯櫄鍑芥暟鏈哄埗銆?br> 鎶婂彲鑳借鏋勯犲嚱鏁拌皟鐢ㄧ殑铏氬嚱鏁版敼鎴愰潪铏氬嚱鏁幫紝鐒跺悗璁╃埗綾葷殑鏋勯犲嚱鏁板皢闇瑕佺殑淇℃伅/鏁版嵁閫氳繃鍙傛暟浼犻掔粰瀛愮被鏋勯犲嚱鏁般?br> Class Parent
{
public :
Parent();
Parent( const std:: string & WordsFromChild){
DoStuff(WordsFromChild);
// ..
};
void DoStuff( const std:: string & WordsFromChild);
}
Class Child : public Parent
{
public :
Child( /**/ /* some parameters here */ ) : Parent(TellParent( /**/ /* some parameters here */ )) {
// ..
};
private :
static std:: string & TellParent( /**/ /* some parameters here */ );
}
涔熻鐪嬪埌榪欓噷浼氭兂錛氳鏄疶ellParent()涓闂簡鏈鍒濆鍖栫殑瀛愮被鎴愬憳鍛紵閭d笉涔熸槸涓鏍鋒湁闂涔堬紵
娉ㄦ剰錛岃繖灝辨槸涓轟粈涔堝墠闈㈡湁涓猻tatic闄愬畾鐨勫師鍥犮傚洜涓洪潤鎬佸嚱鏁板彲浠ュ湪瀵硅薄鐨勫垵濮嬪寲闃舵灝卞紑濮嬪伐浣滐紝鏇磋緇嗙殑鎻忚堪鐪嬭繖閲屻?br> 瀛愮被鐨勮櫄琛ㄥ湪瀛愮被鐨勬瀯閫犲嚱鏁版椂鐢熸垚錛屾墍浠ュ湪鐖剁被鐨勬瀯閫犲嚱鏁頒腑璋冪敤铏氬嚱鏁頒嬌鐢ㄧ殑鏄埗綾葷殑鐗堟湰銆?br> 瀛愮被鍜岀埗綾誨璞¢兘浼氭湁鑷繁鐨勮櫄琛紝閲岄潰瀹夌疆鐨勬槸鑷繁鐗堟湰鐨勮櫄鍑芥暟瀹炵幇銆?/p>
Item 10-12 錛?nbsp; 鎷瘋礉榪愮畻絎?br>--------------------------
tag錛歛ssignment operator錛堣祴鍊艱繍綆楃錛?nbsp; 鑷垜璧嬪?nbsp; copying鍑芥暟
·浠よ祴鍊鹼紙assignment錛夋搷浣滅榪斿洖涓涓猺eference to *this銆?鍙疄鐜幫紙a=b=c)銆?br> ·澶勭悊鑷垜璧嬪?br> ·鏋勯犲嚱鏁扮敤鏉ュ垵濮嬪寲鏂板璞★紝鑰?assignment鎿嶄綔絎﹀彧鏂借浜庡凡鍒濆鍖栧璞¤韓涓娿?br> ·copying鍑芥暟搴旇紜繚澶嶅埗“瀵硅薄鍐呮墍鏈夋垚鍛樺彉閲?#8221;鍜?#8220;鎵鏈?base class鎴愬垎”
1銆?br> 鍦ㄥ嚱鏁板叆鍙f鏌ユ槸鍚﹀睘浜庤嚜鎷瘋礉(渚嬪錛氭鏌ユ寚閽堟槸鍚︽寚鍚戝悓涓鐗囧唴瀛?錛屽鏋滄槸錛屽暐涔熶笉騫茬洿鎺ヨ繑鍥炪傚惁鍒欏睘浜庢甯告儏鍐電殑鎷瘋礉銆?br> 榪欐牱瑙e喅浜唖elf-assignment-unsafe鐨勯棶棰橈紝浣嗘槸娌¤兘閬垮厤exception-unsafe銆?
2銆?br> 絎簩縐嶆柟娉曟瘮杈冪畝鍗曪紝鍙槸鏁寸悊涓涓嬫寚浠ょ殑欏哄簭銆備絾鏄嵈鍚屾椂瑙e喅浜嗚嚜璧嬪煎拰鎶涘嚭寮傚父甯︽潵鐨勯棶棰樸傜戶緇棤鑰葷殑鎶勫啓浠g爜涓孌碉細
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb; // remember original pb
pb = new Bitmap(*rhs.pb); // make pb point to a copy of *pb
delete pOrig; // delete the original pb
return *this;
}
榪欐牱鐨勫仛娉曞湪瑙e喅浠ヤ笂涓や釜闂鐨勫悓鏃跺嵈涔熼檷浣庝簡鎵ц鐨勬晥鐜囷細涓嶈浠涔堟儏鍐碉紝榪欎釜璧嬪煎嚱鏁伴兘瑕佸垱寤轟竴涓柊鐨凚itmap瀵硅薄銆?br> 絎竴縐嶆柟娉曠殑棰濆鏀嚭錛氬垽鏂鍙ュ繀鐒跺湴寮曞叆浜嗙▼搴忕殑鍒嗘敮(branch)錛屼簬鏄寚浠ょ殑棰勫彇(prefetch)銆佺紦鍐?caching)銆佹祦姘寸嚎澶勭悊(pipelining)鐨勬晥鐜囧氨浼氳闄嶄綆銆?
3銆?br> Copy And Swap銆傛敼璧嬪間負浜ゆ崲銆?br>
void swap(Widget& rhs); //浜ゆ崲*this 鍜宺hs鐨勬暟鎹紱
Widget& Widget::operator=(const Widget& ths)
{
Widget temp(ths); //涓簉hs鏁版嵁鍒朵綔涓浠藉壇鏈?br> swap(temp); //灝?this鏁版嵁鍜屼笂榪板壇鏈殑鏁版嵁浜ゆ崲銆?br> return *this;
}
Widget& Widget::operator=(Widget rhs) // rhs is a copy of the object
{ // passed in 鈥?note pass by val
swap(rhs); // swap *this's data with the copy's
return *this;
}鍒╃敤鍙傛暟浼犲鹼紝闅愭х殑鏋勯犱簡涓涓猈idget瀵硅薄銆傜劧鍚庡皢鏂板璞″拰鏈璞′腑鐨勬暟鎹垚鍛樹氦鎹紝杈懼埌涓烘湰瀵硅薄璧嬪肩殑鏁堟灉銆?br> 鏂扮殑涓存椂瀵硅薄鍦ㄨ煩鍑哄嚱鏁板悗鑷姩閿姣併傚垰鎵嶈鐨勪袱涓猽nsafe錛岄兘涓嶄細瀛樺湪銆?br> 榪欐牱寮閿杈冨ぇ浜嗭紝鏃犺浠涔堟椂鍊欓兘瑕佹瀯閫犳柊鐨勫璞°傜敤swap鏉ュ畬鎴愯祴鍊肩殑鍋氭硶鏈夌偣閫昏緫娣鋒穯銆備絾榪欐牱鍋氬緢鏈夊彲鑳借緙栬瘧鍣ㄧ敓鎴愭洿鏈夋晥鐜囩殑浠g爜銆?/p>
---------------------------
濡備綍淇濊瘉鍦ㄨ祴鍊?鎷瘋礉鐨勬椂鍊欒兘澶熷皢鎵鏈夌殑鎴愬憳瀹屾暣鎷瘋礉榪囧幓錛?br> 瀵逛簬綆鍗曠殑鏁版嵁鎴愬憳錛岀紪璇戝櫒鑷姩鐢熸垚鐨勬嫹璐濆嚱鏁板彲浠ヤ繚璇佷竴涓笉婕忛兘甯綘鎷瘋礉錛?br> 濡傛灉鏄瘮杈冨鏉傜殑鎴愬憳(姣斿璇存寚鍚戜竴鐗囧唴瀛樼┖闂寸殑鎸囬拡)錛岀紪璇戝櫒灝辨病鏈夎凍澶熺殑鏅哄晢鎶婅繖浜涙垚鍛樻嫹璐濆埌鍙﹀涓涓璞′腑鍘諱簡銆?
鍦ㄥ鍔犵被鎴愬憳浠ュ悗璁板緱鏇存柊鎷瘋礉鍑芥暟錛屼互鍏嶆嫹璐濅笉瀹屽叏銆?
瀛愮被鐨勬嫹璐濆嚱鏁版妸鑷繁鐨勬垚鍛橀兘鎷瘋礉浜嗭紝浣嗘槸鍗存紡浜嗘妸鐖剁被瀵硅薄鐨勬垚鍛樻嫹璐濆埌鏂扮殑瀵硅薄涓?鍦ㄥ瓙綾葷殑鎷瘋礉鍑芥暟涓皟鐢ㄧ埗綾葷殑鎷瘋礉鍑芥暟
Widget& Widget:: operator = (Widget src)
{
swap(src); // copy-and-swap
WidgetParent:: operator = (src); // invoking the parent's copy assignment operator
return * this ;
}
鏈鍚庣殑鏈鍚庯紝閫氬父鏉ヨ鍦ㄦ嫹璐濆嚱鏁板拰鎷瘋礉鏋勯犲嚱鏁頒腑鐨勫疄鐜板ぇ澶氱浉鍚岋紝
涓嶈鍦ㄦ嫹璐濆嚱鏁頒腑璋冪敤鎷瘋礉鏋勯犲嚱鏁版垨鑰呭弽涔嬨傚鏋滅湡鐨勯渶瑕侀伩鍏嶄唬鐮佺殑閲嶅錛屽ぇ鍙畾涔変竴涓鏈夌殑鍑芥暟鏉ヨ礋璐e墠闈袱鑰呯浉鍚岀殑閮ㄥ垎銆?
Item 1 錛欳++鏄竴涓璦鑱旈偊
--------------------------
tag: c c++緇勬垚
C
鍖哄潡錛坆locks錛夈佽鍙ワ紙statements錛夈侀澶勭悊鍣紙preprocessor錛夈佸唴緗暟鎹被鍨嬶紙built-in data types錛夈佹暟緇勶紙arrays錛夈佹寚閽堬紙pointers錛夈?br>
Object-Oriented C++
classes錛堝寘鎷瀯閫犮佹瀽鏋勶級銆佸皝瑁咃紙encapsulation錛夈佺戶鎵匡紙inheritance錛夈佸鎬侊紙polymorphism錛夈乿irtual鍑芥暟錛堝姩鎬佺粦瀹氾級
Template C++
娉涘瀷緙栫▼錛坓eneric programming錛?nbsp; Template metaprogramming錛圱MP錛屾ā鐗堝厓緙栫▼錛?br>
STL
瀹瑰櫒錛坈ontainers錛夈佽凱浠e櫒錛坕terators錛夈佺畻娉曪紙algorithms錛夈佸嚱鏁板璞★紙function objects錛?br>
姣忎釜璇█閮芥湁鑷繁鐨勬瑙勫垯
Item 2 錛氱敤const銆乪num鍜屾ā鏉縤nline鎺ㄧ炕#define鐨勭粺娌?
---------------------------------------------------
tag: const enum inline #define
闇瑕佸畾涔夊父閲忔椂錛屼笉瑕佺敤#define錛屾敼鐢╟onst淇グ鐨勫彉閲忔垨鏄敤enum鍚?
瑕佹兂鍐欎竴浜涚畝鐭皬鍑芥暟鏃訛紝鍒冭檻#define鍟︼紝鏀圭敤template+inline鍚?
鍘熷洜鏄嫢涓烘誕鐐瑰彉閲忥紝鐢╟onst鍑忓皬浜嗕唬鐮佸ぇ灝忥紝鍚屾椂榪樹嬌寰楀皝瑁?encapsulation)鍙樺緱鍙錛堝畯琚畾涔夊悗錛屽湪涔嬪悗鐨勭紪璇戣繃紼嬮兘鏈夋晥錛岄櫎闈瀠ndef 錛夛紝鑰屼笖錛屽湪璋冭瘯鐨勬椂鍊欙紝鍥犱負const瀹氫箟鐨勫彉閲忔槸浼氬姞鍦ㄧ鍙瘋〃(Symbol Table)鐨勶紝灝辨瘮define甯擱噺瑕佹柟渚胯窡韙簡(鍦ㄩ澶勭悊闃舵錛屽父閲忕殑鍚嶅瓧灝卞凡緇忚鏇挎崲鎺変簡)
鍦ㄤ竴浜涚壒瀹氱殑鎯呭喌涓?緙栬瘧鍣ㄤ笉鍏佽“static鏁存暟鍨媍lass甯擱噺”瀹屾垚“in class 鍒濆艱瀹?#8221; )錛屽鏋滀笉鑳界敤const鍙栦唬#define錛屽氨鐢╡num銆傞櫎浜嗕笉鑳借幏鍙栦竴涓猠num鐨勫湴鍧涔嬪錛岃繖縐嶆柟娉曞拰const鐨勭敤娉曞叾瀹炲樊涓嶅銆?
鍙互鍙栦竴涓猚onst鐨勫湴鍧錛屼笉鑳藉彇涓涓猠num鐨勫湴鍧錛岄氬父涓嶈兘鍙栦竴涓?define鐨勫湴鍧銆?br>
inline鍑芥暟鍜屽畯鏈変釜鍏卞悓鐨勫湴鏂癸紝浠栦滑閮戒笉浼氭湁鍑芥暟璋冪敤鐨勬爤鐨勫紑閿銆傚啀鍠婁笂妯℃澘(template)鏉ュ府蹇欙紝灝變笉鐢ㄥ幓鑰冭檻瀹為檯璋冪敤鏃剁殑鍙傛暟綾誨瀷銆?br>
Item 3 錛氬敖鍙兘浣跨敤const
--------------------------------------------------
tag: const non-const conceptual constness mutable
·棣栧厛瑕佺煡閬揷onst鍙互閫氱敤鍦ㄥ璞′笂錛屽嚱鏁板弬鏁板拰榪斿洖鍊間笂錛岀敋鑷蟲槸鐢ㄥ湪闄愬埗鍑芥暟鏈韓銆?
·const 鍑虹幇鍦ㄦ槦鍙峰乏杈癸紝琛ㄥ紡琚寚鐗╂槸甯擱噺錛涘嚭鐜板湪鏄熷彿鍙寵竟錛屾寚閽堣嚜韜槸甯擱噺錛?br> ·涓や釜鎴愬憳鍑芥暟濡傛灉鍙槸甯擱噺鎬э紙constness錛変笉鍚岋紝鍙互琚噸杞姐?br> ·const鍜宯on-const鎴愬憳鍑芥暟鐨勫疄鐜扮瓑浠鋒椂錛屽彲浠ョ敤non-const鐗堟湰璋冪敤const鐗堟湰閬垮厤浠g爜閲嶅銆?br>
Compilers enforce bitwise constness, but you should program using conceptual constness.
榪欓噷鏈夋彁鍒癱onstness(甯擱噺鎬?鐨勪袱涓棬媧? bitwise瀛﹂櫌媧懼拰conceptual瀹炵敤媧俱?br> bitwise constness闃佃惀搴旇閮芥槸寰堝絀剁殑錛岃繖閲岃涓哄鏋滀竴涓嚱鏁拌澹版槑鏄痗onst錛屼綘灝辯粷瀵逛笉鑳戒慨鏀瑰璞¢噷鐨勪換浣曟垚鍛?static鎴愬憳闄ゅ)銆?br> 涓誨紶conceptual constness嫻佺殑褰撶劧閮芥瘮杈冨ソ璇磋瘽錛岃櫧鐒朵綘鏄痗onst鍏氾紝浣嗛渶瑕佺殑鏃跺欙紝榪樻槸搴旇鏈変緥澶栫殑鍢涖傛鎵璋撲漢鏃犲畬浜猴紝const涔熸病鏈夌粷瀵圭殑const锝?
conceptual constness鍙互榪欐牱瑙i噴錛氬叿澶嘽onceptual constness鐨勫璞?鍑芥暟錛屽叾琛屼負瀵逛簬璇ュ璞?鍑芥暟浠ュ鐨勬暟鎹槸const鐨勶紝涓嶄細綃℃敼鍒漢鐨勪笢涓溿備絾鏄笉淇濊瘉瀹?nbsp;涓嶄細淇敼瀵硅薄/鍑芥暟鍐呴儴鐨勬垚鍛橈細褰撹繖浜涙垚鍛樼敤mutable淇グ鐨勬椂鍊欙紝鎴戜滑鍙互鍦ㄤ竴涓猚onst鍑芥暟涓慨鏀硅繖浜沵utable鎴愬憳鐨勫箋?
鎵浠ヨ榪欐牱鐨刢onstness鏄蹇典笂鐨勶紝瀹為檯涓婂湪榪欐牱鐨勫嚱鏁頒腑鏈夊彲鑳芥敼鍙樹簡涓浜涘彉閲忕殑鍊鹼紝鍙笉榪囨病鏈変笌瀹冨0縐扮殑constness鐭涚浘鑰屽凡銆?
鐢╩utable闄愬畾鐨勫璞★紝鍝曟槸鍦╟onst鍑芥暟閲岋紝涓鏍峰彲浠ヤ慨鏀癸紒
鍜宑onst鏈夊叧鐨勮繕鏈夊湪const鍜岄潪const瀵硅薄闂寸殑杞崲闂(鐢╟onst_cast鍜宻tatic_cast瀹屾垚涓や釜鏂瑰悜鐨勮漿鎹?錛屼笉榪囧眰嬈″お楂橈紝鎴戣繕娌¤兘鐪嬪埌鏈夐渶瑕佺敤鐨勫湴鏂?br>
const char& operator[](size_t position) const {
...
}
char& operator[](size_t position) //璋冪敤宸茬粡瀹炵幇鐨刢onst op[]
{
return const_cast<char&> ( //灝哻onst op[] 鐨勮繑鍥炲間腑縐婚櫎 const
static_cast<const CClass&>(*this) //灝?this杞瀷涓?const錛屾寚鏄庤皟鐢ㄧ殑鏄痗onst鐗堟湰鐨刼p[]
[position] );
}
Item 4 錛氬璞″垵濮嬪寲
--------------------------------------------
tag錛歭ocal static 錛?鍒濆鍖栧垪琛紝 璧嬪鹼紙assignment錛?br>
·瀵逛簬鍐呭緩鐨勫璞$被鍨嬶紝鎵嬪伐鍒濆鍖栥?br> ·瀵逛簬瀵硅薄鑷韓鐨勬垚鍛橈紝鎺ㄨ崘鐨勬柟娉曟槸鍦ㄦ瀯閫犲嚱鏁扮殑鍒濆鍖栧垪琛ㄣ?br> ·浠ogcal static 瀵硅薄鏇挎崲 non-local static瀵硅薄錛屼互閬垮厤“璺ㄧ紪璇戝崟鍏冧箣鍒濆鍖栨搴?#8221;闂銆?br>
璧嬪鹼紙assignment錛夌殑鏁堢巼瑕佹瘮鍒濆鍖栵紙initialization錛変綆錛屽洜涓哄墠鑰呭厛鏋勯犱簡瀵硅薄鍐嶅浠栦滑璧嬪鹼紝鍦ㄦ瀯閫犵殑鍚屾椂灝變篃鎶婂艱祴浜嗐傝繖閲岃繕娌″姞涓婃嫹璐濇瀯閫犲嚱鏁扮殑鍙兘寮閿錛岃繕鏈変竴浜涚被鍨嬪const鍙橀噺銆佸紩鐢?reference)鏄笉鑳界敤璧嬪肩殑褰㈠紡“鍒濆鍖?#8221;鐨?#8230;…
濡傛灉鍦ㄥ垵濮嬪寲鏌愪釜瀵硅薄鐨勬椂鍊欙紝鏈夊鍏朵粬瀵硅薄鏄惁鏈夊垵濮嬪寲鐨勪緷璧?瀵逛笉璧鳳紝榪欓噷鏈夌偣鎷楀彛)錛屼竴瀹氳紜繚鍏朵腑鎵渚濊禆鐨勫璞″凡緇忓垵濮嬪寲瀹屾瘯銆?br>
褰撲笉鍚岀殑瀵硅薄鐨勫垵濮嬪寲瀛樺湪鐩鎬簰渚濊禆鏃訛紝鏌愪釜瀵硅薄娌℃湁鍒濆鍖栨湁鍙兘瀵艱嚧鍙﹀涓涓璞″垵濮嬪寲鐨勫け璐ャ?br> 褰撳垵濮嬪寲娑夊強鍒伴潪灞閮ㄩ潤鎬佸璞?non-local static object)鏃訛紝闂鏇村姞鏄庢樉錛氶潪灞閮ㄩ潤鎬佸璞″鏋滃畾涔夊湪涓嶅悓鐨勬枃浠朵腑錛屼粬浠氨鏈夊彲鑳戒綅浜庝笉鍚岀殑緙栬瘧鍗曞厓(translation unit)錛屽洜涓鴻繖浜涘璞″埌搴曡皝鍏堣鍒濆鍖栨槸涓嶅彲棰勭煡鐨勩?br> 緙栬瘧鍗曞厓錛坱ranslation unit錛夛細浜у嚭鍗曚竴鐩爣鏂囦歡錛坰ingle object file錛夌殑閭d簺婧愮爜錛岄氬父涓哄崟涓婧愮爜鏂囦歡鍔犱笂鎵鍖呭惈鐨勫ご鏂囦歡銆?/p>
瑙e喅姝ょ被闂鐨勪竴涓柟娉曟槸錛氭妸闈炲眬閮ㄩ潤鎬佸璞¤漿鎹負灞閮ㄩ潤鎬佸璞?local static object)錛屼篃灝辨槸鎶婂畠鐨勫畾涔夋斁鍦ㄤ竴涓嚱鏁伴噷銆傜劧鍚庣揣鎺ョ潃鍦ㄨ繖涓嚱鏁拌繑鍥炶瀵硅薄鐨勫紩鐢ㄣ侰++璇█瑙勫畾鍦ㄨ皟鐢ㄤ竴涓惈鏈夊眬閮ㄩ潤鎬佸璞$殑鍑芥暟鏃訛紝鍏朵腑鐨勬墍鏈夊眬閮ㄩ潤鎬佸璞¢兘蹇呴』鍒濆鍖栥傝繖涓柟娉曞氨鏄埄鐢ㄨ繖涓鐗規э紝灝嗗師鏈涓涓潪灞閮ㄩ潤鎬佸璞$殑璁塊棶錛岃漿鎹負瀵逛竴涓嚱鏁扮殑璋冪敤錛岃繖涓嚱鏁頒細榪斿洖璇ラ潤鎬佸璞$殑寮曠敤錛屽茍涓斾繚璇佽繖涓璞″凡緇忚鍒濆鍖栦簡銆?/p>
濡傛灉闇瑕佸垵濮嬪寲涓涓潪灞閮ㄩ潤鎬佸璞★紝灝辨妸瀹冩斁鍒頒竴涓嚱鏁伴噷錛岃榪欎釜鍑芥暟綆鍗曠殑榪斿洖榪欎釜瀵硅薄鐨勫紩鐢ㄣ?br>