锘??xml version="1.0" encoding="utf-8" standalone="yes"?> C++ 涓殑鍙橀噺綾誨瀷涓嶫ava寰堢浉浼箋傚儚Java涓鏍鳳紝C++ 鏈?tt>int 鍜?double 綾誨瀷銆備絾鏄繖浜涙暟瀛楃被鍨嬬殑鍙栧艱寖鍥存槸渚濊禆浜庢満鍣ㄧ殑銆傛瘮濡傚湪16浣嶇郴緇熶笂錛屼緥濡傝繍琛孌OS 鎴朩indows 3.x鐨凱C鏈轟笂錛?tt>int 鏄弻瀛楄妭(2-byte)鐨勶紝鍙栧艱寖鍥存瘮Java鐨?-byte鐨?tt>int 瑕佸皬寰堝銆傚湪榪欎簺鏈哄櫒涓婏紝濡傛灉 int 涓嶅鐢ㄧ殑璇濓紝浣犻渶瑕佷嬌鐢ㄩ暱鏁村瀷long銆?/p>
C++ 鏈?short 鍜?unsigned 綾誨瀷鏉ユ洿鏈夋晥鐨勫瓨鍌ㄦ暟瀛椼傦紙鎴戣涓烘墍璋撴湁鏁堟槸鎸囨洿楂樼殑絀洪棿鍒╃敤鐜囥傦級(jí) 鏈濂芥槸灝介噺閬垮厤浣跨敤榪欎簺綾誨瀷闄ら潪鏄┖闂村埄鐢ㄧ殑鏈夋晥鎬у浣犵殑緋葷粺鐪熺殑闈炲父閲嶈銆?/p>
鍦–++涓竷?yōu)當(dāng)鍨嬬?bool 琛ㄧず錛岃屼笉鍍忓湪Java涓敤boolean銆?/p>
C++ 涓瓧絎︿覆綾誨瀷鐢?string 琛ㄧず銆傚畠涓嶫ava涓殑 String 綾誨瀷闈炲父鐩鎬技錛屼絾鏄紝榪樻槸瑕侀愪竴浠ヤ笅鍑犵偣涓嶅悓涔嬪錛?/p>
1. C++ 瀛楃涓插瓨鍌ˋSCII 鐮佸瓧絎︼紝鑰屼笉鏄爣鍑嗙爜Unicode 瀛楃 2. C++ 瀛楃涓叉槸鍙互琚慨鏀圭殑錛岃孞ava瀛楃涓茬殑鍐呭鏄笉鍙慨鏀圭殑(immutable)銆?/p>
3. 鍙栧瓙瀛楃涓茬殑鎿嶄綔鍦?C++ 涓彨鍋?substr錛岃繖涓懡浠?tt>s.substr(i, n) 浠庡瓧絎︿覆s涓彇寰椾粠浣嶇疆 i 寮濮嬮暱搴︿負(fù)n鐨勫瓙瀛楃涓層?/p>
4. 鍦–++涓紝浣犲彧鑳藉灝嗗瓧絎︿覆涓庡叾瀹冨瓧絎︿覆瀵硅薄鐩鎬覆鑱?concatenate)錛岃屼笉鑳藉涓庝換鎰忕殑瀵硅薄鐩鎬覆鑱斻?/p>
5. C++涓彲浠ョ洿鎺ヤ嬌鐢ㄥ叧緋繪搷浣滅 ==銆?!=銆?<銆?<=銆?>銆?>= 鏉ヨ繘琛屽瓧絎︿覆姣旇緝錛屽叾涓悗闈㈠洓涓搷浣滅鏄寜瀛楁瘝欏哄簭榪涜姣旇緝鐨勩?榪欐瘮Java涓嬌鐢ㄥ嚱鏁癳quals鍜宑ompareTo鏉ユ瘮杈冭鏂逛究寰堝銆?/p>
鍦–++涓紝鏈湴鍙橀噺鐨勫畾涔夌湅璧鋒潵涓嶫ava涓浉鍚岋紝渚嬪錛?/p>
int n = 5; 瀹為檯涓婅繖姝f槸C++鍜孞ava鐨勪竴涓噸瑕佷笉鍚屼箣澶勩侰++緙栬瘧鍣ㄤ笉瀵規(guī)湰鍦板彉閲忚繘琛屽垵濮嬪寲媯(gè)楠岋紝鎵浠ュ湪C++涓緢瀹規(guī)槗蹇樿鍒濆鍖栦竴涓彉閲忥紝榪欑鎯呭喌涓嬶紝鍙橀噺鐨勫艱鍙橀噺鎵鍗犲唴瀛樺尯鍩熶腑鍒氬ソ褰撳墠瀛樺湪闅忔満鍊箋傝繖鏄劇劧鏄緢瀹規(guī)槗浜х敓紼嬪簭鍑洪敊鐨勫湴鏂廣?/p>
涓嶫ava涓鏍鳳紝 C++涓被鍙互鏈夋暟鎹煙鍜岄潤鎬佸彉閲忋備笉鍚岀殑鏄紝C++涓彉閲忓彲浠ュ湪鍑芥暟鐢氳嚦鏄被鐨勫闈㈠畾涔夛紝榪欎簺鎵璋撶殑鍏ㄥ眬鍙橀噺鍙互鍦ㄧ▼搴忕殑浠諱綍鍑芥暟涓璁塊棶錛屽洜鑰屼笉鏄撹寰堝ソ鐨勭鐞嗐傛墍C++涓簲璇ュ敖閲忛伩鍏嶄嬌鐢ㄥ叏灞鍙橀噺銆?/p>
鍦–++涓紝甯擱噺鍙互鍦ㄤ換浣曞湴鏂硅瀹氫箟錛堣寰楀湪Java涓紝甯擱噺蹇呴』鏄被鐨勯潤鎬佹暟鎹畇tatic data)銆?C++ 浣跨敤鍏抽敭瀛?const 鏉ュ畾涔夊父閲忥紝鑰孞ava涓槸 final銆備緥濡傦細(xì) const int DAYS_PER_YEAR = 365; C++ 涓綾葷殑瀹氫箟涓嶫ava鏈変簺涓嶅悓錛岃繖閲屾槸涓涓緥瀛愶細(xì)涓涓狢++ 鐗堟湰鐨?Point 綾? class Point /* C++ */ { public: Point(); Point(double xval, double yval); void move(double dx, double dy); double getX() const; double getY() const; private: double x; double y; }; 榪欓噷鍑犵偣閲嶈鐨勪笉鍚屾槸錛?/p>
1. C++鐨勭被瀹氫箟涓垎涓哄叕鍏卞拰縐佹湁閮ㄥ垎錛屽垎鍒互鍏抽敭瀛?public 鍜?private寮濮嬨傝屽湪Java涓紝姣忎竴涓厓绱犻兘蹇呴』鏍囨槑 public 鎴?private銆?/p>
2. C++涓被鐨勫畾涔夊彧鍖呭惈鍑芥暟鐨勫0鏄庯紝鐪熸鐨勫疄鐜板彟澶栧崟鐙垪鍑恒?/p>
3. 璁塊棶鍑芥暟(accessor methods)鏍囨湁鍏抽敭瀛?const 錛岃〃鏄庤繖涓嚱鏁頒笉浼?xì)鏀瑰彉鏈璞$殑鍏冪礌鍊箋?/p>
4. 綾誨畾涔夌殑緇撳熬澶勬湁鍒嗗彿 綾諱腑鍑芥暟鐨勫疄鐜拌窡鍦ㄧ被鐨勫畾涔変箣鍚庛傚洜涓哄嚱鏁版槸鍦ㄧ被澶栭潰瀹氫箟鐨勶紝鎵浠ユ瘡涓涓嚱鏁扮殑鍚嶅瓧鍓嶉潰瑕佸姞綾誨悕縐頒綔涓哄墠緙錛屽茍浣跨敤鎿嶄綔絎﹀弻鍐掑彿::鏉ュ垎鍓茬被鐨勫悕縐板拰鍑芥暟鐨勫悕縐般備笉鏀瑰彉闅愬惈鍙傛暟鍊鹼紙鍗沖綋鍓嶅璞$殑鍊鹼級(jí)鐨勮闂嚱鏁扮敤 const鏍囨槑銆傚涓嬫墍紺烘槸涓婇潰綾誨畾涔変腑鐨勫嚱鏁扮殑瀹炵幇錛?/p>
Point::Point() { x = 0; y = 0; } void Point::move(double dx, double dy) { x = x + dx; y = y + dy; } double Point::getX() const { return x; } Java 涓?C++ 鏈涓昏鐨勪笉鍚屽湪浜庡璞″彉閲忕殑浣跨敤銆傚湪 C++涓紝瀵硅薄鍙橀噺瀛樺偍鐨勬槸鐪熸鐨勫璞$殑鍊鹼紝鑰屼笉鏄璞″紩鐢?reference)銆傛敞鎰忓湪C++涓瀯閫犱竴涓璞$殑鏃跺欐槸涓嶄嬌鐢ㄥ叧閿瓧new鐨勶紝鍙渶瑕佸湪鍙橀噺鐨勫悕瀛楀悗闈㈢洿鎺ヨ祴浜堟瀯閫犲嚱鏁扮殑鍙傛暟灝卞彲浠ヤ簡錛屼緥濡傦細(xì) Point p(1, 2); /* 鏋勯犲璞?p */ 濡傛灉涓嶈窡鍙傛暟璧嬪鹼紝鍒欎嬌鐢ㄩ粯璁ゆ瀯閫犲嚱鏁幫紝渚嬪錛?/p>
Time now; /* 榛樿浣跨敤鏋勯犲嚱鏁?Time::Time() */ 榪欎竴鐐逛笌Java寰堜笉鍚屻傚湪Java涓紝榪欎釜鍛戒護(hù)浠呬粎鐢熸垚涓涓病鏈夊垵濮嬪寲鐨剅eference錛岃屽湪C++涓紝瀹冪敓鎴愪竴涓疄闄呯殑瀵硅薄銆?/p>
褰撲竴涓璞¤璧嬬粰鍙︿竴涓璞″彉閲忕殑鏃跺欙紝瀹為檯鐨勫煎皢琚嫹璐濄傝屽湪Java涓紝鎷瘋礉涓涓璞″彉閲忓彧涓嶈繃鏄緩绔嬩簡鍙﹀涓涓寚鍚戝璞$殑reference銆傛嫹璐濅竴涓狢++鐨勫璞″氨鍍忓湪Java涓皟鐢╟lone榪欎釜鍑芥暟涓鏍鳳紝鑰屼慨鏀規(guī)嫹璐濈殑鍊間笉浼?xì)鏀瑰彉鍘熷璞$殑鍊箋備緥濡傦細(xì) Point q = p; /* 鎷瘋礉p鍒皅 */ q.move(1, 1); /* 縐誨姩q鑰宲涓嶅姩錛屽嵆q鐨勫煎彉浜嗭紝鑰宲鐨勪笉鍙?/ 澶氭暟鎯呭喌涓嬶紝C++涓繖縐嶅璞$洿鎺ュ鍊兼搷浣滅殑鐗規(guī)т嬌鐢ㄨ搗鏉ュ緢鏂逛究錛屼絾鏄篃鏈変簺鏃跺欎笉灝藉浜烘剰錛?/p>
1. 褰撻渶瑕佷竴涓嚱鏁頒腑淇敼涓涓璞$殑鍊鹼紝蹇呴』璁頒綇瑕佷嬌鐢ㄦ寜寮曠敤璋冪敤call by reference (鍙傝涓嬮潰鍑芥暟閮ㄥ垎) 2. 涓や釜瀵硅薄鍙橀噺涓嶈兘鎸囧悜鍚屼竴涓璞″疄浣撱傚鏋滀綘瑕佸湪C++涓疄鐜拌繖縐嶆晥鏋滐紝蹇呴』浣跨敤鎸囬拡pointer錛堝弬瑙佷笅闈㈡寚閽堥儴鍒嗭級(jí) 3. 涓涓璞″彉閲忓彧鑳藉瓨鍌ㄤ竴縐嶇壒瀹氱殑綾誨瀷鐨勫鹼紝濡傛灉浣犳兂瑕佷嬌鐢ㄤ竴涓彉閲忔潵瀛樺偍涓嶅悓瀛愮被鐨勫璞$殑鍊鹼紙澶氭乸loymorphism)錛屽垯闇瑕佷嬌鐢ㄦ寚閽堛?/p>
4. 濡傛灉浣犳兂鍦–++涓嬌鐢ㄤ竴涓彉閲忔潵鎴栬呮寚鍚憂ull鎴栬呮寚鍚戜竴涓疄闄呯殑瀵硅薄錛屽垯闇瑕佷嬌鐢ㄦ寚閽?/p>
鍦↗ava涓紝姣忎竴涓嚱鏁板繀欏繪垨鑰呮槸瀵硅薄鍑芥暟(instance method)錛屾垨鑰呮槸闈欐佸嚱鏁?static function)鎴栫О綾誨嚱鏁般侰++鍚屾牱鏀寔瀵硅薄鍑芥暟鍜岄潤鎬佸嚱鏁幫紙綾誨嚱鏁幫級(jí)錛屼絾鍚屾椂C++涔熷厑璁稿畾涔変笉灞炰簬浠諱綍綾葷殑鍑芥暟錛岃繖浜涘嚱鏁板彨鍋氬叏灞鍑芥暟錛坓lobal functions錛?/em>銆?/p>
鐗瑰埆鐨勬槸錛屾瘡涓涓狢++ 紼嬪簭閮戒粠涓涓彨鍋?main鐨勫叏灞鍑芥暟寮濮嬫墽琛岋細(xì) int main() { . . . } 榪樻湁鍙﹀涓涓牸寮忕殑main鍑芥暟鍙互鐢ㄦ潵鎹曟崏鍛戒護(hù)琛屽弬鏁幫紝綾諱技浜嶫ava鐨刴ain鍑芥暟錛屼絾鏄畠瑕佹眰鍏充簬C鏍煎紡鐨勬暟緇勫拰瀛楃涓茬殑鐭ヨ瘑錛岃繖閲屽氨涓嶄粙緇嶄簡銆?/p>
鎸夌収涔?fàn)鎯Q岄氬父濡傛灉紼嬪簭鎵ц鎴愬姛錛?main 鍑芥暟榪斿洖0錛屽惁鍒欒繑鍥為潪闆舵暣鏁般?/p>
鍚孞ava涓鏍鳳紝鍑芥暟鍙傛暟鏄氳繃鍊間紶閫掔殑(passed by value)銆傚湪Java涓紝鍑芥暟鏃犺濡備綍閮芥槸鍙互淇敼瀵硅薄鐨勫肩殑銆傜劧鑰屽湪C++涓紝鍥犱負(fù)瀵硅薄鐩存帴瀛樺偍鐨勬槸瀹為檯鐨勫鹼紝鑰屼笉鏄寚鍚戝肩殑reference錛屼篃灝辨槸璇翠紶鍏ュ嚱鏁扮殑鏄竴涓疄闄呭肩殑鎷瘋礉錛屽洜姝や篃灝辨棤娉曚慨鏀瑰師鏉ュ璞$殑鍊箋?/p>
鎵浠ワ紝C++ 鏈変袱縐嶅弬鏁頒紶閫掓満鍒訛紝鍚孞ava涓鏍風(fēng)殑鎸夊艱皟鐢?call by value) 錛屼互鍙?qiáng)鎸夊湴鍧璋冪敤(call by reference)銆傚綋涓涓弬鏁版槸鎸塺eference浼犻掓椂錛屽嚱鏁板彲浠ヤ慨鏀瑰叾鍘熷鍊箋侰all by reference 鐨勫弬鏁板墠闈㈡湁涓涓湴鍧鍙?& 璺熷湪鍙傛暟綾誨瀷鐨勫悗闈紝渚嬪錛?/p>
void raiseSalary(Employee& e, double by) { . . . } 涓嬮潰鏄竴涓吀鍨嬬殑鍒╃敤call by reference鐨勫嚱鏁幫紝鍦↗ava涓槸鏃犳硶瀹炵幇榪欐牱鐨勫姛鑳界殑銆?/p>
void swap(int& a, int& b) { int temp = a; a = b; b = temp; } 濡傛灉浣跨敤 swap(x, y)鏉ヨ皟鐢ㄨ繖涓嚱鏁幫紝鍒檙eference鍙傛暟 a 鍜?b 鎸囧悜鍘熷疄闄呭弬鏁?tt>x 鍜?y鐨勪綅緗紝鑰屼笉鏄畠浠殑鍊肩殑鎷瘋礉錛屽洜姝よ繖涓嚱鏁板彲浠ュ疄鐜板疄闄呬氦鎹㈣繖涓や釜鍙傛暟鐨勫箋?/p>
鍦?C++涓紝姣忓綋闇瑕佸疄鐜頒慨鏀瑰師鍙傛暟鐨勫兼椂浣犲氨鍙互浣跨敤鎸夊湴鍧璋冪敤 call by reference C++ 鐨勫悜閲忕粨鏋勭粨鍚堜簡Java涓暟緇勫拰鍚戦噺涓よ呯殑浼樼偣銆備竴涓狢++ 鐨勫悜閲忓彲浠ユ柟渚跨殑琚闂紝鍏跺閲忓張鍙互鍔ㄦ佺殑澧為暱銆傚鏋?T 鏄換鎰忕被鍨嬶紝鍒?vector<T> 鏄竴涓厓绱犱負(fù) T 綾誨瀷鐨勫姩鎬佹暟緇勩備笅闈㈢殑璇彞 vector<int> a; 浜х敓涓涓垵濮嬩負(fù)絀虹殑鍚戦噺銆傝岃鍙?/p>
vector<int> a(100); 鐢熸垚涓涓垵濮嬫湁100涓厓绱犵殑鍚戦噺銆備綘鍙互浣跨敤push_back 鍑芥暟鏉ユ坊鍔犲厓绱狅細(xì) a.push_back(n); 璋冪敤 a.pop_back() 浠?tt>a涓彇鍑烘渶鍚庝竴涓厓绱狅紙鎿嶄綔鍚庤繖涓厓绱犺浠巃涓垹鎺?錛?浣跨敤鍑芥暟size 鍙互寰楀埌褰撳墠a涓殑鍏冪礌涓暟銆?/p>
浣犺繕鍙互閫氳繃鎴戜滑鐔熸?zhèn)夌?[] 鎿嶄綔絎︽潵璁塊棶鍚戦噺涓厓绱狅紝渚嬪錛?/p>
for (i = 0; i < a.size(); i++) { sum = sum + a[i]; } 鍚孞ava涓竴鏍鳳紝鏁扮粍绱㈠紩蹇呴』涓?0 鍜?a.size() - 1涔嬮棿鐨勫箋備絾鏄笌Java涓嶅悓鐨勬槸錛孋++涓病鏈塺untime鐨勭儲(chǔ)寮曞彿鍚堟硶鎬ф楠屻傝瘯鍥捐闂潪娉曠殑绱㈠紩浣嶇疆鍙兘閫犳垚闈炲父涓ラ噸鐨勫嚭閿欍?/p>
灝卞儚鎵鏈夊叾瀹?C++ 瀵硅薄涓鏍鳳紝鍚戦噺涔熸槸鍊箋傚鏋滀綘灝嗕竴涓悜閲忚祴鍊肩粰鍙﹀涓涓悜閲忓彉閲忥紝鎵鏈夌殑鍏冪礌閮戒細(xì)琚嫹璐濊繃鍘匯?/p>
vector<int> b = a; /* 鎵鏈夌殑鍏冪礌閮借鎷瘋礉浜?*/ 瀵規(guī)瘮Java涓殑鎯呭喌錛屽湪Java涓紝涓涓暟緇勫彉閲忔槸涓涓寚鍚戞暟緇勭殑reference銆傛嫹璐濊繖涓彉閲忎粎浠呬駭鐢熷彟澶栦竴涓寚鍚戝悓涓鏁扮粍鐨剅eference錛岃屼笉浼?xì)鎷疯礉姣忎竴涓厓绱犵殑鍊箋?/p>
姝e洜濡傛錛屽鏋滀竴涓狢++鍑芥暟瑕佸疄鐜頒慨鏀瑰悜閲忕殑鍊鹼紝蹇呴』浣跨敤reference鍙傛暟錛?/p>
void sort(vector<int>& a) { . . . } 鍦–++涓紝鏍囧噯鐨勮緭鍏ヨ緭鍑烘祦鐢ㄥ璞?cin 鍜?cout 琛ㄧず銆傛垜浠嬌鐢?<< 鎿嶄綔絎﹀啓杈撳嚭錛屼緥濡傦細(xì) cout << “Hello, World!”; 涔熷彲浠ヨ繛鐫杈撳嚭澶氶」鍐呭錛屼緥濡傦細(xì) cout << “The answer is ” << x << “\n”; 鎴戜滑浣跨敤 >> 鎿嶄綔絎︽潵璇誨叆涓涓暟瀛楁垨鍗曡瘝錛屼緥濡傦細(xì) double x; cout << “Please enter x: “; cin >> x; string fname; cout << “Please enter your first name: “; cin >> fname; 鍑芥暟getline 鍙互璇誨叆鏁磋鐨勮緭鍏ワ紝渚嬪錛?/p>
string inputLine; getline(cin, inputLine); 濡傛灉鍒拌揪杈撳叆鐨勭粨灝撅紝鎴栬呬竴涓暟瀛楁棤娉曡姝g‘鐨勮鍏ワ紝榪欎釜嫻佸璞′細(xì)琚緗負(fù) failed 鐘舵侊紝鎴戜滑鍙互浣跨敤鍑芥暟 fail 鏉ユ楠岃繖涓姸鎬侊紝渚嬪錛?/p>
int n; cin >> n; if (cin.fail()) cout << “Bad input”; 涓鏃︿竴涓祦鐨勭姸鎬佽璁句負(fù)failed錛屾垜浠槸寰堥毦閲嶇疆瀹冪殑鐘舵佺殑錛屾墍浠ュ鏋滀綘鐨勭▼搴忛渶瑕佸鐞嗛敊璇緭鍏ョ殑鎯呭喌錛屽簲璇ヤ嬌鐢ㄥ嚱鏁?getline 鐒跺悗浜哄伐澶勭悊寰楀埌鐨勮緭鍏ユ暟鎹?/p>
鎴戜滑宸茬粡鐭ラ亾鍦–++涓紝瀵硅薄鍙橀噺鐩存帴瀛樺偍鐨勬槸瀵硅薄鐨勫箋傝繖鏄笌Java涓嶅悓鐨勶紝鍦↗ava涓璞″彉閲忓瓨鍌ㄧ殑鏄竴涓湴鍧錛岃鍦板潃鎸囧悜瀵硅薄鍊煎疄闄呭瓨鍌ㄧ殑鍦版柟銆傛湁鏃跺湪C++涓篃闇瑕佸疄鐜拌繖鏍風(fēng)殑甯冪疆錛岃繖灝辯敤鍒頒簡鎸囬拡pointer銆傚湪 C++涓紝涓涓寚鍚戝璞$殑鍙橀噺鍙仛鎸囬拡銆傚鏋淭鏄竴縐嶆暟鎹被鍨嬶紝鍒?T* 鏄寚鍚戣繖縐嶆暟鎹被鍨嬬殑鎸囬拡銆?/p>
灝卞儚 Java涓竴鏍鳳紝涓涓寚閽堝彉閲忓彲浠ヨ鍒濆鍖栦負(fù)絀哄?NULL錛屽彟澶栦竴涓寚閽堝彉閲忕殑鍊鹼紝鎴栬呬竴涓皟鐢╪ew鐢熸垚鐨勬柊瀵硅薄錛?/p>
Employee* p = NULL; Employee* q = new Employee(”Hacker, Harry”, 35000); Employee* r = q; 瀹為檯涓婂湪C++涓繕鏈夌鍥涚鍙兘錛岄偅灝辨槸鎸囬拡鍙互琚垵濮嬪寲涓哄彟澶栦竴涓璞$殑鍦板潃錛岃繖闇瑕佷嬌鐢ㄥ湴鍧鎿嶄綔絎?& 錛?/p>
Employee boss(”Morris, Melinda”, 83000); Employee* s = &boss; 榪欏疄闄呬笂騫朵笉鏄粈涔堝ソ涓繪剰銆備繚闄╃殑鍋氭硶榪樻槸搴旇鐩存帴璁╂寚閽堟寚鍚戜嬌鐢?new鐢熸垚鐨勬柊瀵硅薄銆?/p>
鍒扮洰鍓嶄負(fù)姝紝C++ 鎸囬拡鐪嬭搗鏉ラ潪甯稿儚 Java 鐨勫璞″彉閲忋傜劧鑰岋紝榪欓噷鏈変竴涓緢閲嶈鐨勮娉曠殑涓嶅悓銆傛垜浠繀欏諱嬌鐢ㄦ槦鍙鋒搷浣滅 * 鏉ヨ闂寚閽堟寚鍚戠殑瀵硅薄銆傚鏋?p 鏄竴涓寚鍚?tt>Employee瀵硅薄鐨勬寚閽堬紝鍒?*p 鎵嶄唬琛ㄤ簡榪欎釜瀵硅薄錛?/p>
Employee* p = . . .; Employee boss = *p; 褰撴垜浠渶瑕佹墽琛屽璞$殑鍑芥暟鎴栬闂璞$殑涓涓暟鎹煙鏃訛紝涔熼渶瑕佷嬌鐢?*p 錛?/p>
(*p).setSalary(91000); *p澶栭潰鐨勬嫭鍙鋒槸蹇呴渶鐨勶紝鍥犱負(fù) . 鎿嶄綔絎︽瘮 * 鎿嶄綔絎︽湁鏇撮珮鐨勪紭鍏堢駭銆侰鐨勮璁¤呰寰楄繖縐嶅啓娉曞緢闅劇湅錛屾墍浠ヤ粬浠彁渚涗簡鍙﹀涓縐嶆浛浠g殑鍐欐硶錛屼嬌鐢?-> 鎿嶄綔絎︽潵瀹炵幇 * 鍜?. 鎿嶄綔絎︾殑緇勫悎鍔熻兘銆傝〃杈懼紡 p->setSalary(91000); 鍙互璋冪敤瀵硅薄*p鐨勫嚱鏁?setSalary 銆備綘鍙互綆鍗曠殑璁頒綇 . 鎿嶄綔絎︽槸鍦ㄥ璞′笂浣跨敤鐨勶紝-> 鎿嶄綔絎︽槸鍦ㄦ寚閽堜笂浣跨敤鐨勩?/p>
濡傛灉浣犱笉鍒濆鍖栦竴涓寚閽堬紝鎴栬呭鏋滀竴涓寚閽堜負(fù)絀哄?NULL 鎴栨寚鍚戠殑瀵硅薄涓嶅啀瀛樺湪錛屽垯鍦ㄥ畠涓婇潰浣跨敤 * 鎴?-> 鎿嶄綔絎﹀氨浼?xì)鍑洪敊銆?涓嶅垢鐨勬槸 C++ runtime 緋葷粺騫朵笉媯(gè)鏌ヨ繖涓嚭閿欍傚鏋滀綘鑼冧簡榪欎釜閿欒錛屼綘鐨勭▼搴忓彲鑳戒細(xì)琛屼負(fù)鍙ゆ垨姝繪満銆?/p>
鑰屽湪Java涓紝榪欎簺閿欒鏄笉浼?xì)鍙戠敓鐨勩傛墍鏈夌殑reference閮藉繀欏誨垵濮嬪寲錛屾墍鏈夌殑瀵硅薄鍙浠嶆湁reference鎸囧悜瀹冨氨涓嶄細(xì)琚粠鍐呭瓨涓竻闄わ紝鍥犳浣犱篃涓嶄細(xì)鏈変竴涓寚鍚戝凡琚垹闄ょ殑瀵硅薄鐨剅eference銆侸ava鐨剅untime 緋葷粺浼?xì)妫鏌eference鏄惁涓虹┖錛屽茍鍦ㄩ亣鍒扮┖鎸囬拡鏃舵姏鍑轟竴涓猲ull pointer鐨勪緥澶?exception)銆?/p>
C++ 鍜?Java榪樻湁涓涓樉钁楃殑涓嶅悓錛屽氨鏄?Java 鏈?em>鍨冨溇鍥炴敹 C++涓綋瀵硅薄鍙橀噺瓚呭嚭鑼冨洿鏃跺彲浠ヨ嚜鍔ㄨ鍥炴敹銆備絾鏄嬌鐢╪ew鐢熸垚鐨勫璞″繀欏葷敤delete鎿嶄綔絎︽墜鍔ㄥ垹闄わ紝渚嬪錛?/p>
Employee* p = new Employee(”Hacker, Harry”, 38000); . . . delete p; /* 涓嶅湪闇瑕佽繖涓璞?*/ 濡傛灉浣犲繕璁板垹闄や竴涓璞★紝閭d箞浣犵殑紼嬪簭鏈夊彲鑳芥渶緇堢敤鍏夋墍鏈夊唴瀛樸傝繖灝辨槸鎴戜滑甯歌鐨勫唴瀛樻硠婕?(memory leak)銆傛洿閲嶈鐨勬槸錛屽鏋滀綘濡傛灉鍒犻櫎浜嗕竴涓璞★紝鐒跺悗鍙堢戶緇嬌鐢ㄥ畠錛屼綘鍙兘瑕嗙洊涓嶅睘浜庝綘鐨勬暟鎹傚鏋滀綘鍒氬閥瑕嗙洊浜嗙敤浜庡鐞嗗唴瀛樺洖鏀剁殑鏁版嵁鍩燂紝閭d箞鍐呭瓨鍒嗛厤鏈哄埗灝卞彲鑳借繍杞け甯歌岄犳垚鏇翠弗閲嶇殑閿欒錛岃屼笖寰堥毦璇婃柇鍜屼慨澶嶃傚洜姝わ紝鍦–++涓渶濂藉敖閲忓皯鐢ㄦ寚閽?/p>
C++鍜孞ava涓戶鎵跨殑鍩烘湰璇硶鏄緢鐩鎬技鐨勩傚湪C++涓紝浣跨敤 : public 浠f浛Java涓殑extends 鏉ヨ〃紺虹戶鎵垮叧緋?銆?(C++ 涔熸敮鎸佺鏈夌戶鎵跨殑姒傚康錛屼絾鏄笉澶湁鐢ㄣ? 榛樿鎯呭喌涓嬶紝C++涓殑鍑芥暟涓嶆槸鍔ㄦ佺粦瀹氱殑銆傚鏋滀綘闇瑕佹煇涓嚱鏁板疄鐜板姩鎬佺粦瀹氾紝闇瑕佷嬌鐢?tt>virtual澹版槑瀹冧負(fù)铏氬嚱鏁幫紝渚嬪錛?/p>
class Manager : public Employee { public: Manager(string name, double salary, string dept); virtual void print() const; private: string department; }; 鍚孞ava涓鏍鳳紝鏋勯犲嚱鏁頒腑璋冪敤鐖剁被鐨勬瀯閫犲嚱鏁版湁鐗規(guī)畩鐨勮娉曘?Java浣跨敤鍏抽敭瀛?super銆侰++涓繀欏誨湪瀛愮被鐨勬瀯閫犲嚱鏁頒綋澶栬皟鐢ㄧ埗綾葷殑鏋勯犲嚱鏁般備笅闈㈡槸涓涓緥瀛愶細(xì) Manager::Manager(string name, double salary, string dept) : Employee(name, salary) /* 璋冪敤鐖剁被鐨勬瀯閫犲嚱鏁?*/ { department = dept; } Java 涓湪瀛愮被鍑芥暟涓皟鐢ㄧ埗綾葷殑鍑芥暟鏃朵篃浣跨敤鍏抽敭瀛?super 銆傝屽湪C++涓槸浣跨敤鐖剁被鐨勫悕縐板姞涓婃搷浣滅 ::琛ㄧず錛屼緥濡傦細(xì) void Manager::print() const { Employee::print(); /* 璋冪敤鐖剁被鐨勫嚱鏁?*/ cout << department << “\n”; } 涓涓?C++ 瀵硅薄鍙橀噺鍙兘瀛樺偍鐗瑰畾綾誨瀷鐨勫璞″箋傝鎯沖湪C++涓疄鐜板鎬?polymorphism)錛屽繀欏諱嬌鐢ㄦ寚閽堛備竴涓?T* 鎸囬拡鍙互鎸囧悜綾誨瀷涓?T 鎴?T 鐨勪換鎰忓瓙綾葷殑瀵硅薄錛屼緥濡傦細(xì) Employee* e = new Manager(”Morris, Melinda”, 83000, “Finance”); 浣犲彲浠ュ皢鐖剁被鍜屼笉鍚屽瓙綾葷殑瀵硅薄娣峰悎鏀墮泦鍒頒竴涓厓绱犲潎涓烘寚閽堢殑鍚戦噺涓紝鐒跺悗璋冪敤鍔ㄦ佺粦瀹氱殑鍑芥暟錛屽涓嬫墍紺猴細(xì) vector<Employee*> staff; . . . for (i = 0; i < staff.size(); i++) staff[i]->print();
2. 鍙橀噺鍜屽父閲?/h2>
3. 綾?/h2>
4. 瀵硅薄
5. 鍑芥暟
6. 鍚戦噺Vector
7. 杈撳叆鍜岃緭鍑?/h2>
8. 鎸囬拡pointer
9. 緇ф壙
]]>
{
d = (day)(d + 1);
return d;
}
浣跨敤榪欎釜鍑芥暟錛?琛ㄨ揪寮?++x 鎵嶆湁姝g‘鐨勬樉紺轟互鍙?qiáng)姝<嫯鐨勬搷浣溿?br>Passing by reference涓嶄粎浠呮槸鍐檕perator++杈冨ソ鐨勬柟娉曪紝鑰屾槸鍞竴鐨勬柟娉曘?br>
C++鍦ㄨ繖閲屽茍娌℃湁緇欐垜浠夋嫨鐨勪綑鍦般?br> 鍍忎笅闈㈢殑澹版槑:
day *operator++(day *d);
鏄笉鑳?閫氳繃緙栬瘧鐨勩?br>姣忎釜閲嶈澆鐨勬搷浣滅鍑芥暟蹇呴』鎴栬呮槸涓涓被鐨勬垚鍛橈紝 鎴栬呬嬌鐢ㄧ被鍨婽銆?T & 鎴?T const & 涓哄弬鏁扮被鍨嬶紝
榪欓噷T鏄竴涓被(class)鎴栧垪涓?enumeration)綾誨瀷銆?
涔熷氨鏄錛屾瘡涓涓噸杞芥搷浣滅蹇呴』浠ョ被鎴栧垪涓劇被鍨嬩負(fù)鍙傛暟綾誨瀷銆?br>
鎸囬拡錛屽嵆浣挎槸鎸囧悜涓涓被鎴栧垪涓劇被鍨嬪璞$殑鎸囬拡錛屼篃涓嶅彲浠ョ敤銆?br>
C++ 涓嶅厑璁稿湪閲嶈澆鎿嶄綔絎︽椂閲嶆柊瀹氫箟鍐呯疆鎿嶄綔絎︾殑鍚箟錛屽寘鎷寚閽堢被鍨嬨?br>鍥犳錛屾垜浠笉鍙互瀹氫箟錛?br>int operator++(int i); // 閿欒
鍥犱負(fù)瀹冭瘯鍥懼int閲嶆柊瀹氫箟鎿嶄綔絎?++ 鐨勫惈涔夈?鎴戜滑涔熶笉鍙互瀹氫箟錛?br>int *operator++(int *i); // 閿欒
鍥犱負(fù)瀹冭瘯鍥懼 int * 閲嶆柊瀹氫箟鎿嶄綔絎?++ 鐨勫惈涔?br>
C++ 涓笉鍏佽瀹氫箟”const reference”錛?br> 鍥犱負(fù)涓涓猺eference澶╃敓灝辨槸const銆備篃灝辨槸璇達(dá)紝涓鏃﹀皢涓涓猺eference緇戝畾鍒頒竴涓璞★紝灝辨棤娉曞啀灝嗗畠閲嶆柊緇戝畾鍒板彟涓涓笉鍚岀殑瀵硅薄銆?br>鍦ㄥ0 鏄庝竴涓猺eference涔嬪悗娌℃湁鍐欐硶鍙互灝嗗畠閲嶆柊緇戝畾鍒板彟澶栦竴涓璞°?br>渚嬪錛?br>int &ri = i;
灝?ri 緇戝畾鍒?i 銆傜劧鍚庝笅闈㈢殑璧嬪?
ri = j;
騫朵笉鏄妸 ri 緇戝畾鍒?j 錛岃屾槸灝?j 涓殑鍊艱祴緇?ri 鎸囧悜鐨勫璞★紝涔熷氨鏄祴緇?i 銆?br>
綆鑰岃█涔嬶紝
涓涓猵ointer鍦ㄥ畠鐨勬湁鐢熶箣騫村彲浠ユ寚鍚戣澶氫笉鍚岀殑瀵硅薄錛?br>鑰屼竴涓猺eference鍙兘澶熸寚鍚戜竴涓璞°?br>鏈変簺浜鴻涓鴻繖鎵嶆槸 reference鍜?pointer鏈澶х殑涓嶅悓銆?br>鎴戝茍涓嶈禐鎴愩備篃璁歌繖鏄痳eference涓巔ointer鐨勪竴鐐逛笉鍚岋紝 浣嗗茍涓嶆槸reference鍜宑onst pointer鐨勪笉鍚屻?br>鍦ㄥ己璋冧竴閬嶏紝涓鏃︿竴涓猺eference涓庝竴涓璞$粦瀹氾紝灝變笉鑳藉啀灝嗗畠鏀規(guī)寚鍚戝彟澶栫殑涓滆タ銆?br>鏃㈢劧涓嶈兘鍐嶇粦瀹歳eference涔嬪悗鍐?鏀瑰彉錛?涓涓猺eference灝卞繀欏誨湪涓鍑虹敓灝辮緇戝畾銆?br>鍚﹀垯榪欎釜reference灝辨案榪滀笉鑳借緇戝畾鍒頒換浣曚笢瑗匡紝涔熷氨姣棤鐢ㄥ浜嗐?/p>
涓婁竴孌電殑璁ㄨ涔熷悓鏍峰畬鍏ㄩ傜敤浜庡父閲忔寚閽堬紙const pointer錛夈?br>錛堟敞鎰忥紝鎴戣繖閲岃鐨勬槸甯擱噺鎸囬拡錛坈onst pointer錛夛紝 鑰屼笉鏄寚鍚戝父閲忕殑鎸囬拡 “pointers to const”銆?
渚嬪錛?br>涓涓猺eference澹版槑蹇呴』鍚屾椂甯︽湁涓涓垵濮嬪寲璧嬪鹼紝濡備笅鎵紺猴細(xì)
void f()
{
int &r = i;
…
}
鐪佺暐榪欎釜鍒濆鍖栬祴鍊煎皢浜х敓涓涓紪璇戦敊璇細(xì)
void f()
{
int &r; //閿欒
…
}
涓涓父閲忔寚閽堢殑澹版槑涔熷悓鏍峰繀欏誨甫鏈変竴涓垵濮嬪寲璧嬪鹼紝濡備笅鎵紺猴細(xì)
void f()
{
int *const p = &i;
…
}
鐪佺暐榪欎釜鍒濆鍖栬祴鍊煎悓鏍蜂細(xì)鍑洪敊錛?/p>
void f(){
int *const p; // 閿欒
…
}
鍦ㄦ垜鐪嬫潵
涓嶈兘澶熷reference浜屾緇戝畾浣滀負(fù)reference涓巔ointer鐨勪笉鍚屻?br>騫朵笉姣斿父閲忔寚閽堝拰闈炲父閲忔寚閽堢殑涓嶅悓鏇翠負(fù)鏄捐憲銆?br>
闄や簡鏄劇ず鐨勪笉鍚岋紝甯擱噺鎸囬拡涓巖eference榪樻湁涓鐐歸潪甯鎬笉鍚岋紝閭e氨鏄紝涓涓湁鏁堢殑reference蹇呴』鎸囧悜涓涓璞★紱鑰屼竴涓寚閽堜笉闇瑕併備竴涓寚閽堬紝鍗充嬌鏄竴涓父閲忔寚閽堬紝 閮藉彲浠ユ湁絀哄箋?涓涓┖鎸囬拡涓嶆寚鍚戜換浣曚笢瑗褲?/p>
榪欑偣涓嶅悓灝辨殫紺哄綋浣犳兂瑕佺‘淇′竴涓弬鏁板繀欏繪寚鍚戜竴涓璞$殑鏃跺欙紝搴旇浣跨敤reference浣滀負(fù)鍙傛暟綾誨瀷銆?渚嬪錛屼氦鎹㈠嚱鏁?swap function)錛屽畠鎺ュ彈涓や釜int鍙傛暟錛屽茍灝嗕袱涓弬鏁扮殑鏁板煎璋冿紝濡備笅鎵紺猴細(xì)
int i, j;
swap(i, j);
灝嗗師鏈湪 i 涓殑鍊兼斁鍒?j 涓紝 騫跺皢鍘熸湰鍦?j 涓殑鍊兼斁鍒?i 涓傛垜浠彲浠ヨ繖鏍峰啓榪欎釜鍑芥暟錛?/p>
void swap(int *v1, int *v2)
{
int temp = *v1;
*v1 = *v2;
*v2 = temp;
}
榪欑瀹氫箟涓嬶紝鍑芥暟瑕佸儚榪欐牱琚皟鐢? swap(&i, &j);
榪欎釜鎺ュ彛鏆楃ず鍏朵腑涓涓垨涓や釜鍙傛暟閮芥湁鍙兘涓虹┖(null)銆傝岃繖涓殫紺烘槸璇鐨勩備緥濡傦紝璋冪敤
swap(&i, NULL);
鐨勫悗鏋滃緢鍙兘鏄笉鎰夊揩鐨勩?/p>
鑰屽儚涓嬮潰榪欐牱瀹氫箟reference涓哄弬鏁幫細(xì)
void swap(int &v1, int &v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}
娓呮櫚鐨勮〃鏄庝簡璋冪敤swap搴旇鎻愪緵涓や釜瀵硅薄錛屽畠浠殑鍊煎皢琚氦鎹€?騫朵笖榪欐牱瀹氫箟鐨勫彟涓涓ソ澶勬槸錛屽湪璋冪敤榪欎釜鍑芥暟鐨勬椂鍊欙紝涓嶉渶瑕佷嬌鐢ㄩ偅浜?amp;絎﹀彿錛岀湅璧鋒潵鏇撮『鐪鹼細(xì)
swap(i, j);
闄や簡鏄劇ず鐨勪笉鍚岋紝
甯擱噺鎸囬拡涓巖eference榪樻湁涓鐐歸潪甯鎬笉鍚岋紝
閭e氨鏄紝涓涓湁鏁堢殑reference蹇呴』鎸囧悜涓涓璞★紱
鑰?span style="COLOR: red">涓涓寚閽堜笉闇瑕?/span>銆?br>涓涓寚閽堬紝鍗充嬌鏄竴涓父閲忔寚閽堬紝 閮藉彲浠ユ湁絀哄箋?涓涓┖鎸囬拡涓嶆寚鍚戜換浣曚笢瑗褲?br>
榪欑偣涓嶅悓灝辨殫紺哄綋浣犳兂瑕佺‘淇′竴涓弬鏁板繀欏繪寚鍚戜竴涓璞$殑鏃跺欙紝搴旇浣跨敤reference浣滀負(fù)鍙傛暟綾誨瀷銆?/span>
渚嬪錛?br>浜ゆ崲鍑芥暟(swap function)錛屽畠鎺ュ彈涓や釜int鍙傛暟錛屽茍灝嗕袱涓弬鏁扮殑鏁板煎璋冿紝濡備笅鎵紺猴細(xì)
int i, j;
swap(i, j);
灝嗗師鏈湪 i 涓殑鍊兼斁鍒?j 涓紝 騫跺皢鍘熸湰鍦?j 涓殑鍊兼斁鍒?i 涓傛垜浠彲浠ヨ繖鏍峰啓榪欎釜鍑芥暟錛?/p>
void swap(int *v1, int *v2)
{
int temp = *v1;
*v1 = *v2;
*v2 = temp;
}
榪欑瀹氫箟涓嬶紝鍑芥暟瑕佸儚榪欐牱琚皟鐢? swap(&i, &j);
榪欎釜鎺ュ彛鏆楃ず鍏朵腑涓涓垨涓や釜鍙傛暟閮芥湁鍙兘涓虹┖(null)銆傝岃繖涓殫紺烘槸璇鐨勩備緥濡傦紝璋冪敤
swap(&i, NULL);
鐨勫悗鏋滃緢鍙兘鏄笉鎰夊揩鐨勩?/p>
鑰屽儚涓嬮潰榪欐牱瀹氫箟reference涓哄弬鏁幫細(xì)
void swap(int &v1, int &v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}
娓呮櫚鐨勮〃鏄庝簡璋冪敤swap搴旇鎻愪緵涓や釜瀵硅薄錛屽畠浠殑鍊煎皢琚氦鎹€?騫朵笖榪欐牱瀹氫箟鐨勫彟涓涓ソ澶勬槸錛屽湪璋冪敤榪欎釜鍑芥暟鐨勬椂鍊欙紝涓嶉渶瑕佷嬌鐢ㄩ偅浜?amp;絎﹀彿錛岀湅璧鋒潵鏇撮『鐪鹼細(xì)
swap(i, j);
鏈変簺浜鴻涓烘棦鐒秗eference涓嶈兘澶熶負(fù)絀猴紝閭d箞瀹冨簲璇ユ瘮鎸囬拡鏇村畨鍏ㄣ?br> 鎴戣涓簉eference鍙兘瑕佸畨鍏ㄤ竴鐐癸紝浣嗕笉浼?xì)瀹夊叏寰堝銆?br>铏界劧涓涓湁鏁堢殑reference涓嶈兘涓虹┖錛屼絾鏄棤鏁堢殑鍙互鍛銆?br>瀹為檯涓婏紝鍦ㄥ緢澶氭儏鍐典笅紼嬪簭鏈夊彲 鑳戒駭鐢熸棤鏁堢殑reference錛岃屼笉鍙槸絀虹殑reference銆?/span>
渚嬪錛?/span>
浣犲彲浠ュ畾涔変竴涓猺eference錛屼嬌瀹冪粦瀹氬埌涓涓寚閽堟寚鍚戠殑瀵硅薄錛屽涓嬫墍紺猴細(xì)
int *p;
…
int &r = *p;
濡傛灉鎸囬拡*p鍦╮eference瀹氫箟鏃跺垰濂戒負(fù)絀猴紝鍒欒繖涓猺eference涓虹┖銆?br> 浠庢妧鏈笂鏉ヨ錛岃繖涓敊璇茍涓嶅湪浜庡皢reference緇戝畾鍒頒竴涓┖鍊鹼紝鑰屾槸鍦ㄤ簬瀵逛竴涓┖鎸囬拡鍘誨弬鑰冦?br> 瀵逛竴涓┖鎸囬拡鍘誨弬鑰冧駭鐢熶簡涓涓笉紜畾鐨勬搷浣滐紝涔熷氨鎰忓懗鐫寰堝浜嬮兘鍙兘鍙戠敓錛岃屼笖澶ч儴鍒嗛兘涓嶆槸浠涔堝ソ浜嬨傚緢鏈夊彲鑳藉綋紼嬪簭灝唕eference r 緇戝畾鍒?p (p鎵鎸囧悜鐨勫璞?鐨勬椂鍊欙紝p瀹為檯涓婃病鏈夎鍘誨弬鑰冿紝鐢氳嚦紼嬪簭鍙槸灝唒鐨勫兼嫹璐濈粰瀹炵幇r鐨勬寚閽堛?br>鑰岀▼搴忓皢浼?xì)鐟艟l墽琛屼笅鍘葷洿鍒伴敊璇湪鍚庨潰鐨勮繍琛屼腑鏇翠負(fù)鏄庢樉鐨勮〃 鐜板嚭鏉ワ紝浜х敓涓嶅彲棰勭煡鐨勫嵄瀹熾?/p>
涓嬮潰鐨勫嚱鏁?br>灞曠ず浜?br>鍙﹀涓縐嶄駭鐢熸棤鏁坮eference鐨勬柟娉曪細(xì)
int &f()
{
int i;
…
return i;
}
榪欎釜鍑芥暟榪斿洖涓涓寚鍚戞湰鍦板彉閲?i 鐨剅eference銆?br>鐒惰屽綋鍑芥暟榪斿洖鏃訛紝鏈湴鍙橀噺 i 鐨勫瓨鍌ㄧ┖闂翠篃灝辨秷澶變簡銆傚洜姝よ繖涓嚱鏁板疄闄呰繑鍥炰簡涓涓寚鍚戣鍥炴敹浜嗙殑絀洪棿鐨剅eference銆傝繖涓搷浣滀笌榪斿洖涓涓寚鍚戞湰鍦板彉閲忕殑鎸囬拡鐨勫悗鏋滅浉鍚屻?br>鏈変簺緙栬瘧 鍣ㄥ彲浠ュ湪緙栬瘧鏃跺彂鐜拌繖涓敊璇紝浣嗕篃寰堟湁鍙兘涓嶄細(xì)鍙戠幇銆?br>
鎴戝枩嬈eference錛屼篃鏈夊緢濂界殑鐞嗙敱浣跨敤瀹冧滑浠f浛pointer銆?br>
浣嗗鏋滀綘鏈熸湜浣跨敤reference鏉ヤ嬌浣犵殑紼嬪簭鍋ュ.鎬ф樉钁楀寮猴紝閭d箞浣犲鍗婁細(xì)澶辨湜鐨?br>
鍦╒isual C++涓畾涔変竴鑸殑鍑芥暟涓烘湅鍙嬪嚱鏁伴氬父鏄病鏈夐棶棰樼殑銆?br>鐒惰屽鏌愪簺閲嶈澆鎿嶄綔絎︾殑鍑芥暟錛?br>鍗充嬌鎴戜滑灝嗗畠浠畾涔変負(fù)綾葷殑鏈嬪弸鍑芥暟錛孷C鐨勭紪璇戝櫒浠嶇劧浼?xì)鏄窘C哄嚭閿欎俊鎭紝
璁や負(fù)榪欎簺鏈嬪弸鍑芥暟鏃犳潈璁塊棶綾葷殑縐佹湁鎴愬憳銆?br>鎴戣涓鴻繖搴旇鏄疺C6.0鐨刡ug銆?br>
浠ヤ笅浠g爜灝辨槸涓緥瀛?
// 澶存枃浠?“Sample.h”
#include<iostream>
using namespace std;
class Sample {
public:
Sample();
friend ostream &operator<<(ostream &out, const Sample s);
friend istream &operator>>(istream &in, Sample & s);
private:
int x;
};
|
// 瀹炵幇鏂囦歡 “Sample.cpp”
#include “Sample.h”
Sample::Sample() {
x=0;
}
istream &operator>>(istream &in, Sample & s) {
cout<<”Please enter a value”<<endl;
in >> s.x ;
return in;
}
ostream &operator<<(ostream &out, const Sample s) {
cout << s.x << endl;
return out;
}
|
浠ヤ笂浠g爜鍦╣nuc++涓紪璇戣繍琛屾鏃犻棶棰樸備絾鏄湪VC++6.0涓紪璇戠殑鏃跺欏氨浼?xì)鍑虹庮C互涓嬬殑緙栬瘧閿欒錛?/p>
| Compiling… Sample.cpp c:\temp\sample.cpp(8) : error C2248: ‘x’ : cannot access private member declared in class ‘Sample’ c:\temp\sample.h(19) : see declaration of ‘x’ c:\temp\sample.cpp(13) : error C2248: ‘x’ : cannot access private member declared in class ‘Sample’ c:\temp\sample.h(19) : see declaration of ‘x’ Error executing cl.exe.Sample.obj - 2 error(s), 0 warning(s) |
鍦╒C++ 6.0涓В鍐寵繖涓棶棰樻湁浠ヤ笅鍑犵鏂規(guī)硶錛?/p>
// 淇敼鍚庣殑澶存枃浠?1 “Sample.h”
#include<iostream>
using namespace std;
class Sample {
public:
Sample();
friend ostream &operator<<(ostream &out, const Sample s);
friend ostream &operator<<(ostream &out, const Sample s) {
cout << s.x << endl;
return out;
}
friend istream &operator>>(istream &in, Sample & s);
friend istream &operator>>(istream &in, Sample & s) {
cout<<”Please enter a value”<<endl;
in >> s.x ;
return in;
}
private:
int x;
};
|
// 淇敼鍚庣殑澶存枃浠?2 “Sample.h”
#include<iostream>
using namespace std;
// 浠ヤ笅3琛屼唬鐮佷負(fù)鏂板姞鍏?
class Sample;
ostream &operator<<(ostream &out, const Sample s);
istream &operator>>(istream &in, Sample & s);
class Sample {
public:
Sample();
friend ostream &operator<<(ostream &out, const Sample s);
friend istream &operator>>(istream &in, Sample & s);
private:
int x;
};
|
// Sample.h
#include<iostream>
using std::istream;
using std::ostream;
class Sample {
public:
Sample();
friend ostream &operator<<(ostream &out, const Sample s);
/*friend ostream &operator<<(ostream &out, const Sample s) {
cout << s.x << endl;
return out;
}*/
friend istream &operator>>(istream &in, Sample & s);
/*friend istream &operator>>(istream &in, Sample & s) {
cout<<”Please enter a value”<<endl;
in >> s.x ;
return in;
}*/
private:
int x;
};
|
// “Sample.cpp”
#include “Sample.h”
using namespace std;
Sample::Sample() {
x=5;
}
istream &operator>>(istream &in, Sample & s) {
cout<<”Please enter a value”<<endl;
in >> s.x ;
return in;
}
ostream &operator<<(ostream &out, const Sample s) {
cout << s.x << endl;
return out;
}
|
reinterpret_cast 鍙互灝嗕竴涓寚閽堣漿鎹負(fù)浠繪剰鍏跺畠綾誨瀷鐨勬寚閽?/span>銆?br>瀹冧篃鍙互鐢ㄦ潵灝嗕竴涓寚閽堣漿鎹負(fù)涓涓暣鍨嬶紝鎴栧弽涔嬩害鐒躲?/p>
榪欎釜鎿嶄綔絎﹀彲浠ュ湪浜掍笉鐩稿叧鐨勭被涔嬮棿榪涜鎸囬拡杞崲錛?br>鎿嶄綔鐨勭粨鏋滄槸綆鍗曠殑灝嗕竴涓寚閽堢殑浜岃繘鍒舵暟鎹?binary copy)澶嶅埗鍒板彟涓涓寚閽堛?br>瀵規(guī)寚閽堟寚鍚戠殑鍐呭涓嶅仛浠諱綍媯(gè)鏌ユ垨杞崲銆?br> 渚嬪錛?/p>
reinterpret_cast 瀵規(guī)墍鏈夋寚閽堢殑澶勭悊涓庝紶緇熺殑綾誨瀷杞崲絎︽墍浣滅殑涓妯′竴鏍楓?br> static_cast 鍙互鎵ц鎵鏈夎兘澶熼殣鍚墽琛岀殑綾誨瀷杞崲錛屼互鍙?qiáng)瀹冧滑鐨勫弽鍚戞搷浣滃Q堝嵆浣胯繖縐嶆柟鍚戞搷浣滄槸涓嶅厑璁?dāng)R殣鍚墽琛岀殑錛夈?/p>
鐢ㄤ簬綾葷殑鎸囬拡錛屼篃灝辨槸璇達(dá)紝瀹冨厑璁稿皢涓涓紩鐢崇被鐨勬寚閽堣漿鎹負(fù)鍏跺熀綾葷被鍨嬶紙榪欐槸鍙互琚殣鍚墽琛岀殑鏈夋晥杞崲錛夛紝鍚屾椂涔熷厑璁歌繘琛岀浉鍙嶇殑杞崲錛氬皢涓涓熀綾昏漿鎹負(fù)涓涓紩鐢崇被綾誨瀷銆?/p>
鍦ㄥ悗闈竴縐嶆儏鍐典腑錛?span style="COLOR: red">涓嶄細(xì)媯(gè)鏌ヨ杞崲鐨勫熀綾繪槸鍚︾湡姝e畬鍏ㄦ槸鐩爣綾誨瀷鐨?/span>銆備緥濡備笅闈㈢殑浠g爜鏄悎娉曠殑錛?/p>
static_cast闄や簡鑳藉瀵圭被鎸囬拡榪涜鎿嶄綔錛岃繕鍙互琚敤鏉ヨ繘琛岀被涓槑紜畾涔夌殑杞崲錛屼互鍙?qiáng)瀵瑰熀鏈c誨瀷鐨勬爣鍑嗚漿鎹細(xì) 璇戣呮敞錛氬鏋滀綘瀵硅繖閮ㄥ垎鐪嬩笉澶噦錛岃緇撳悎涓嬮潰鐨刣ynamic_cast涓璧風(fēng)湅錛屼篃璁鎬細(xì)甯姪鐞嗚В銆?/p>
dynamic_cast 瀹屽叏琚敤鏉ヨ繘琛屾寚閽堢殑鎿嶄綔銆傚畠鍙互鐢ㄦ潵榪涜浠諱綍鍙互闅愬惈榪涜鐨勮漿鎹㈡搷浣滀互鍙?qiáng)瀹冧滑琚敤浜庡鎬佺被鎯呭喌涓嬬殑鏂瑰悜鎿嶄綔銆?br> 榪欑媯(gè)鏌ユ槸鍦ㄧ▼搴忚繍琛岃繃紼嬩腑榪涜鐨勩傚鏋滆杞崲鐨勬寚閽堟墍鎸囧悜鐨勫璞′笉鏄竴涓瑕佹眰綾誨瀷鐨勬湁鏁堝畬鏁寸殑瀵硅薄錛岃繑鍥炲煎皢浼?xì)鏄竴涓┖鎸囬拡NULL 銆?/p>
濡傛灉綾誨瀷杞崲琚敤鍦ㄥ紩鐢?reference)綾誨瀷涓婏紝鑰岃繖涓漿鎹笉鍙兘榪涜鐨勮瘽錛屼竴涓猙ad_cast 綾誨瀷鐨勪緥澶?exception)灝嗕細(xì)琚姏鍑猴細(xì) 榪欑綾誨瀷杞崲瀵瑰父閲廲onst 榪涜璁劇疆鎴栧彇娑堟搷浣滐細(xì) 鍏朵粬3縐峜ast 鎿嶄綔絎﹂兘涓嶅彲浠ヤ慨鏀逛竴涓璞$殑甯擱噺灞炴?constness)銆?/p>
ANSI-C++ 榪樺畾涔変簡涓涓柊鐨勬搷浣滅鍙仛 typeid 錛?br>瀹冩鏌ヤ竴涓〃杈懼紡鐨勭被鍨嬶細(xì) 榪欎釜鎿嶄綔絎﹁繑鍥炰竴涓被鍨嬩負(fù)type_info鐨勫父閲忓璞℃寚閽堬紝榪欑綾誨瀷瀹氫箟鍦ㄦ爣鍑嗗ご鍑芥暟
class B {};
A * a = new A;
B * b = reinterpret_cast<B*>(a);
_________________________________________________________________static_cast
class Derived: public Base {};
Base * a = new Base;
Derived * b = static_castdouble d=3.14159265;
int i = static_cast<int>(d); dynamic_cast
鐒惰屼笌static_cast涓嶅悓鐨勬槸錛?br> dynamic_cast 浼?xì)妫鏌ュ悗涓縐嶆儏鍐電殑鎿嶄綔鏄惁鍚堟硶錛?br>涔熷氨鏄瀹冧細(xì)媯(gè)鏌ョ被鍨嬭漿鎹㈡搷浣滄槸鍚︿細(xì)榪斿洖涓涓瑕佹眰綾誨瀷鐨勬湁鏁堢殑瀹屾暣鐨勫璞°?/span> class Base { virtual dummy(){}; };
class Derived : public Base { };
Base* b1 = new Derived;
Base* b2 = new Base;
Derived* d1 = dynamic_cast class Base { virtual dummy(){}; };
class Derived : public Base { };
Base* b1 = new Derived;
Base* b2 = new Base;
Derived d1 = dynamic_castconst_cast
const C * a = new C;
C * b = const_cast<C*> (a); typeid
typeid (expression)
涔熷彲浠ョ敤鏉ラ氳繃name()鍑芥暟鑾峰緱涓涓弿榪版暟鎹被鍨嬫垨綾誨悕縐扮殑瀛楃涓詫紝
渚嬪錛?/typeinfo>
// typeid, typeinfo
#include <iostream.h>
#include <typeinfo>
class CDummy { };
int main () {
CDummy* a,b;
if (typeid(a) != typeid(b)) {
cout << "a and b are of different types:\n";
cout << "a is: " << typeid(a).name() << '\n';
cout << "b is: " << typeid(b).name() << '\n';
}
return 0;
}
a and b are of different types:
a is: class CDummy *
b is: class CDummy
鎴戜滑鑳藉鎵懼埌鐨勫叧浜庡悕絀洪棿鐨勬渶濂界殑渚嬪瓙灝辨槸鏍囧噯C++ 鍑芥暟搴撴湰韜?br>
濡侫NSI C++ 鏍囧噯瀹氫箟錛?br>鏍囧噯C++搴撲腑鐨勬墍鏈夌被銆佸璞″拰鍑芥暟閮芥槸瀹氫箟鍦ㄥ悕絀洪棿std涓嬮潰鐨勩?br>
浣犲彲鑳藉凡緇忔敞鎰忓埌錛屾垜浠湪榪欎釜鏁欑▼涓叏閮ㄥ拷鐣ヤ簡榪欎竴鐐廣備綔鑰呭喅瀹氳繖涔堝仛鏄洜涓鴻繖鏉¤鍒欏嚑涔庡拰ANSI 鏍囧噯鏈韓涓鏍峰勾杞?(1997) 錛岃澶氳佷竴鐐圭殑緙栬瘧鍣ㄥ茍涓嶅吋瀹硅繖鏉¤鍒欍?br>
鍑犱箮鎵鏈夌殑緙栬瘧鍣紝鍗充嬌鏄偅浜涗笌ANSI 鏍囧噯鍏煎鐨勭紪璇戝櫒錛岄兘鍏佽浣跨敤浼犵粺鐨勫ご鏂囦歡 (濡俰ostream.h, stdlib.h, 絳夌瓑)錛屽氨鍍忔垜浠湪榪欎釜鏁欑▼涓墍浣跨敤鐨勪竴鏍楓?br>
鐒惰岋紝ANSI鏍囧噯瀹屽叏閲嶆柊璁捐浜嗚繖浜涘嚱鏁板簱錛?br>鍒╃敤浜嗘ā鏉垮姛鑳斤紝
鑰屼笖閬靛驚浜嗚繖鏉¤鍒欏皢鎵鏈夌殑鍑芥暟鍜屽彉閲忓畾涔夊湪浜嗗悕絀洪棿std涓嬨?br>
璇ユ爣鍑嗕負(fù)榪欎簺澶存枃浠跺畾涔変簡鏂扮殑鍚嶅瓧錛屽閽堝C++鐨勬枃浠跺熀鏈笂鏄嬌鐢ㄥ悓鏍風(fēng)殑鍚嶅瓧錛屼絾娌℃湁.h鐨勬墿灞曞悕錛?br>
渚嬪, iostream.h 鍙樻垚浜唅ostream銆?/p>
濡傛灉鎴戜滑浣跨敤ANSI-C++ 鍏煎鐨勫寘鍚枃浠訛紝鎴戜滑蹇呴』璁頒綇鎵鏈夌殑鍑芥暟銆佺被鍜屽璞℃槸瀹氫箟鍦ㄥ悕絀洪棿 std 涓嬮潰鐨勶紝渚嬪錛?/p>
// ANSI-C++ compliant hello world
#include <iostream>
int main () {
std::cout << "Hello world in ANSI-C++\n";
|
Hello world in ANSI-C++ |
鏇村父鐢ㄧ殑鏂規(guī)硶鏄嬌鐢╱sing namespace 錛岃繖鏍鋒垜浠氨涓嶅繀鍦ㄦ墍鏈夋爣鍑嗙┖闂翠腑瀹氫箟鐨勫嚱鏁版垨瀵硅薄鍓嶉潰鎬繪槸浣跨敤鑼冨洿鎿嶄綔絎?:浜?錛?/p>
// ANSI-C++ compliant hello world (II)
#include <iostream>
using namespace std;
int main () {
cout << "Hello world in ANSI-C++\n";
return 0;
}
|
Hello world in ANSI-C++ |
瀵逛簬STL 鐢ㄦ埛錛屽己鐑堝緩璁嬌鐢ˋNSI-compliant 鏂瑰紡鏉ュ寘鍚爣鍑嗗嚱鏁板簱銆?
template <class T> // 鏈甯哥敤鐨勶細(xì)涓涓猚lass 鍙傛暟銆?/font>
template <class T, class U> // 涓や釜class 鍙傛暟銆?/font>
template <class T, int N> // 涓涓猚lass 鍜屼竴涓暣鏁般?/font>
template <class T = char> // 鏈変竴涓粯璁ゅ箋?/font>
template <int Tfunc (int)> // 鍙傛暟涓轟竴涓嚱鏁般?/font>
浠庣紪璇戝櫒鐨勮搴︽潵鐪嬶紝妯℃澘涓嶅悓浜庝竴鑸殑鍑芥暟鎴栫被銆?br>瀹冧滑鍦ㄩ渶瑕佹椂鎵嶈緙栬瘧(compiled on demand)錛?br>涔熷氨鏄涓涓ā鏉跨殑浠g爜鐩村埌闇瑕佺敓鎴愪竴涓璞$殑鏃跺?instantiation)鎵嶈緙栬瘧銆?br>褰撻渶瑕乮nstantiation鐨勬椂鍊欙紝緙栬瘧鍣ㄦ牴鎹ā鏉夸負(fù)鐗瑰畾鐨勮皟鐢ㄦ暟鎹被鍨嬬敓鎴愪竴涓壒孌婄殑鍑芥暟銆?br>
褰撳伐紼嬪彉寰楄秺鏉ヨ秺澶х殑鏃跺欙紝紼嬪簭浠g爜閫氬父浼?xì)琚垎鍓蹭负澶氫釜婧惤E嬪簭鏂囦歡銆?br>鍦ㄨ繖縐嶆儏鍐典笅錛?span style="COLOR: red">閫氬父鎺ュ彛(interface)鍜屽疄鐜?implementation)鏄垎寮鐨?/span>銆?br>
鐢ㄤ竴涓嚱鏁板簱鍋氫緥瀛?br> 鎺ュ彛閫氬父鍖呮嫭鎵鏈夎兘琚皟鐢ㄧ殑鍑芥暟鐨勫師鍨嬪畾涔夈?br> 瀹冧滑閫氬父琚畾涔夊湪浠?h 涓烘墿灞曞悕鐨勫ご鏂囦歡 (header file) 涓紱
鑰屽疄鐜?(鍑芥暟鐨勫畾涔?
鍒欏湪鐙珛鐨凜++浠g爜鏂囦歡涓?br>
妯℃澘榪欑綾諱技瀹?macro-like) 鐨勫姛鑳斤紝瀵瑰鏂囦歡宸ョ▼鏈変竴瀹氱殑闄愬埗錛?/span> 鍥炲埌鍑芥暟搴撶殑渚嬪瓙錛屽鏋滄垜浠兂瑕佸緩绔嬩竴涓嚱鏁版ā鏉跨殑搴擄紝鎴戜滑涓嶈兘鍐嶄嬌鐢ㄥご鏂囦歡(.h) 錛屽彇鑰屼唬涔嬶紝鎴戜滑搴旇鐢熸垚涓涓ā鏉挎枃浠?template file)錛屽皢鍑芥暟妯℃澘鐨勬帴鍙e拰瀹炵幇 閮芥斁鍦ㄨ繖涓枃浠朵腑 (榪欑鏂囦歡娌℃湁鎯敤鎵╁睍鍚嶏紝闄や簡涓嶈浣跨敤.h鎵╁睍鍚嶆垨涓嶈涓嶅姞浠諱綍鎵╁睍鍚?銆?br>
鍑芥暟鎴栫被妯℃澘鐨勫疄鐜?(瀹氫箟) 蹇呴』涓庡師鍨嬪0鏄庡湪鍚屼竴涓枃浠朵腑銆?br>涔熷氨鏄鎴戜滑涓嶈兘鍐?灝嗘帴鍙?interface)瀛樺偍鍦ㄥ崟鐙殑澶存枃浠朵腑錛?br>鑰屽繀欏誨皢鎺ュ彛鍜屽疄鐜版斁鍦ㄤ嬌鐢ㄦā鏉跨殑鍚屼竴涓枃浠朵腑銆?/p>
鍦ㄤ竴涓伐紼嬩腑澶氭鍖呭惈鍚屾椂鍏鋒湁澹版槑鍜屽疄鐜扮殑妯℃澘鏂囦歡騫朵笉浼?xì)漶旂敓閾炬帴閿欒?(linkage errors)錛屽洜涓哄畠浠彧鏈夊湪闇瑕佹椂鎵嶈緙栬瘧錛岃屽吋瀹規(guī)ā鏉跨殑緙栬瘧鍣ㄥ簲璇ュ凡緇忚冭檻鍒拌繖縐嶆儏鍐碉紝涓嶄細(xì)鐢熸垚閲嶅鐨勪唬鐮併?/span>
]]>
鍦ㄦ彁閱掍竴嬈★紝瀹冨叾瀹炴槸涓涓叏鍩熷彉閲忋傚敮涓鐨勪笉鍚屾槸瀹冪殑鍚嶅瓧璺熷湪class鐨勫悗闈€?/p>
灝卞儚鎴戜滑浼?xì)鍦╟lass涓寘鍚玸tatic鏁版嵁涓鏍鳳紝鎴戜滑涔熷彲浠ヤ嬌瀹冨寘鍚玸tatic 鍑芥暟銆?br>瀹冧滑琛ㄧず鐩稿悓鐨勫惈涔夛細(xì)static鍑芥暟鏄叏鍩熷嚱鏁?global functions)錛屼絾鏄儚涓涓寚瀹歝lass鐨勫璞℃垚鍛樹竴鏍瘋璋冪敤銆?br>瀹冧滑鍙兘澶熷紩鐢╯tatic 鏁版嵁錛屾案榪滀笉鑳藉紩鐢╟lass鐨勯潪闈欐?nonstatic)鎴愬憳銆?br>瀹冧滑涔熶笉鑳藉浣跨敤鍏抽敭瀛梩his錛屽洜涓簍his瀹為檯寮曠敤浜嗕竴涓璞℃寚閽堬紝
浣嗚繖浜?static鍑芥暟鍗翠笉鏄換浣昽bject鐨勬垚鍛橈紝鑰屾槸class鐨勭洿鎺ユ垚鍛樸?/p>
class CExample {
public:
int a,b,c;
void multiply (int n, int m) { a=n; b=m; c=a*b; };
};
娌℃湁瀹氫箟鏋勯犲嚱鏁幫紝
緙栬瘧鍣ㄨ嚜鍔ㄥ亣璁懼畠鏈変互涓媍onstructor 鎴愬憳鍑芥暟錛?/p>
- Empty constructor
瀹冩槸涓涓病鏈変換浣曞弬鏁扮殑鏋勯犲嚱鏁幫紝琚畾涔変負(fù)nop (娌℃湁璇彞)銆傚畠浠涔堥兘涓嶅仛銆?/p>
CExample::CExample () { };
-
- Copy constructor
瀹冩槸涓涓彧鏈変竴涓弬鏁扮殑鏋勯犲嚱鏁幫紝璇ュ弬鏁版槸榪欎釜class鐨勪竴涓璞★紝榪欎釜鍑芥暟鐨勫姛鑳芥槸灝嗚浼犲叆鐨勫璞★紙object錛夌殑鎵鏈夐潪闈欐侊紙non-static錛夋垚鍛樺彉閲忕殑鍊奸兘澶嶅埗緇欒嚜韜繖涓猳bject銆?/p>
CExample::CExample (const CExample& rv) {
a=rv.a; b=rv.b; c=rv.c;
}
蹇呴』娉ㄦ剰錛?/strong>榪欎袱涓粯璁ゆ瀯閫犲嚱鏁幫紙empty construction 鍜?copy constructor 錛?/p>
鍙湁鍦ㄦ病鏈夊叾瀹冩瀯閫犲嚱鏁拌鏄庣‘瀹氫箟鐨勬儏鍐典笅鎵嶅瓨鍦ㄣ?/p>
濡傛灉浠諱綍鍏跺畠鏈変換鎰忓弬鏁扮殑鏋勯犲嚱鏁拌瀹氫箟浜嗭紝榪欎袱涓瀯閫犲嚱鏁板氨閮戒笉瀛樺湪浜嗐?/p>
鍦ㄨ繖縐嶆儏鍐典笅錛?/p>
濡傛灉浣犳兂瑕佹湁empty construction 鍜?copy constructor 錛?/p>
灝卞繀闇瑕佽嚜宸卞畾涔夊畠浠?/p>
鍙互璁や負(fù)鍑芥暟綾誨瀷鐨勫湴鍧綾誨瀷鐨勬暟瀛楃紪璇戝櫒浼?xì)闅愬紡铦{鎹㈡垚鎸囬拡綾誨瀷鐨勬暟瀛?/p>
閲嶈澆鍑芥暟琛ㄧず鍑芥暟鍚嶅瓧涓鏍鳳紝浣嗗弬鏁扮被鍨嬪強(qiáng)涓暟涓嶅悓鐨勫涓嚱鏁?/p>
澹版槑鏄憡璇夌紪璇戝櫒涓浜涗俊鎭紝浠ュ崗鍔╃紪璇戝櫒榪涜璇硶鍒嗘瀽錛岄伩鍏嶇紪璇戝櫒鎶ラ敊銆傝屽畾涔夋槸鍛婅瘔緙栬瘧鍣ㄧ敓鎴愪竴浜涗唬鐮侊紝騫朵笖榪欎簺浠g爜灝嗙敱榪炴帴鍣ㄤ嬌鐢ㄣ?/p>
extern long a, *pA, &ra;
涓婇潰灝卞0鏄庯紙涓嶆槸瀹氫箟錛変簡涓変釜鍙橀噺a銆乸A鍜宺a銆?br>鍥犱負(fù)extern琛ㄧず澶栭儴鐨勬剰鎬濓紝鍥犳涓婇潰灝辮璁や負(fù)鏄憡璇夌紪璇戝櫒鏈変笁涓閮ㄧ殑鍙橀噺錛屼負(fù)a銆乸A鍜宺a錛屾晠琚涓烘槸澹版槑璇彞錛屾墍浠ヤ笂闈㈠皢涓嶅垎閰嶄換浣曞唴瀛樸?br>鍚屾牱錛屽浜庡嚱鏁幫紝瀹冧篃鏄竴鏍風(fēng)殑錛?br> extern void ABC( long ); 鎴?nbsp; extern long AB( short b );
鍦板潃綾誨瀷鐨勬暟瀛楁槸鍦ㄧ紪璇戞椂鏈熺粰緙栬瘧鍣ㄧ敤鐨?br>鎸囬拡綾誨瀷鐨勬暟瀛楁槸鍦ㄨ繍琛屾椂鏈熺粰浠g爜鐢ㄧ殑
鏍規(guī)嵁鐢ㄦ埛杈撳叆鐨勪笉鍚岃屽彲鑳界敵璇蜂笉鍚屽ぇ灝忕殑鍐呭瓨鏃訛紝鍒欑О姝ゅ唴瀛樻槸鍔ㄦ佸垎閰嶇殑錛屽悗闈㈣鐨勪粠鍫嗕笂鍒嗛厤灝卞睘浜庡姩鎬佸垎閰嶃?/p>
鍚屾牱錛岄潤鎬佸垎閰嶇殑鍐呭瓨鍒╃敤鐜囦笉楂樻垨榪愮敤涓嶅鐏墊椿錛屼絾浠g爜瀹規(guī)槗緙栧啓涓旇繍琛岄熷害杈冨揩錛涘姩鎬佸垎閰嶇殑鍐呭瓨鍒╃敤鐜囬珮錛屼笉榪囩紪鍐欎唬鐮佹椂瑕佸鏉備簺錛岄渶鑷繁澶勭悊鍐呭瓨鐨勭鐞嗭紙鍒嗛厤鍜岄噴鏀撅級(jí)涓旂敱浜庤繖縐嶇鐞嗙殑浠嬪叆鑰岃繍琛岄熷害杈冩參騫朵唬鐮侀暱搴﹀鍔犮?br>闈欐佸拰鍔ㄦ佺殑鎰忎箟涓嶄粎浠呭姝わ紝鍏舵湁寰堝鐨勬繁鍖栵紝濡傜‖緙栫爜鍜岃蔣緙栫爜銆佺揣鑰﹀悎鍜屾澗鑰﹀悎錛岄兘鏄潤鎬佸拰鍔ㄦ佺殑娣卞寲銆?br>
澶氬瓧鑺傚瓧絎︿覆錛圡ultiByte錛夛紝鐢ㄨ繖縐嶈〃紺烘柟寮忚褰曠殑鏂囨湰鏂囦歡縐頒負(fù)鏄疢BCS鏍煎紡鐨?br>
瀹藉瓧鑺傚瓧絎︿覆錛圵ideChar錛夛紝鐢ㄨ繖縐嶈〃紺烘柟寮忚褰曠殑鏂囨湰鏂囦歡縐頒負(fù)鏄疷nicode鏍煎紡鐨?br> (涓涓猻hort綾誨瀷鐨勬暟瀛楁潵琛ㄧず錛屽嵆姣忎釜瀛楃鐨勯暱搴﹀浐瀹氫負(fù)2瀛楄妭)
http://www.dinkumware.com/exam/default.aspx
http://www.comeaucomputing.com/tryitout/
璁稿鍦ㄧ嚎鍒ら緋葷粺涔熷彲浠ョ敤鏉ヨ繘琛屽湪綰跨紪璇戯細(xì)
http://acm.zju.edu.cn/
http://acm.pku.edu.cn/JudgeOnline/
http://acm.uva.es/
浣犲彲鑳戒細(xì)濂藉榪欎簺緗戠珯浣跨敤鐨勭紪璇戝櫒鐨勭増鏈拰緙栬瘧鍙傛暟鍒板簳鏄粈涔堛傛湁浜涚綉绔欎細(xì)鎻愪緵榪欎簺淇℃伅錛岃屾湁浜涘垯涓嶄細(xì)銆傞偅涔堜綘灝卞彧鑳介潬鑷繁鍘誨彂鐜拌繖浜?#8220;縐樺瘑”浜嗐?/p>
宸ユ鍠勫叾浜嬶紝蹇呭厛鍒╁叾鍣ㄣ傝鎴戜滑鍏堢湅鐪嬩竴浜涗粠緙栬瘧鍣ㄨ幏鍙栦俊鎭殑灝忔妧宸с?/p>
1. 杈撳嚭瀹?br>鍦–++涓紝 瀛楃涓插父鏁頒笉鑳戒綔涓烘ā鏉垮弬鏁般傚ぇ澶氭暟緙栬瘧鍣ㄤ細(xì)鍦ㄩ敊璇俊鎭腑鍚屾椂杈撳嚭瀛楃涓茬殑鍐呭銆備笅闈㈢殑浠g爜灞曠ず浜嗚繖涓鎶宸с?
template<const char *> class A {};
#define F0(x) #x
#define F1(x) F0(x)
#define V1 F1(__GNUC__)
int main()
{
A<V1> a1;
}
榪欓噷錛屽畯F0鍜孎1鐢ㄤ簬灝嗘暣鍨嬭漿鎹㈡垚瀛楃涓層傜紪璇戝櫒浼?xì)杈撳嚭绫讳奸g簬"literal "3" is not a valid template argument because it is the address of an object with static linkage"鐨勫嚭閿欎俊鎭傞噷闈㈢殑"3"灝辨槸浣犳兂鐭ラ亾鐨勫畯鐨勫唴瀹廣?
2. 杈撳嚭甯告暟
鍚屾牱錛屾誕鐐規(guī)暟鏄笉鑳戒綔涓烘ā鏉垮弬鏁扮殑銆傜紪璇戝櫒閫氬父浼?xì)鍦ㄩ敊璇俊鎭腑鍖呭惈嬲Q鐐規(guī)暟鐨勫箋傚埄鐢ㄨ繖涓鐐癸紝鎴戜滑鍙互杈撳嚭嫻偣甯告暟銆備笉榪囧緢涓嶅垢鐨勬槸錛孷C浼?xì)闅愬紡鐨劄畣嬲Q鐐圭被鍨嬬殑妯℃澘鍙傛暟杞崲鎴恑nt錛堝弬瑙?a >https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=296008錛?br>涓嬮潰鏄竴縐嶈緭鍑烘暣鍨嬪父閲忕殑鏂規(guī)硶錛?
template<int N>
class A
{
private:
A();
};
int main()
{
A<sizeof(char)> a;
}
3. 杈撳嚭鍙橀噺綾誨瀷
鏈夋椂鍊欙紝浣犲彲鑳介渶瑕佺煡閬撴煇浜涘彉閲忕殑瀹為檯綾誨瀷錛岃繖鏃跺欎綘鍙互浣跨敤涓嬮潰鐨勪唬鐮侊細(xì)
struct Dummy {};
void Fun(const Dummy &);
int main()
{
Fun(1+1U);
}
PS錛氬鏋滀綘浣跨敤鐨勬槸gcc錛岄偅涔堝畠浼?xì)杈撳?not convert `2' to `const Dummy&'"錛屾墍浠ヤ綘闇瑕佸皢Fun鐨勫0鏄庢敼鎴?template<typename T> void Fun(T);"錛堟崲鍙ヨ瘽璇達(dá)紝鍦╣cc涓笂闈㈢殑浠g爜涔熷彲浠ョ敤浜庤緭鍑哄父鏁扮殑鍊鹼級(jí)
4. 杈撳嚭鍖呭惈璺緞
濡傛灉瑕佽幏鍙朣TL澶存枃浠剁殑璺緞錛屼綘鍙互浣跨敤錛?
#include <ext/hash_set>
using __gnu_cxx::hash_set;
int main()
{
hash_set<> m;
}
PS錛氳繖閲屼篃鍙互浣跨敤vector銆?
濂斤紝鐜板湪鏄椂鍊欑墰鍒灝忚瘯浜嗐傚叧浜庡浣曡幏鍙栫紪璇戝櫒鐨勭増鏈俊鎭紝鍙互鍙傝冭繖綃囨枃绔狅細(xì)Pre-defined Compiler Macros
涓嬮潰鏄埄鐢ㄤ笂闈粙緇嶇殑鎶宸ц幏寰楃殑dinkumware緗戠珯鐨勪竴浜涜祫鏂欙細(xì)
1. VC
鐗堟湰 (_MSC_FULL_VER)錛?br> VC8 140050727
VC7.1 13103077
VC7 13009466
VC6 12008804
鍖呭惈璺緞錛?
D:\cplt501_vc_source\include (with _CPPLIB_VER=501)
2. EDG
鐗堟湰(__EDG_VERSION__):
3.05
緙栬瘧鍙傛暟錛?br> edgcc --alt -D_WIN32 -D_M_IX86 --no_inlining --diag_suppress=1290 --long_long --wchar_t_keyword -D_C99 -ID:\cplt501_gen_source/include/c -ID:\cplt501_gen_source/include -IC:\PROGRA~1\MICROS~2.NET\VC7/include --exceptions --microsoft -c sourceFile.cpp
鍥犱負(fù)浣跨敤浜哣C鍏煎妯″紡榪涜緙栬瘧錛屾墍浠ョ紪璇戝櫒鍙兘浼?xì)妯℃嫙VC鐨勯儴鍒哹ug
3. GCC
鐗堟湰錛?br> 3.2.0
鍖呭惈璺緞錛?br> D:/cplt501_gen_source/include and D:/Mingw/include/c++/3.2/
鍙互鐪嬪埌榪欓噷浣跨敤鐨凣CC鐨勭増鏈凡緇忕浉褰撻檲鏃т簡
鏂囩珷鍑哄錛?a >http://www.diybl.com/course/3_program/c++/cppsl/2008108/149011.html
true 0
false 闈?