锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久综合精品,欧美色大人视频,欧美在线观看视频一区二区三区http://m.shnenglu.com/zhaoyg/category/7254.html璁板綍鐐規(guī)淮錛屾垚灝辨湭鏉?/description>zh-cnWed, 02 May 2012 23:31:02 GMTWed, 02 May 2012 23:31:02 GMT60鎴戠殑鏃犵煡涓嶤++鐨勫彉鎬?/title><link>http://m.shnenglu.com/zhaoyg/archive/2012/05/03/173536.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Wed, 02 May 2012 16:12:00 GMT</pubDate><guid>http://m.shnenglu.com/zhaoyg/archive/2012/05/03/173536.html</guid><wfw:comment>http://m.shnenglu.com/zhaoyg/comments/173536.html</wfw:comment><comments>http://m.shnenglu.com/zhaoyg/archive/2012/05/03/173536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zhaoyg/comments/commentRss/173536.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zhaoyg/services/trackbacks/173536.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">姝ゅ埢鎴戞湰宸插湪搴婁笂鐫¤浜嗭紝浣嗗氨鍦ㄦ垜鐫″墠緲葷湅銆婃繁搴︽帰绱++瀵硅薄妯″瀷銆嬫椂鎴戠湅鍒頒簡涓孌靛唴瀹癸紝涔熷氨鏄繖孌靛唴瀹逛嬌寰楁垜鍐欎笅浜嗚繖綃囩瑪璁般?/span><br /><br /><span style="font-size: 12pt;">榪欐鍐呭澶ц嚧璁茬殑鏄叧浜庢ā鏉夸腑鐨勫懡鍚嶅喅璁細“scope of the template definition”涓?#8220;scopy of the template instantition”</span><span style="font-size: 12pt;">銆?/span><br /><br /><span style="font-size: 12pt;">鍧︾櫧鐨勮鎴戞槸絎竴嬈$湅鍒拌繖涓鐭ヨ瘑鐐癸紝鍦ㄤ笂鏈洪獙璇佸悗鍙堝洖鎯熾奀++ Primer銆?4th涓彲鏇炬湁鎻愬強榪囷紝鍚庢潵鍙戠幇4th涓病鏈夛紝鍊掓槸3rd涓湁涓撻棬鐨勪竴灝忚妭涓撻棬闄堣堪浜嗕笅銆?br /><br />鍚庢潵鎴戝湪銆婃繁搴︽帰绱++瀵硅薄妯″瀷銆嬩功涓叧浜庢ā鏉夸腑鍛藉悕鍐寵鍐呭鐨勬梺杈瑰啓涓嬩簡榪欐牱涓孌佃瘽錛?br /><br /><em>             浠婂ぉ鎵嶅彂鐜拌繕鏈夎繖涔堜釜涓滆タ銆傛垜鍙兘鎵胯鑷繁鐨勬棤鐭ヤ笌C++鐨勫彉鎬侊紝闈㈠榪欎竴鐭ヨ瘑鐐廣?br />                                                                                     2012.5.2 澶?br /><br /><br /><br /></em></span><img src ="http://m.shnenglu.com/zhaoyg/aggbug/173536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2012-05-03 00:12 <a href="http://m.shnenglu.com/zhaoyg/archive/2012/05/03/173536.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>銆愯漿銆慍++11涓煎緱鍏蟲敞鐨勫嚑澶у彉鍖?/title><link>http://m.shnenglu.com/zhaoyg/archive/2011/08/19/153882.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Fri, 19 Aug 2011 13:06:00 GMT</pubDate><guid>http://m.shnenglu.com/zhaoyg/archive/2011/08/19/153882.html</guid><wfw:comment>http://m.shnenglu.com/zhaoyg/comments/153882.html</wfw:comment><comments>http://m.shnenglu.com/zhaoyg/archive/2011/08/19/153882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zhaoyg/comments/commentRss/153882.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zhaoyg/services/trackbacks/153882.html</trackback:ping><description><![CDATA[<div><div><div> <p>璧栧媷嫻╋紙http://laiyonghao.com錛?br /> 澹版槑錛氭湰鏂囨簮鑷?Danny Kalev 鍦?2011 騫?6 鏈?21 鏃ュ彂琛ㄧ殑銆奣he Biggest Changes in C++11(and Why You Should Care)銆嬩竴鏂囷紝鍑犱箮鎵鏈夊唴瀹歸兘鎼簡榪囨潵錛屼絾涓嶆槸鍏ㄦ枃鐓ц瘧錛屾湁鍥版儜涔嬪錛岃鍙傝鍘熸枃錛?a >http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/</a> 錛夈?br /> 娉細浣滆?Danny Kalev 鏇炬槸 C++ 鏍囧噯濮斿憳浼氭垚鍛樸?/p> <h2>Lambda 琛ㄨ揪寮?/h2> <p>Lambda 琛ㄨ揪寮忕殑褰㈠紡鏄繖鏍風殑錛?br /> </p><div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>[capture](parameters)->return-type {body}  </span></li></ol></div> <br /> 鏉ョ湅涓鏁版煇涓瓧絎﹀簭鍒椾腑鏈夊嚑涓ぇ鍐欏瓧姣嶇殑渚嬪瓙錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>int main()  </span></li><li>{  </li><li>   <span>char s[]="Hello World!";  </span></li><li>   <span>int Uppercase = 0; //modified by the lambda  </span></li><li>   for_each(s, s+<span>sizeof(s), [&Uppercase] (char c) {  </span></li><li>    <span>if (isupper(c))  </span></li><li>     Uppercase++;  </li><li>    });  </li><li> cout<< Uppercase<<<span>" uppercase letters in: "<< s<<endl;  </span></li><li>}  </li></ol></div> <br /> 鍏朵腑 [&Uppercase] 涓殑 & 鐨勬剰涔夋槸 lambda 鍑芥暟浣撹鑾峰彇涓涓?Uppercase 寮曠敤錛屼互渚胯兘澶熸敼鍙樺畠鐨勫鹼紝濡傛灉娌℃湁 &錛岄偅灝?Uppercase 灝嗕互浼犲肩殑褰㈠紡浼犻掕繃鍘匯?<h2>鑷姩綾誨瀷鎺ㄥ鍜?decltype</h2> <p>鍦?C++03 涓紝澹版槑瀵硅薄鐨勫悓鏃跺繀欏繪寚鏄庡叾綾誨瀷錛屽叾瀹炲ぇ澶氭暟鎯呭喌涓嬶紝澹版槑瀵硅薄鐨勫悓鏃朵篃浼氬寘鎷竴涓垵濮嬪鹼紝C++11 鍦ㄨ繖縐嶆儏鍐典笅灝辮兘澶熻浣犲0鏄庡璞℃椂涓嶅啀鎸囧畾綾誨瀷浜嗭細<br /> </p><div bg_c-sharp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>auto x=0; //0 鏄?nbsp;int 綾誨瀷錛屾墍浠?nbsp;x 涔熸槸 int 綾誨瀷  </span></li><li>auto c=<span>'a'; //char  </span></li><li>auto d=0.5; <span>//double  </span></li><li>auto national_debt=14400000000000LL;<span>//long long  </span></li></ol></div> <br /> 榪欎釜鐗規(guī)у湪瀵硅薄鐨勭被鍨嬪緢澶у緢闀跨殑鏃跺欏緢鏈夌敤錛屽錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>void func(const vector<int> &vi)  </span></li><li>{  </li><li>  vector<<span>int>::const_iterator ci=vi.begin();  </span></li><li>}  </li></ol></div> <br /> 閭d釜榪唬鍣ㄥ彲浠ュ0鏄庝負錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>auto ci=vi.begin();  </span></li></ol></div> <br /> C++11 涔熸彁渚涗簡浠庡璞℃垨琛ㄨ揪寮忎腑“淇樿幏”綾誨瀷鐨勬満鍒訛紝鏂扮殑鎿嶄綔絎?decltype 鍙互浠庝竴涓〃杈懼紡涓?#8220;淇樿幏”鍏剁粨鏋滅殑綾誨瀷騫?#8220;榪斿洖”錛?br /> <div bg_c-sharp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>const vector<int> vi;  </span></li><li>typedef decltype (vi.begin()) CIT;  </li><li>CIT another_const_iterator;  </li></ol></div> <h2>緇熶竴鐨勫垵濮嬪寲璇硶</h2> <p>C++ 鏈灝戞湁 4 縐嶄笉鍚岀殑鍒濆鍖栧艦寮忥紝濡傛嫭鍙峰唴鍒濆鍖栵紝瑙侊細<br /> </p><div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>std::string s("hello");  </span></li><li><span>int m=int(); //default initialization  </span></li></ol></div> <br /> 榪樻湁絳夊彿褰㈠紡鐨勶細<br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>std::string s="hello";  </span></li><li><span>int x=5;  </span></li></ol></div> <br /> 瀵逛簬 POD 闆嗗悎錛屽張鍙互鐢ㄥぇ鎷彿錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>int arr[4]={0,1,2,3};  </span></li><li><span>struct tm today={0};  </span></li></ol></div> <br /> 鏈鍚庤繕鏈夋瀯閫犲嚱鏁扮殑鎴愬憳鍒濆鍖栵細<br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>struct S {  </span></li><li> <span>int x;  </span></li><li> S(): x(0) {} };  </li></ol></div> <br /> 榪欎箞澶氬垵濮嬪寲褰㈠紡錛屼笉浠呰彍楦熶細鎼炲緱寰堝ご澶э紝楂樻墜涔熷悆涓嶆秷銆傛洿鎯ㄧ殑鏄?C++03 涓眳鐒朵笉鑳藉垵濮嬪寲 POD 鏁扮粍鐨勭被鎴愬憳錛屼篃涓嶈兘鍦ㄤ嬌鐢?new[] 鐨勬椂鍊欏垵濮?POD 鏁扮粍錛屾搷铔嬪晩錛丆++11 灝辯敤澶ф嫭鍙蜂竴緇熷ぉ涓嬩簡錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>class C  </span></li><li>{  </li><li><span>int a;  </span></li><li><span>int b;  </span></li><li><span>public:  </span></li><li> C(<span>int i, int j);  </span></li><li>};  </li><li>C c {0,0}; <span>//C++11 only. 鐩稿綋浜?nbsp;C c(0,0);  </span></li><li><span>int* a = new int[3] { 1, 2, 0 }; /C++11 only  </span></li><li><span>class X {  </span></li><li>  <span>int a[4];  </span></li><li><span>public:  </span></li><li>  X() : a{1,2,3,4} {} <span>//C++11, 鍒濆鍖栨暟緇勬垚鍛?nbsp; </span></li><li>};  </li></ol></div> <br /> 榪樻湁涓澶уソ浜嬪氨鏄浜庡鍣ㄦ潵璇達紝緇堜簬鍙互鎽嗚劚 push_back() 璋冪敤浜嗭紝C++11涓彲浠ョ洿瑙傚湴鍒濆鍖栧鍣ㄤ簡錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>// C++11 container initializer  </span></li><li>vector vs<string>={ <span>"first", "second", "third"};  </span></li><li>map singers =  </li><li>  { {<span>"Lady Gaga", "+1 (212) 555-7890"},  </span></li><li>    {<span>"Beyonce Knowles", "+1 (212) 555-0987"}};  </span></li></ol></div> <br /> 鑰岀被涓殑鏁版嵁鎴愬憳鍒濆鍖栦篃寰楀埌浜嗘敮鎸侊細<br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>class C  </span></li><li>{  </li><li> <span>int a=7; //C++11 only  </span></li><li><span>public:  </span></li><li> C();  </li><li>};  </li></ol></div> <h2>deleted 鍑芥暟鍜?defaulted 鍑芥暟</h2> <p>鍍忎互涓嬪艦寮忕殑鍑芥暟錛?br /> </p><div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>struct A  </span></li><li>{  </li><li> A()=<span>default; //C++11  </span></li><li> <span>virtual ~A()=default; //C++11  </span></li><li>};  </li></ol></div> <br /> 鍙仛 defaulted 鍑芥暟錛?default; 鎸囩ず緙栬瘧鍣ㄧ敓鎴愯鍑芥暟鐨勯粯璁ゅ疄鐜般傝繖鏈変袱涓ソ澶勶細涓鏄紼嬪簭鍛樿交鏉句簡錛屽皯鏁查敭鐩橈紝浜屾槸鏈夋洿濂界殑鎬ц兘銆?br /> 涓?defaulted 鍑芥暟鐩稿鐨勫氨鏄?deleted 鍑芥暟錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>int func()=delete;  </span></li></ol></div> <br /> 榪欒揣鏈変竴澶х敤閫斿氨鏄疄鐜?noncopyabe 闃叉瀵硅薄鎷瘋礉錛岃鎯崇姝㈡嫹璐濓紝鐢?=deleted 澹版槑涓涓嬩袱涓叧閿殑鎴愬憳鍑芥暟灝卞彲浠ヤ簡錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>struct NoCopy  </span></li><li>{  </li><li>    NoCopy & operator =( <span>const NoCopy & ) = delete;  </span></li><li>    NoCopy ( <span>const NoCopy & ) = delete;  </span></li><li>};  </li><li>NoCopy a;  </li><li>NoCopy b(a); <span>//緙栬瘧閿欒錛屾嫹璐濇瀯閫犲嚱鏁版槸 deleted 鍑芥暟  </span></li></ol></div> <h2>nullptr</h2> <p>nullptr 鏄竴涓柊鐨?C++ 鍏抽敭瀛楋紝瀹冩槸絀烘寚閽堝父閲忥紝瀹冩槸鐢ㄦ潵鏇夸唬楂橀闄╃殑 NULL 瀹忓拰 0 瀛楅潰閲忕殑銆俷ullptr 鏄己綾誨瀷鐨勶細<br /> </p><div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>void f(int); //#1  </span></li><li><span>void f(char *);//#2  </span></li><li><span>//C++03  </span></li><li>f(0); <span>//璋冪敤鐨勬槸鍝釜 f?  </span></li><li><span>//C++11  </span></li><li>f(nullptr) <span>//姣棤鐤戦棶錛岃皟鐢ㄧ殑鏄?nbsp;#2  </span></li></ol></div> <br /> 鎵鏈夎窡鎸囬拡鏈夊叧鐨勫湴鏂歸兘鍙互鐢?nullptr錛屽寘鎷嚱鏁版寚閽堝拰鎴愬憳鎸囬拡錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>const char *pc=str.c_str(); //data pointers  </span></li><li><span>if (pc!=nullptr)  </span></li><li>  cout<<pc<<endl;  </li><li><span>int (A::*pmf)()=nullptr; //鎸囧悜鎴愬憳鍑芥暟鐨勬寚閽?nbsp; </span></li><li><span>void (*pmf)()=nullptr; //鎸囧悜鍑芥暟鐨勬寚閽?nbsp; </span></li></ol></div> <h2>濮旀墭鏋勯犲嚱鏁?/h2> <p>C++11 涓瀯閫犲嚱鏁板彲浠ヨ皟鐢ㄥ悓涓涓被鐨勫彟涓涓瀯閫犲嚱鏁幫細<br /> </p><div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>class M //C++11 delegating constructors  </span></li><li>{  </li><li> <span>int x, y;  </span></li><li> <span>char *p;  </span></li><li><span>public:  </span></li><li> M(<span>int v) : x(v), y(0),  p(new char [MAX])  {} //#1 target  </span></li><li> M(): M(0) {cout<<<span>"delegating ctor"<<end;} //#2 delegating  </span></li></ol></div> <br /> #2 灝辨槸鎵璋撶殑濮旀墭鏋勯犲嚱鏁幫紝璋冪敤浜嗙湡姝g殑鏋勯犲嚱鏁?#1銆?<h2>鍙沖煎紩鐢?/h2> <p>鍦?C++03 涓殑寮曠敤綾誨瀷鏄彧緇戝畾宸﹀肩殑錛孋++11 寮曠敤涓涓柊鐨勫紩鐢ㄧ被鍨嬪彨鍙沖煎紩鐢ㄧ被鍨嬶紝瀹冩槸緇戝畾鍒板彸鍊肩殑錛屽涓存椂瀵硅薄鎴栧瓧闈㈤噺銆?br /> 澧炲姞鍙沖煎紩鐢ㄧ殑涓昏鍘熷洜鏄負浜嗗疄鐜?move 璇箟銆備笌浼犵粺鐨勬嫹璐濅笉鍚岋紝move 鐨勬剰鎬濇槸鐩爣瀵硅薄“紿冨彇”鍘熷璞$殑璧勬簮錛屽茍灝嗘簮緗簬“絀?#8221;鐘舵併傚綋鎷瘋礉涓涓璞℃椂錛屽叾瀹炰唬浠鋒槀璐典笖鏃犲繀瑕侊紝move 鎿嶄綔灝卞彲浠ユ浛浠e畠銆傚鍦? string 浜ゆ崲鐨勬椂鍊欙紝浣跨敤 move 鎰忎箟灝辨湁宸ㄥぇ鐨勬ц兘鎻愬崌錛屽鍘熸柟妗堟槸榪欐牱鐨勶細<br /> </p><div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>void naiveswap(string &a, string & b)  </span></li><li>{  </li><li> string temp = a;  </li><li> a=b;  </li><li> b=temp;  </li><li>}  </li></ol></div> <br /> 榪欑鏂規(guī)寰堝偦寰堝ぉ鐪燂紝寰堟參錛屽洜涓洪渶瑕佺敵璇峰唴瀛橈紝鐒跺悗鎷瘋礉瀛楃錛岃?move 灝卞彧闇瑕佷氦鎹袱涓暟鎹垚鍛橈紝鏃犻』鐢寵銆侀噴鏀懼唴瀛樺拰鎷瘋礉瀛楃鏁扮粍錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>void moveswapstr(string& empty, string & filled)  </span></li><li>{  </li><li><span>//pseudo code, but you get the idea  </span></li><li> <span>size_t sz=empty.size();  </span></li><li> <span>const char *p= empty.data();  </span></li><li><span>//move filled's resources to empty  </span></li><li> empty.setsize(filled.size());  </li><li> empty.setdata(filled.data());  </li><li><span>//filled becomes empty  </span></li><li> filled.setsize(sz);  </li><li> filled.setdata(p);  </li><li>}  </li></ol></div> <br /> 瑕佸疄鐜版敮鎸?move 鐨勭被錛岄渶瑕佸0鏄?move 鏋勯犲嚱鏁板拰 move 璧嬪兼搷浣滅錛屽涓嬶細<br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>class Movable  </span></li><li>{  </li><li>Movable (Movable&&); <span>//move constructor  </span></li><li>Movable&& operator=(Movable&&); <span>//move assignment operator  </span></li><li>};  </li></ol></div> <br /> C++11 鐨勬爣鍑嗗簱騫挎硾浣跨敤 move 璇箟錛屽緢澶氱畻娉曞拰瀹瑰櫒閮藉凡緇忎嬌鐢?move 璇箟浼樺寲榪囦簡銆?<h2>C++11 鐨勬爣鍑嗗簱</h2> <p>闄?TR1 鍖呭惈鐨勬柊瀹瑰櫒錛坲nordered_set, unordered_map, unordered_multiset, 鍜寀nordered_multimap錛夛紝榪樻湁涓浜涙柊鐨勫簱錛屽姝e垯琛ㄨ揪寮忥紝tuple錛屽嚱鏁板璞″皝瑁呭櫒絳夈備笅闈粙緇嶄竴浜?C++11 鐨勬爣鍑嗗簱鏂扮壒鎬э細</p> <h3>綰跨▼搴?/h3> <p>浠庣▼搴忓憳鐨勮搴︽潵鐪嬶紝C++11 鏈閲嶈鐨勭壒鎬у氨鏄茍鍙戜簡銆侰++11 鎻愪緵浜?thread 綾伙紝涔熸彁渚涗簡 promise 鍜?future 鐢ㄤ互騫跺彂鐜涓殑鍚屾錛岀敤 async() 鍑芥暟妯℃澘鎵ц騫跺彂浠誨姟錛屽拰 thread_local 瀛樺偍澹版槑涓虹壒瀹氱嚎紼嬬嫭鍗犵殑鏁版嵁錛岃繖閲岋紙http://www.devx.com/SpecialReports/Article/38883錛夋湁涓涓畝鍗?鐨?C++11 綰跨▼搴撴暀紼嬶紙鑻辨枃錛夈?/p> <h3>鏂扮殑鏅鴻兘鎸囬拡綾?/h3> <p>C++98 瀹氫箟鐨勫敮涓鐨勬櫤鑳芥寚閽堢被 auto_ptr 宸茬粡琚純鐢紝C++11 寮曞叆浜嗘柊鐨勬櫤鑳介拡瀵圭被 shared_ptr 鍜?unique_ptr銆傚畠浠兘鏄爣鍑嗗簱鐨勫叾瀹冪粍浠跺吋瀹癸紝鍙互瀹夊叏鍦版妸鏅鴻兘鎸囬拡瀛樺叆鏍囧噯瀹瑰櫒錛屼篃鍙互瀹夊叏鍦扮敤鏍囧噯綆楁硶“鍊掕吘”瀹冧滑銆?/p> <h3>鏂扮殑綆楁硶</h3> <p>涓昏鏄?all_of()銆乤ny_of() 鍜?none_of()錛屼笅闈㈡槸渚嬪瓙錛?br /> </p><div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>#include <algorithm>  </span></li><li><span>//C++11 code  </span></li><li><span>//are all of the elements positive?  </span></li><li>all_of(first, first+n, ispositive()); <span>//false  </span></li><li><span>//is there at least one positive element?  </span></li><li>any_of(first, first+n, ispositive());<span>//true  </span></li><li><span>// are none of the elements positive?  </span></li><li>none_of(first, first+n, ispositive()); <span>//false  </span></li></ol></div> <br /> 榪樻湁涓涓柊鐨?copy_n錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>#include <algorithm>  </span></li><li><span>int source[5]={0,12,34,50,80};  </span></li><li><span>int target[5];  </span></li><li><span>//浠?nbsp;source 鎷瘋礉 5 涓厓绱犲埌 target  </span></li><li>copy_n(source,5,target);  </li></ol></div> <br /> iota() 綆楁硶鍙互鐢ㄦ潵鍒涘緩閫掑搴忓垪錛屽畠鍏堟妸鍒濆艱祴鍊肩粰 *first錛岀劧鍚庣敤鍓嶇疆 ++ 鎿嶄綔絎﹀闀垮垵鍊煎茍璧嬪煎埌緇欎笅涓涓凱浠e櫒鎸囧悜鐨勫厓绱狅紝濡備笅錛?br /> <div bg_cpp=""><div><div><a title="view plain">view plain</a></div></div><ol start="1"><li><span>#include <numeric>  </span></li><li><span>int a[5]={0};  </span></li><li><span>char c[3]={0};  </span></li><li>iota(a, a+5, 10); <span>//changes a to {10,11,12,13,14}  </span></li><li>iota(c, c+3, <span>'a'); //{'a','b','c'}  </span></li></ol></div> <br /> 鏄殑錛孋++11 浠嶇劧緙哄皯涓浜涘緢鏈夌敤鐨勫簱濡?XML API錛宻ocket錛孏UI銆佸弽灝?#8212;—浠ュ強鑷姩鍨冨溇鏀墮泦銆傜劧鑰岀幇鏈夌壒鎬у凡緇忚 C++ 鏇村畨鍏ㄣ侀珮鏁堬紙鏄殑錛屾晥鐜囨洿楂樹簡錛屽彲浠ュ弬瑙?Google 鐨? 鍩哄噯嫻嬭瘯緇撴灉http://www.itproportal.com/2011/06/07/googles-rates-c-most- complex-highest-performing-language/錛変互鍙婃洿鍔犳槗浜庡涔犲拰浣跨敤銆?br /> 濡傛灉瑙夊緱 C++ 鍙樺寲澶ぇ浜嗭紝涓嶅繀鎯婃亹錛岃姳鐐規(guī)椂闂存潵瀛︿範灝卞ソ浜嗐傚彲鑳藉湪浣犺瀺浼氳瘡閫氭柊鐗規(guī)т互鍚庯紝浣犱細鍚屾剰 Stroustrup 鐨勮鐐癸細C++11 鏄竴闂ㄦ柊鐨勮璦——涓涓洿濂界殑 C++銆?p><br /></p> </div></div></div><img src ="http://m.shnenglu.com/zhaoyg/aggbug/153882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-08-19 21:06 <a href="http://m.shnenglu.com/zhaoyg/archive/2011/08/19/153882.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>銆愯漿銆態(tài)OOST鐨勭紪璇戦夐」http://m.shnenglu.com/zhaoyg/archive/2011/02/16/140148.htmlzhaoygzhaoygWed, 16 Feb 2011 03:35:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2011/02/16/140148.htmlhttp://m.shnenglu.com/zhaoyg/comments/140148.htmlhttp://m.shnenglu.com/zhaoyg/archive/2011/02/16/140148.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/140148.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/140148.html鍘熸枃錛?a href="http://m.shnenglu.com/flyinghare/archive/2010/09/07/126078.aspx">http://m.shnenglu.com/flyinghare/archive/2010/09/07/126078.aspx

璁稿鏂頒漢瀵逛簬緙栬瘧B(tài)OOST鎰熷埌鏃犱粠涓嬫墜錛岀敋鑷沖洜姝よ屾斁寮冧嬌鐢˙OOST錛岄偅鐪熺殑澶彲鎯滀簡錛屼笅闈㈡垜鎶婁竴浜涘父鐢ㄧ殑BOOST緙栬瘧鏂規(guī)硶璐翠簬姝わ紝鍚屾椂涔熶綔涓鴻嚜宸辯殑絎旇銆?
棣栧厛涓嬭澆bjam.exe錛屽鍒跺埌 $BOOST$ 鐩綍涓嬨傛垨鑰?span style="FONT-SIZE: 14pt">鑷繁鐢熸垚bjam錛屾墦寮Visual Studio 2008 鍛戒護鎻愮ず紿楀彛$BOOST$\tools\jam\src錛屾墽琛?build.bat 浼氬湪$BOOST$\tools\jam\src\bin.ntx86 鐢熸垚 bjam.exe 鏂囦歡銆傚鍒舵枃浠?bjam.exe  鏂囦歡鍒?$BOOST$\涓?/span>銆?

1.瀹屽叏緙栬瘧瀹夎錛?
bjam --toolset=msvc install
瀹屾垚鍚庝細鐢熸垚涓涓猙in.v2緙栬瘧鏃剁殑涓存椂鐩綍錛屾墜鍔ㄥ垹闄ゃ傜敓鎴愬彟涓涓洰褰旵:\boost錛岄噷闈負鎵鏈夌殑澶存枃浠跺拰搴撴枃浠躲傚ご鏂囦歡鐩綍涓篵oost_1_34_1\boost鐩綍澶嶅埗榪囧幓鐨勩?br> 
2.鍙紪璇戠浉搴旂殑搴撴枃浠?
bjam --toolset=msvc stage
瀹屾垚鍚庡悓鏍蜂細鐢熸垚bin.v2涓存椂鐩綍銆傚彟涓涓洰褰曚負stage鏂囦歡錛岄噷闈㈡湁瀵瑰簲鐨勫簱鏂囦歡銆?

3.鏌ョ湅闇瑕佺紪璇戞墠鑳戒嬌鐢ㄧ殑搴撳垪琛?
bjam --show-libraries

4.緙栬瘧鐗瑰畾鐨勫簱錛屽鍙紪璇憆egex
bjam --toolset=msvc --with-regex stage
鐢熸垚鐨勫簱鏂囦歡鍦╯tage鐩綍涓?

5.涓嶇紪璇戞煇涓簱錛屽涓嶇紪璇憆egex
bjam --toolset=msvc --without-regex stage
鐢熸垚鐨勫簱鏂囦歡鍦╯tage鐩綍涓?

6.緙栬瘧鐗瑰畾鐨勫簱錛屽鍙紪璇憆egex錛岀敓鎴恉ebug錛屽綰跨▼錛屽叡浜繛鎺ョ増鏈紝騫朵繚瀛樺湪stage銆?
bjam --toolset=msvc --with-regex stage debug threading=multi link=shared

7.鐢熸垚 mt-sgd 鐨勯潤鎬佸簱(runtime-link-static)
bjam "-sTOOLS=vc-8_0" --with-thread install debug release runtime-link=static

8.緙栬瘧regex搴撱?
bjam --toolset=msvc --with-regex stage debug release threading=multi threading=single link=shared link=static runtime-link=shared runtime-link=static

boost鐨勫畨瑁呮柟娉曪細
瀵逛簬DLL鐗堟湰
bjam --toolset=msvc link=shared runtime-link=shared threading=multi stage debug release install

瀵逛簬lib鐗堟湰
bjam --toolset=msvc link=static runtime-link=shared threading=multi stage debug release install


鍙﹀錛屽湪$BOOST$\tools\build\v2\user-config.jam鎵懼埌涓嬮潰鐨勫湴鏂?
# -------------------
# MSVC configuration.
# -------------------
# Configure msvc (default version, searched for in standard locations and PATH).
# using msvc ;
# Configure specific msvc version (searched for in standard locations and PATH).
# using msvc : 8.0 ;
#鍦ㄨ繖閲屾坊鍔?vs2008 鐨勯厤緗?
using msvc : 9.0 : : /wd4819 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE  /D_SECURE_SCL=0 ;
#鍦ㄨ繖閲屾坊鍔?vs2005 鐨勯厤緗?
using msvc : 8.0 : : <compileflags>/wd4819 <compileflags>/D_CRT_SECURE_NO_DEPRECATE <compileflags>/D_SCL_SECURE_NO_DEPRECATE <compileflags>/D_SECURE_SCL=0 ;   
鐒跺悗榪涘叆 $BOOST$ 鐩綍錛屾墽琛宐jam.exe 緙栬瘧鍛戒護
//涓嬮潰鐨勫懡浠ょ殑鍚勯夐」鐨勮鏄庯細
//prefix    灝哹oost瀹夎鍒扮殑璺緞錛堢敓鎴愮殑澶存枃浠跺拰搴撴枃浠墮兘浼氭斁鍒拌璺緞涓級銆?
//閲嶅畾涔変互涓嬪彉閲忥紙鍒╃敤-s璁劇疆錛夛細
//VC80_ROOT銆銆 vc2005鐨勫畨瑁呰礬寰勶紝濡傛灉鏈皢vc2005瀹夎鍒伴粯璁や綅緗紝浣犲繀欏繪寚瀹氳欏廣?
//TOOLS         浣跨敤鐨勭紪璇戝伐鍏鳳紝vc2005瀵瑰簲鐨勬槸vc-8_0
//PYTHON_ROOT   ython鐨勫畨瑁呯洰褰曪紝濡傛灉鏈皢BOOST瀹夎鍒伴粯璁や綅緗紝浣犲繀欏繪寚瀹氳欏廣?
//BUILD         緙栬瘧緇撴灉閫夐」錛岄粯璁や細鐢熸垚灝藉彲鑳藉鐨勭増鏈紝濡傝皟璇曠増錛忓彂琛岀増錛岄潤鎬佸簱錛忓姩鎬佸簱錛屽崟綰跨▼錛忓綰跨▼銆?


zhaoyg 2011-02-16 11:35 鍙戣〃璇勮
]]>
銆愯漿銆慺unction/bind鐨勬晳璧庯紙涓婏級http://m.shnenglu.com/zhaoyg/archive/2011/01/20/138983.htmlzhaoygzhaoygThu, 20 Jan 2011 14:24:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2011/01/20/138983.htmlhttp://m.shnenglu.com/zhaoyg/comments/138983.htmlhttp://m.shnenglu.com/zhaoyg/archive/2011/01/20/138983.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/138983.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/138983.html杞嚜錛?a >http://blog.csdn.net/myan/archive/2010/10/09/5928531.aspx
浣滆咃細瀛熷博
--------------------------------------------------------------------------------------
榪欐槸閭g瘒C++0X鐨勬鏂囥傚お闀匡紝鍏堝啓涓婂崐閮ㄥ垎鍙戜簡銆?/p>

Function/bind鍙互鏄竴涓緢綆鍗曠殑璇濋錛屽洜涓哄畠鍏跺疄涓嶈繃灝辨槸涓涓硾鍨嬬殑鍑芥暟鎸囬拡銆備絾鏄鏋滈偅涔堟潵璋堬紝灝辨病鎰忔濅簡錛屼篃鐘笉涓婂啓榪欑瘒涓滆タ銆傚湪鎴戠湅鏉ワ紝榪欎釜浜嬫儏瑕佽鐨勮瘽錛屽氨搴旇璁查忥紝璁插埌鍥炶皟錛坈allback錛夈佷唬鐞嗭紙delegate錛夈佷俊鍙鳳紙signal錛夊拰娑堟伅浼犻掞紙messaging錛夌殑灞傞潰錛屽洜涓哄畠紜疄鏄お閲嶈浜嗐傝繖涓瘽棰樹笉浣嗕笌闈㈠悜瀵硅薄鐨勬牳蹇冩濇兂瀵嗗垏鐩稿叧錛岃屼笖鏄潰鍚戝璞′袱澶ф祦媧句箣闂翠氦閿嬬殑涓績銆傚洿緇曡繖涓棶棰樼殑鎬濊冨拰浜夎錛屽嚑涔庢妸20騫存潵鎵鏈変富嫻佺殑緙栫▼騫沖彴鍜岀紪紼嬭璦閮芥悈榪涙潵浜嗐傛墍浠ワ紝濡傛灉璇﹀敖閾洪檲錛岃繖涓瘽棰樼洿鎺ュ彲浠ュ啓涓鏈功銆?/p>

鍐欎功鎴戝綋鐒舵病閭d釜姘村鉤錛屼絾榪欎釜棰樼洰紜疄涓鐩存兂鍔ㄤ竴鍔ㄣ傜劧鑰岃繖涓富棰樺疄鍦ㄥお澶э紝鎴戝疄鍦ㄦ病鏈夌簿鍔涙妸瀹冨畬鏁寸殑鍐欎笅鏉ワ紱榪欎釜涓婚涔熷緢娣憋紝鐗瑰埆鏄秹鍙婂埌騫跺彂鐜鏈夊叧鐨勮瘽棰橈紝鎴戠殑鐞嗚В榪橀潪甯歌偆嫻咃紝鎬昏寰楁垜璁よ瘑鐨勫緢澶氶珮鎵嬮兘姣旀垜鏇存湁璧勬牸鍐欒繖涓瘽棰樸傛墍浠ョ姽璞簡寰堜箙錛岃涓嶈鐜板湪鍐欙紝璇ユ庝箞鍐欍傛渶鍚庢垜瑙夊緱錛岀‘瀹炰笉鑳芥妸涓綃囧崥瀹㈡枃绔犲啓鎴愪竴鏈?0騫撮潰鍚戝璞℃妧鏈彶璁幫紝鎵浠ュ喅瀹氫繚鐣欏ぇ鐨勬灦鏋勶紝浣嗘槸瀵瑰叾涓叿浣撶殑鎶鏈粏鑺傜偣鍒頒負姝€傛垜涓嶄細鍘昏緇嗗湴鍒椾婦浠g爜錛屽垎鏋愬璞$殑鍐呭瓨甯冨眬錛岀敾紺烘剰鍥撅紝浣嗘槸浼氭妸鏈閲嶈鐨勭粨璁哄拰瑙傜偣鍐欎笅鏉ワ紝璇村緱濂藉惉涓鐐規(guī)槸鎻愮翰鎸堥錛岃鐨勪笉濂藉惉灝辨槸璇剦涓嶈銆備絾鏃犺濡備綍錛屾垜鎯寵繖鏍蜂竴綃囦笢瑗匡紝涓鏄皥璋堟垜瀵硅繖涓簨鎯呯殑鐪嬫硶錛屼簩鏄?#8220;鎶涚爾寮曠帀”錛屽紩鏉ラ珮鎵嬬殑鍏蟲敞錛屽紩鍑烘洿娣卞埢鍜屽畬鏁寸殑鍙欒堪銆?/p>

涓嬮潰寮濮嬨?/p>

0. 紼嬪簭璁捐鏈変竴涓寖寮忥紙paradigm錛夐棶棰樸傛墍璋撹寖寮忥紝灝辨槸緇勭粐紼嬪簭鐨勫熀鏈濇兂錛岃岃繖涓熀鏈濇兂錛屽弽鏄犱簡紼嬪簭璁捐鑰呭紼嬪簭鐨勪竴涓熀鏈殑鍝插瑙傦紝涔熷氨鏄錛屼粬璁や負紼嬪簭鐨勬湰璐ㄦ槸浠涔堬紝浠栬涓轟竴涓ぇ鐨勭▼搴忔槸鐢變粈涔堢粍鎴愮殑銆傝岃繖錛屽張璺熶粬瀵逛簬鐜板疄涓栫晫鐨勭湅娉曟湁鍏熾傛樉鐒訛紝榪欐牱鐨勭湅娉曚笉鍙兘鏈夊緢澶氱銆傜紪紼嬩綔涓轟竴闂ㄨ涓氾紝鐙珛瀛樺湪蹇?0騫翠簡錛屼絾鏄墍鍑虹幇鐨勮寖寮忎笉榪囦笁縐嶁斺旇繃紼嬭寖寮忋佸嚱鏁拌寖寮忋佸璞¤寖寮忋傚叾涓嚱鏁拌寖寮忎笌鐜板疄涓栫晫宸窛姣旇緝澶э紝鍦ㄨ繖閲屼笉璁ㄨ銆傝岃繃紼嬭寖寮忓拰瀵硅薄鑼冨紡鍙互瑙嗕負瀵圭▼搴忔湰璐ㄧ殑涓ょ鏍規(guī)湰涓嶅悓鐨勭湅娉曪紝鑰屼笖鑳藉鍒嗗埆鍦ㄧ幇瀹炰笘鐣屼腑鎵懼埌鐩稿簲鐨勬槧灝勩?br>榪囩▼鑼冨紡璁や負錛岀▼搴忔槸鐢變竴涓張涓涓繃紼嬬粡榪囬『搴忋侀夋嫨鍜屽驚鐜殑緇撴瀯緇勫悎鑰屾垚銆傚弽鏄犲湪鐜板疄涓栫晫錛岃繃紼嬭寖寮忎綋鐜頒簡鍔沖姩鍒嗗伐涔嬪墠“鍏ㄨ兘浜?#8221;鐨勫伐浣滅壒鐐光斺旀墍鏈夌殑浜嬫儏閮借兘騫詫紝鎵鏈夌殑璧勬簮閮芥槸鎴戠殑錛屽彧涓嶈繃寰楀叿浣撶殑浜嬫儏寰椾竴姝ユ鍦版潵鍋氥?
瀵硅薄鑼冨紡鍒欏弽鏄犱簡鍔沖姩鍒嗗伐涔嬪悗鐨勫洟闃熷崗浣滅殑宸ヤ綔鐗圭偣鈥斺旀瘡涓漢鍚勬湁鎵闀匡紝鍚勫徃鍏惰亴錛屾湁鍚勮嚜鐨勭鏈夎祫婧愶紝宸ヤ歡鍜屼俊鎭湪浜轟滑涔嬮棿褰兼浼犻掞紝鏈鍚庡畬鎴愬伐浣溿傚洜姝わ紝瀵硅薄鑼冨紡涔熷氨褰㈡垚浜嗚嚜宸卞紼嬪簭鐨勭湅娉曗斺旂▼搴忔槸鐢變竴緇勫璞$粍鎴愶紝榪欎簺瀵硅薄鍚勬湁鎵鑳斤紝閫氳繃娑堟伅浼犻掑疄鐜板崗浣溿?

瀵硅薄鑼冨紡涓庤繃紼嬭寖寮忕浉姣旓紝鏈変笁涓獊鍑虹殑浼樺娍錛岀涓錛岀敱浜庡疄鐜頒簡閫昏緫涓婄殑鍒嗗伐錛岄檷浣庝簡澶ц妯$▼搴忕殑寮鍙戦毦搴︺傜浜岋紝鐏墊椿鎬ф洿濂解斺旇嫢騫插璞″湪涓璧鳳紝鍙互鐏墊椿緇勫悎錛屽彲浠ヤ互涓嶅悓鐨勬柟寮忓崗浣滐紝瀹屾垚涓嶅悓鐨勪換鍔★紝涔熷彲浠ョ伒媧葷殑鏇挎崲鍜屽崌綰с傜涓夛紝瀵硅薄鑼冨紡鏇村姞閫傚簲鍥懼艦鍖栥佺綉緇滃寲銆佹秷鎭┍鍔ㄧ殑鐜頒唬璁$畻鐜銆?/p>

鎵浠ワ紝杈冧箣浜庤繃紼嬭寖寮忥紝瀵硅薄鑼冨紡錛屾垨鑰呰“闈㈠悜瀵硅薄”錛岀‘瀹炴槸鏇村叿浼樺娍鐨勭紪紼嬭寖寮忋傛渶榪戠湅鍒頒竴浜涙枃绔犳姩鍑婚潰鍚戝璞★紝璇撮潰鍚戝璞℃槸鑳℃壇錛屾垜璁や負瑕佸叿浣撳垎鏋愩傚闈㈠悜瀵硅薄鐨勪竴閮ㄥ垎鎵硅瘎錛屾槸鍐茬潃涓繪祦鐨?#8220;闈㈠悜瀵硅薄”璇█鍘葷殑錛岃繖紜疄鏄湁閬撶悊鐨勶紝鎴戝湪涓嬮潰涔熶細璋堝埌錛岃屼笖浼氶獋寰楁洿鐙犮傝屽彟涓涓壒璇勭殑澹伴煶錛屼富瑕佽屾潵鑷猄TL涔嬬埗Alex Stepanov錛屼粬璇寸殑褰撶劧鏈変粬鐨勯亾鐞嗭紝涓嶈繃瑕佺煡閬撹鐗涗漢鏄墠鑻忚仈鑾柉縐戝浗绔嬬綏钂欒绱㈠か澶у鏁板緋誨崥澹紝浣犲彧瑕佺炕緲誨墠鑻忚仈鐨勫ぇ瀛︽暟瀛︽暀鏉愬氨鐭ラ亾浜嗭紝鑳藉鍦ㄨ帿澶ф嬁鍒版暟瀛﹀崥澹殑錛屾牴鏈氨鏄姭鐫浜虹毊鐨勫鏄熼珮絳夋櫤鎱с傝屾垜浠紪鍐欏湴鐞冧笂鐨勭▼搴忥紝鍙兘榪樻槸搴旇浠ュ湴鐞冧漢鐨勮鐐逛負涓匯?/p>

1. 閲嶅涓閬嶅璞¤寖寮忕殑涓や釜鍩烘湰瑙傚康錛?br>紼嬪簭鏄敱瀵硅薄緇勬垚鐨勶紱
瀵硅薄涔嬮棿浜掔浉鍙戦佹秷鎭紝鍗忎綔瀹屾垚浠誨姟錛?

璇鋒敞鎰忥紝榪欎袱涓蹇典笌鍚庢潵鎴戜滑鐔熺煡鐨勯潰鍚戝璞′笁瑕佺礌“灝佽銆佺戶鎵褲佸鎬?#8221;鏍規(guī)湰涓嶅湪涓涓眰闈笂錛屽掓槸涓庡啀鍚庢潵鐨?#8220;緇勪歡銆佹帴鍙?#8221;紲炲悎銆?/p>

2. 涓栫晫涓婄涓涓潰鍚戝璞¤璦鏄疭imula-67錛岀浜屼釜闈㈠悜瀵硅薄璇█鏄疭malltalk-71銆係malltalk鍙楀埌浜哠imula-67鐨勫惎鍙戯紝鍩烘湰鍑哄彂鐐圭浉鍚岋紝浣嗕篃鏈夐噸澶х殑涓嶅悓銆傚厛璇寸浉鍚屼箣澶勶紝Simula鍜孲malltalk閮界鎵夸笂榪板璞¤寖寮忕殑涓や釜鍩烘湰瑙傚康錛屼負浜嗘柟渚垮璞$殑鏋勯狅紝涔熼兘寮曞叆浜嗙被銆佺戶鎵跨瓑姒傚康銆備篃灝辨槸璇達紝綾匯佺戶鎵胯繖浜涙満鍒舵槸涓轟簡瀹炵幇瀵硅薄鑼冨紡鍘熷垯鑰屾瀯閫犲嚭鏉ョ殑絎簩浣嶇殑銆佸伐鍏鋒х殑鏈哄埗錛岄偅涔堜負浠涔堝悗鏉ヨ繖浜涚浜屼綅鐨勪笢瑗跨浜嗕富浣嶏紝鍚庨潰鎴戜細鍐嶆潵鍒嗘瀽銆傝孲imula鍜孲malltalk鏈閲嶅ぇ鐨勪笉鍚岋紝灝辨槸Simula鐢ㄦ柟娉曡皟鐢ㄧ殑鏂瑰紡鍚戝璞″彂閫佹秷鎭紝鑰孲malltalk鏋勯犱簡鏇寸伒媧誨拰鏇寸函綺圭殑娑堟伅鍙戦佹満鍒躲?/p>

鍏蜂綋鐨勮錛屽悜涓涓猄imula瀵硅薄涓彂閫佹秷鎭紝灝辨槸璋冪敤榪欎釜瀵硅薄鐨勪竴涓柟娉曪紝鎴栬呯О鎴愬憳鍑芥暟銆傞偅涔堜綘鎬庝箞鐭ラ亾鑳藉鍦ㄨ繖涓璞′笂璋冪敤榪欎釜鎴愬憳鍑芥暟鍛紵鎴栬呰錛屼綘鎬庝箞鐭ラ亾鑳藉鍚戣繖涓璞″彂閫佹煇涓秷鎭憿錛熻繖灝辮姹備綘蹇呴』紜繚榪欎釜瀵硅薄鍏鋒湁鍚堥傜殑綾誨瀷錛屼篃灝辨槸璇達紝浣犲緱鍏堢煡閬撳摝榪欎釜瀵硅薄鏄粈涔堬紝鎵嶈兘鍚戝畠鍙戞秷鎭傝屾秷鎭殑瀹炵幇鏂瑰紡琚洿鎺ュ鐞嗕負鎴愬憳鍑芥暟璋冪敤錛屾垨铏氬嚱鏁拌皟鐢ㄣ?/p>

鑰孲malltalk鍦ㄨ繖涓鐐逛笂鍋氫簡涓涓巻鍙叉х殑璺ㄨ秺錛屽畠瀹炵幇浜嗕竴涓笌鐩爣瀵硅薄鏃犲叧鐨勬秷鎭彂閫佹満鍒訛紝涓嶇閭d釜瀵硅薄鏄皝錛屼篃涓嶇瀹冩槸涓嶆槸鑳芥紜殑澶勭悊涓涓秷鎭紝浣滀負鍙戦佹秷鎭殑瀵硅薄鏉ヨ錛屽彲浠ユ鏃犻【蹇屽湴鎶撲綇涓涓璞″氨鍙戞秷鎭繃鍘匯傛帴鍒版秷鎭殑瀵硅薄錛岃灝濊瘯鐞嗚В榪欎釜娑堟伅錛屽茍鏈鍚庤皟鐢ㄨ嚜宸辯殑榪囩▼鏉ュ鐞嗘秷鎭傚鏋滆繖涓秷鎭兘琚鐞嗭紝閭d釜瀵硅薄鑷劧浼氬鐞嗗ソ錛屽鏋滀笉鑳借澶勭悊錛孲malltalk緋葷粺浼氬悜娑堟伅鐨勫彂閫佽呭洖浼犱竴涓猟oesNotUnderstand娑堟伅錛屼簣浠ラ氱煡銆傚璞′笉鐢ㄥ叧蹇冩秷鎭槸濡備綍浼犻掔粰鍙︿竴涓璞$殑錛屼紶閫掕繃紼嬭鍒嗙鍑烘潵錛堣屼笉鏄儚Simula閭f牱鏄庣‘鍦拌浠ユ垚鍛樺嚱鏁拌皟鐢ㄧ殑鏂瑰紡瀹炵幇錛夛紝鍙互鏄湪鍐呭瓨涓鍒訛紝涔熷彲浠ユ槸榪涚▼闂撮氳銆傚埌浜哠malltalk-80鏃訛紝娑堟伅浼犻掔敋鑷沖彲浠ヨ法瓚婄綉緇溿?/p>

涓轟簡鏂逛究鍚庨潰鐨勮璁猴紝涓嶅Θ鎶婃簮鑷猄imula鐨勬秷鎭満鍒剁О涓?#8220;闈欐佹秷鎭満鍒?#8221;錛屾妸婧愯嚜Smalltalk鐨勬秷鎭満鍒剁О涓?#8220;鍔ㄦ佹秷鎭満鍒?#8221;銆?/p>

Simula涓嶴malltalk涔嬮棿瀵逛簬娑堟伅鏈哄埗鐨勪笉鍚岄夋嫨錛屼富瑕佹槸鍥犱負涓よ呬簬鐢ㄩ斻傚墠鑰呮槸鐢ㄤ簬浠跨湡紼嬪簭寮鍙戯紝鑰屽悗鑰呯敤浜庡浘褰㈢晫闈㈢幆澧冩瀯寤猴紝鐪嬩笂鍘誨悇鑷悎鎯呭悎鐞嗐傜劧鑰岋紝灝辨槸榪欎箞涓鐐圭畝鍗曠殑鍖哄埆錛屽嵈閫犳垚浜嗗法澶х殑鍘嗗彶鍚庢灉銆?/p>

3. 鍒頒簡1980騫翠唬錛孋++鍑虹幇浜嗐侭jarne Stroustrup鍦ㄥ崥澹湡闂存繁鍏ョ爺絀惰繃Simula錛岄潪甯告璧忓叾鎬濇兂錛屼簬鏄氨鍦–璇█璇硶鐨勫熀紜涔嬩笂錛屽嚑涔庢妸Simula鐨勬濇兂鐓ф惉榪囨潵錛屽艦鎴愪簡鏈鍒濈殑C++銆侰++闂笘浠ヤ箣鍒濓紝涓昏鐢ㄤ簬瑙e喅瑙勬ā紼嶅ぇ鐨勪紶緇熺被鍨嬬殑緙栫▼闂錛岃繀閫熷彇寰椾簡宸ㄥぇ鐨勬垚鍔燂紝涔熻瘉鏄庝簡瀵硅薄鑼冨紡鏈韓鎵鍏鋒湁鐨勫▉鍔涖?/p>

澶х害鍦ㄥ悓鏈燂紝Brad Cox鏍規(guī)嵁Smalltalk鐨勬濇兂璁捐浜哋bjective-C錛屽彲鏄敱浜庡叾璇硶鎬紓錛屾病鏈夋祦琛岃搗鏉ャ傚彧鏈塖teve Jobs榪欑鍏鋒湁紱呭畻緹庡閴磋祻鍔涚殑涓栧楂樹漢錛屾妸瀹冨涓虹懓瀹濓紝涓?988騫磋繛閿呮妸Objective-C鐨勫洟闃熷拰浜у搧涓鍙f皵涔頒簡涓嬫潵銆?/p>

4. 灝卞湪鍚屼竴鏃舵湡錛孏UI鎴愪負鐑棬銆傝櫧鐒禛UI鐨勬湰璐ㄦ槸瀵硅薄鑼冨瀷鐨勶紝浣嗘槸褰撴椂錛?980騫翠唬涓湡錛夌殑闈㈠悜瀵硅薄璇█錛屽寘鎷珻++璇█錛岃繕榪滀笉鎴愮啛錛屽洜姝ゆ渶鍒濈殑GUI緋葷粺鏃犱竴渚嬪鏄嬌鐢–鍜屾眹緙栬璦寮鍙戠殑銆傛垨鑰呰錛屾渶鍒濈殑GUI寮鍙戣呯‖鏄敤鎶借薄綰у埆鏇翠綆鐨勮璦鏋勯犱簡涓涓潰鍚戝璞$郴緇熴傜啛鎮(zhèn)塛in32 SDK寮鍙戠殑浜猴紝搴旇鐭ラ亾鎴戝湪璇翠粈涔堛?/p>

5. 褰撴椂寰堝浜轟互涓猴紝濡傛灉C++鏇存垚鐔熶簺錛岀洿鎺ョ敤C++鏉ユ瀯閫燱indows緋葷粺浼氬ぇ澶у湴瀹規(guī)槗銆備篃鏈変漢瑙夊緱錛屽敖綆indows緋葷粺鏈韓浣跨敤C鍐欑殑錛屼絾鏄叾闈㈠悜瀵硅薄鐨勬湰璐ㄤ笌C++鏇村鍚堬紝鎵浠ュ湪鍏跺熀紜涓婂寘瑁呬竴涓狢++鐨凣UI framework涓瀹氭槸杞昏屾槗涓俱傚彲鏄竴鍔ㄦ墜浜轟滑灝卞彂鐜幫紝瀹屽叏涓嶆槸閭d箞鍥炰簨銆傜敤C++寮鍙慦indows妗嗘灦闅懼緱瑕佹銆備負浠涔堝憿錛熶富瑕佸氨鏄疻indows緋葷粺涓殑娑堟伅鏈哄埗瀹為檯涓婃槸鍔ㄦ佺殑錛屼笌C++鐨勯潤鎬佹秷鎭満鍒舵牴鏈厤鍚堜笉鍒頒竴璧峰幓銆傚湪Windows閲岋紝浣犲彲浠ュ悜浠諱綍涓涓獥鍙e彂閫佹秷鎭紝榪欎釜紿楀彛鑷繁浼氬湪鑷繁鐨剋ndproc閲屾潵澶勭悊榪欎釜娑堟伅錛屽鏋滃畠澶勭悊涓嶄簡錛屽氨浜ょ粰default window/dialog proc鍘誨鐞嗐傝屽湪C++閲岋紝浣犺鍚戜竴涓獥鍙e彂娑堟伅錛屽氨寰楃‘淇濊繖涓獥鍙h兘澶勭悊榪欎釜娑堟伅錛屾垨鑰呰錛屽叿鏈夊悎閫傜殑綾誨瀷銆傝繖鏍蜂竴鏉ョ殑璇濓紝灝變細瀵艱嚧涓涓敊緇煎鏉傜殑紿楀彛綾誨眰嬈$粨鏋勶紝鏃犳硶瀹炵幇銆傝屽鏋滀綘瑕佽鎵鏈夌殑紿楀彛綾婚兘鑳藉鐞嗘墍鏈夊彲鑳界殑娑堟伅錛屼笖涓嶈榪欐牱鍦ㄩ昏緫涓婂氨琛屼笉閫氾紙鐢ㄦ埛瀹氫箟鐨勬秷鎭庝箞澶勭悊錛燂級錛屽崟鍦ㄥ疄鐜頒笂灝變笉鍙帴鍙椻斺斾負涓涓皬灝忕殑涓嶅悓灝卞緱鍒涢犱竴涓柊鐨勭獥鍙g被錛屾瘡涓涓皬灝忕殑紿楀彛綾婚兘瑕佽儗涓婁竴涓杈炬暟鐧鵑」鐨剉-table錛岃屽叾涓彲鑳?9%鐨勯」閮芥槸嫻垂錛屼笉瑕佽鍦ㄥ綋鏃訛紝灝辨槸鍦ㄤ粖澶╋紝鍐呭瓨鏁伴噺闈炲父涓板瘜鐨勬椂鍊欙紝濡傛灉姣忎竴涓狦UI紼嬪簭閮借繖涔堟悶錛岀敤鎴蜂篃鍚冧笉娑堛?/p>

6. 瀹為檯涓奀++鐨勯潤鎬佹秷鎭満鍒惰繕寮曡搗浜嗘洿娣變弗閲嶇殑闂鈥斺旀壄鏇蹭簡浜轟滑瀵歸潰鍚戝璞$殑鐞嗚В銆傛棦鐒跺繀欏昏鍏堢煡閬撳璞$殑綾誨瀷錛屾墠鑳藉悜瀵硅薄鍙戞秷鎭紝閭d箞“綾?#8221;榪欎釜姒傚康灝辯壒鍒噸瑕佷簡錛岃屽璞″彧涓嶈繃鏄被榪欎釜妯″瓙閲岄犲嚭鏉ョ殑涓滆タ錛屽弽鑰屼笉閲嶈銆傛笎娓愮殑錛?#8220;闈㈠悜瀵硅薄緙栫▼”鍙樻垚浜?#8220;闈㈠悜綾葷紪紼?#8221;錛?#8220;闈㈠悜綾葷紪紼?#8221;鍙樻垚浜?#8220;鏋勯犵被緇ф壙鏍?#8221;銆傛斁鍦ㄧ溂鍓嶇殑椴滄椿鐨勫璞℃椿鍔ㄤ笉閲嶈浜嗭紝鍙嶈屾槸鍏惰儗鍚庣殑闈欐佺被鍨嬬郴緇熸垚涓哄叧閿?#8220;灝佽銆佺戶鎵?#8221;榪欎簺絎簩絳夌殑鐗規(guī)э紝鍠у澶轟富錛屼卡鐒舵垚浜嗛潰鍚戝璞$殑瑕佺礌銆傛瘡涓▼搴忓憳浼間箮閮借鍏堟垚涓洪鍩熶笓瀹訛紝鐒跺悗鎴愪負棰嗗煙鍒嗙被瀛︿笓瀹訛紝鐒跺悗鏋勯犱竴涓畬鏁寸殑緇ф壙鏍戯紝鐒跺悗鎵嶈兘new鍑哄璞★紝璁╃▼搴忚窇璧鋒潵銆傛鏄洜涓鴻繖涓繃紼嬪お婕暱錛屽お鍥伴毦錛屽啀鍔犱笂C++鏈韓鐨勫鏉傚害灝卞緢澶э紝鎵浠++鍑虹幇榪欎箞澶氬勾錛岀湡姝e牚縐扮粡鍏哥殑闈㈠悜瀵硅薄綾誨簱鍜屾鏋訛紝鍑犱箮灞堟寚鍙暟銆傚緢澶氭祦琛岀殑搴擄紝姣斿MFC銆乮ostream錛岄兘鏆撮湶鍑轟笉灝戦棶棰樸備竴鑸▼搴忓憳鎬昏寰楁槸鑷繁鐨勬按騫充笉澶燂紝浜庢槸涓嬫洿澶у姛澶幓緇冨墤銆傛畩涓嶇煡鏍規(guī)湰涓婃槸鏂瑰悜閿欎簡錛岃劚紱諱簡瀵硅薄鑼冨紡鐨勬湰璐紝浼佸浘鐢ㄩ潤鎬佸垎綾繪硶鏉ュ鐜板疄涓栫晫寤烘ā錛屽幓鍒葷敾鍙樺寲涓囧崈鐨勫姩鎬佷笘鐣屻傝繖涔堥毦鐨勪簨錛屼綘姘村鉤鍐嶉珮涔熷緢闅懼仛濂姐?/p>

鍙互浠庝竴涓叿浣撶殑渚嬪瓙鏉ョ悊瑙h繖涓亾鐞嗭紝姣斿鍦ㄤ竴涓狦UI緋葷粺閲岋紝涓涓?Push Button 鐨勮璁¢棶棰樸備簨瀹炰笂鍦ㄤ竴涓疄闄呯殑紼嬪簭閲岋紝涓涓?push button 鍒板簳“鏄笉鏄?#8221;涓涓?button錛岃繘鑰屾槸涓嶆槸涓涓?window/widget錛屽茍涓嶉噸瑕侊紝鏈川涓婃垜鏍規(guī)湰涓嶅叧蹇冨畠鏄粈涔堬紝瀹冧粠灞炰簬鍝竴涓被錛屽湪緇ф壙鏍戦噷澶勪簬浠涔堜綅緗紝鍙閭i噷鏈夎繖涔堜竴涓笢瑗匡紝鎴戝彲浠ョ偣瀹冿紝鐐瑰畬浜嗗彲浠ュ彂鐢熺浉搴旂殑鏁堟灉錛屽氨鍙互浜嗐傚彲鏄疭imula –> C++ 鎵榧撳姳鐨勯潰鍚戝璞¤璁¢鏍鹼紝闈炶涓婃潵灝辨兂娓呮錛宎 Push Button is-a Button, a Button is-a Command-Target Control, a Command-Target Control is-a Control, a Control is-a Window. 鎶婅繖涓鍦堥兘鎯抽忓交涔嬪悗錛屾墠鑳?new 涓涓?Push Button錛岀劧鍚庢墠鑳借瀹冨伐浣溿傝繖灝卞艦鑰屼笂瀛︿簡錛岃繖灝辮劚紱誨疄闄呬簡銆傛墍浠ュ緢闅懼仛濂姐備綘鐪嬪埌 MFC 鐨勭被緇ф壙鏍戯紝瑙夊緱璁捐鑰呭お鐗涗簡錛岃兘鎶婅繖浜涘眰嬈℃蹇甸兘鎯蟲竻妤氾紝鑷繁鐨勬按騫寵繕涓嶅錛岃繕寰椾慨鐐箋傚疄闄呬笂鍛紝榪欎釜璁捐鏄粡榪囨暟涓嶆竻鐨勫け璐ュ拰閽辯(鍑烘潵銆佺牳鍑烘潵鐨勶紝MFC鐨勫墠韜?Afx 涓嶆槸灝卞け璐ヤ簡鍚楋紵1995騫磋繕鏈変竴涓彨鍋?Taligent 鐨勫ぇ欏圭洰錛屽彫闆嗕簡鍖呮嫭 Eric Gamma 鍦ㄥ唴鐨勪竴澶у爢鐗涗漢錛岃鐢–++鍋氫竴涓竴緇熷ぉ涓嬬殑application framework錛屾渶鍚庝篃浠ユ儴璐ュ憡緇堬紝榪炲叕鍙擱兘鍊掗棴浜嗭紝CEO杞︾ジ韜骸錛岀墰浜轟滑鎮(zhèn)夋暟閬f暎銆傞檮甯﹁涓涓嬶紝榪欎釜Taligent欏圭洰鏄負浜嗚窡NextSTEP鍜孧icrosoft Cairo绔炰簤錛屽墠鑰呯敤Objective-C緙栧啓錛屽悗鏉ュ彂灞曚負Cocoa錛屽悗鑰呯敤浼犵粺鐨刉in32 + COM浣滀負鍩虹鏋舵瀯錛屽悗鏉ュ彂灞曚負Windows NT銆傝孫bjective-C鍜孋OM錛屾伆鎭板氨鍦ㄥ姩鎬佹秷鎭垎媧炬柟闈紝涓嶤++榪ョ劧涓嶅悓銆傚悗闈㈣繕浼氳皥鍒般?/p>

瀹㈣鍦拌錛?#8220;闈㈠悜綾葷殑璁捐”騫朵笉鏄病鏈夋剰涔夈傛潵婧愪簬瀹炶返鍙堥珮浜庡疄璺電殑鎶借薄鍜屾蹇碉紝寰寰鑳芥洿鏈夊姏鍦版妸鎻′綇鐜板疄涓栫晫鐨勬湰璐紝姣斿MVC鏋舵瀯錛屽氨鏄繖鏍風殑鏈夊姏鐨勬娊璞°備絾鏄繖縐嶆娊璞★紝搴旇鏄潵婧愪簬闀挎湡鏈浣沖疄璺電殑鎬葷粨鍜屾彁楂橈紝鑰屼笉鏄潰瀵歸棶棰樻椂涓昏鐨勮В鍐蟲濊礬銆傝繃浜庡己璋冭繖縐嶆娊璞★紝鏃犲紓浜庡亣瀹氱▼搴忓憳鍚勪釜閮芥槸鍝插瀹訛紝鍏鋒湁瀵圭幇瀹炰笘鐣屽噯紜屾繁鍒葷殑鎶借薄鑳藉姏錛屽綋鐒舵槸涓嶇鍚堝疄闄呮儏鍐電殑銆傜粨鏋滃憿錛屽垰瀛︿範闈㈠悜瀵硅薄娌″嚑澶╃殑紼嬪簭鍛橈紝瀵圭溂鍓嶉矞媧葷殑瀵硅薄涓栫晫瑙嗚屼笉瑙侊紝涓涓釜閮界厼鏈変粙浜嬪湴鍘繪悶鍝插鍐ユ兂錛屼紒鍥捐秺榪囩幇瀹炰笘鐣岋紝鍘繪娊璞″嚭鍏惰儗鍚庢湰璐紝褰撶劧璐ュ緱寰堟儴銆?/p>

鍏跺疄C++闂笘涔嬪悗涓嶄箙錛岃繖涓棶棰樺氨鏆撮湶鍑烘潵浜嗐傜涓涓狢++緙栬瘧鍣?Cfront 1.0 鏄崟緇ф壙錛岃屽埌浜?Cfront 2.0錛屽姞鍏ヤ簡澶氱戶鎵褲備負浠涔堬紵灝辨槸鍥犱負浣跨敤涓漢浠彂鐜伴昏緫涓婁技涔庡畬緹庣殑闈欐佸崟緇ф壙鍏崇郴錛岀鍒板鏉傜伒媧葷殑鐜板疄涓栫晫錛屽氨鐮寸喚鐧懼嚭鈥斺旇潤铦犳槸楦熶篃鏄吔錛屾按涓婇鏈鴻兘椋炰篃鑳芥父錛屽畠浠濡備綍褰掔被鍛紵鏈潵榪欏簲璇ヤ績浣垮ぇ瀹跺弽鎬濈戶鎵胯繖涓満鍒舵湰韜紝浣嗘槸閭d釜鏃跺欏叏涓栫晫闄峰叆緇ф壙鐙傜儹錛屼簬鏄氨寮濮嬬粰緇ф壙鎵撹ˉ涓侊紝鍔犲叆澶氱戶鎵匡紝榪涜屽姞鍏ヨ櫄緇ф壙錛屻傚埌浜嗚櫄緇ф壙錛屾槑鐪間漢涓鐪嬩究鐭ワ紝榪欏彧鏄竴涓娉曡ˉ涓侊紝鏄負浜嗛冮伩鑱岃矗鑰屽埗閫犵殑涓鍧楁棤鐢ㄧ殑閬緸甯冿紝瀹冨凡緇忓畬鍏ㄥ凡緇忚劚紱誨疄璺典簡鈥斺旀湁璋佸湪浜嬪墠鑳藉鍒ゆ柇鏄惁搴旇瀵瑰熀綾昏繘琛岃櫄緇ф壙鍛紵

鍒頒簡1990騫翠唬涓湡錛岄棶棰樺凡緇忓崄鍒嗘槑鏄俱俇ML涓湁涓涓璞℃椿鍔ㄥ浘錛屽叾鎻忚堪鐨勫氨鏄繍琛屾椂瀵硅薄涔嬮棿鐩鎬簰浼犻掓秷鎭殑妯″瀷銆?994騫碦obert C. Martin鍦ㄣ奜bject-Oriented C++ Design Using Booch Method銆嬩腑錛屾浘寤鴻闈㈠悜瀵硅薄璁捐浠庡璞℃椿鍔ㄥ浘鍏ユ墜錛岃屼笉鏄粠綾誨浘鍏ユ墜銆傝?995騫村嚭鐗堢殑緇忓吀浣滃搧銆奃esign Patterns銆嬩腑錛屽緩璁紭鍏堣冭檻緇勫悎鑰屼笉鏄戶鎵匡紝榪欎篃鏄敖浜虹殕鐭ョ殑浜嬫儏銆傝繖浜涜抗璞¤〃鏄庯紝鍦ㄩ偅涓椂鍊欙紝闈㈠悜瀵硅薄紺懼尯閲岀殑鎬濇兂棰嗚浠紝宸茬粡鎰忚瘑鍒?#8220;闈㈠悜綾葷殑璁捐”騫朵笉濂界敤銆傚彧鍙儨浠栦滑鐨勯潻鍛界簿紲炶繕涓嶅銆?/p>

7. 浣犲彲鑳借闂紝Java 鍜?NET涔熸槸鐢ㄧ戶鎵垮叧緋葷粍緇囩被搴擄紝騫惰繘琛岃璁$殑鍟婏紝鎬庝箞閭d箞鎴愬姛鍛紵榪欓噷鏈変笁鐐瑰簲璇ユ敞鎰忋傜涓錛孋++鐨勯毦涓嶄粎浠呭湪浜庡叾闈欐佺粨鏋勪綋緋伙紝榪樻湁寰堝婧愪簬璇█璁捐涓婄殑鍖呰⒈錛屾瘮濡傚C鐨勫吋瀹癸紝姣斿娌℃湁鍨冨溇鏀墮泦鏈哄埗錛屾瘮濡傚鏁堢巼鐨勫己璋冿紝絳夌瓑銆備竴鏃︽妸榪欎簺鍖呰⒈涓㈡帀錛岃璁$殑闅懼害紜疄鍙互澶уぇ涓嬮檷銆傜浜岋紝Java鍜?NET鐨勬牳蹇冪被搴撴槸鍦–++鍗佸嚑騫存垚鍔熷拰澶辮觸鐨勭粡楠屾暀璁熀紜涔嬩笂錛岀粨鍚圕OM浣撶郴浼樼偣璁捐瀹炵幇鐨勶紝鑷劧瑕佸ソ涓婁竴澶у潡銆備簨瀹炰笂錛屽湪Java鍜?NET鏍稿績綾誨簱鐨勮璁′腑寰堝鍦版柟錛屼綋鐜扮殑鏄熀浜庢帴鍙g殑璁捐錛屽拰鐪熸鐨勫熀浜庡璞$殑璁捐銆傛湁浜嗚繖涓や釜涓昏绔欏彴錛?#8220;闈㈠悜綾葷殑璁捐”涓嶈兘鍠у澶轟富錛屼篃鑳藉彂鎸ヤ竴浜涘ソ鐨勪綔鐢ㄣ傜涓夛紝濡傚悗鏂囨寚鍑猴紝Java鍜?NET涓垎鍒C++鏈澶х殑闂鈥斺旂己灝戝璞$駭鍒殑delegate鏈哄埗鍋氬嚭浜嗚嚜宸辯殑鍥炲簲錛岃繖灝卞ぇ澶у譏琛ヤ簡鍘熸潵鐨勯棶棰樸?/p>

灝界濡傛錛孞ava榪樻槸娌炬煋涓婁簡“闈㈠悜綾昏璁?#8221;鐨勭檶鐥囷紝鍩虹綾誨簱閲屽氨鏈夊緢澶氭灦搴婂彔灞嬬殑璁捐錛岃孞2EE/Java EE褰撲腑錛岃繖縐嶅艦鑰屼笂瀛︾殑璁捐涔熷緢鏅亶錛屾墍浠ヤ篃寮曞彂浜嗗ソ鍑犳杞婚噺鍖栫殑榪愬姩銆傝繖鏂歸潰鎴戝茍涓嶆槸澶噦錛屽彲鑳介渶瑕佺湡姝g殑Java楂樻墜鍑烘潵鐜拌韓璇存硶銆傛垜瀵笿ava鐨勭湅娉曚互鍓嶅氨璁茶繃鈥斺斿鉤鍙板拰璇█鏍稿績闈炲父濂斤紝浣嗛姘斾笉濂斤紝宕囧皻鍗庝附綣佸鐨勮璁★紝瑁呯墰閫肩殑浜哄お澶氥?/p>

鑷充簬.NET錛屾垜鍚檲姒曚粙緇嶈繃錛屽湪璁捐.NET鐨勬椂鍊欙紝寰蔣鍐呴儴瀵逛簬鏄惁鍏佽緇ф壙鐖嗗彂浜嗛潪甯告縺鐑堢殑浜夎銆傚緢澶氳祫娣遍珮浜洪兘寮虹儓鍙嶅緇ф壙銆傝嚦浜庢渶鍚庡紩鍏ョ戶鎵匡紝寰堝ぇ紼嬪害涓婃槸钀ラ攢闇瑕佸帇鍊掍簡鎶鏈悊鎬с傚敖綆″姝わ紝鐢變簬鏈塁OM鐨勫熀紜錛屽張瀹炵幇浜嗛潪甯稿交搴曠殑delegate錛屾墍浠?.NET 鐨勮璁℃按騫寵繕鏄緢楂樼殑銆傚畠鐨勪富瑕侀棶棰樹笉鍦ㄨ繖錛屽湪浜庡お鎬ヤ簬姹傝儨錛屾洿鏂伴熷害澶揩錛屽熀紜涓嶇墷銆傚綋鐒訛紝鏍規(guī)湰闂榪樻槸寰蔣娌℃湁鑳藉鍦╓eb鍜孧obile棰嗗煙閲屽崰鍒板澶х殑浼樺娍錛屼篃灝變嬌寰?NET娌℃湁鐢ㄦ涔嬪湴銆?/p>

8. COM銆侰OM鐨勮涔夋槸錛岃蔣浠舵槸鐢盋OM Components緇勬垚錛宑omponents涔嬮棿褰兼閫氳繃鎺ュ彛鐩鎬簰閫氳銆傝繖鏄惁璁╀綘鍥炴兂璧鋒湰鏂囧紑綃囨墍鎻愬嚭鐨勫璞¤寖鍨嬬殑涓や釜鍩烘湰鍘熷垯錛熸湁瓚g殑鏄紝鍦–OM鐨勬湳璇噷錛?#8220;COM Component ” 涓?#8220;object ”閫氬亣錛岃繖灝變嬌COM鐨勫績鎬濇槶鐒惰嫢鎻簡銆侱on Box鍦‥ssential COM閲屽紑綃囧氨璇達紝COM鏄洿濂界殑C++錛屼簨瀹炰笂灝辨槸鍛婅瘔澶у錛屽艦鑰屼笂瀛︾殑“闈㈠悜綾昏璁?#8221;涓嶅ソ浣匡紝榪樻槸鍥炲埌瀵硅薄鍚с?/p>

鐢–OM寮鍙戠殑鏃跺欙紝涓涓粍浠?#8220;鏄粈涔?#8221;涓嶉噸瑕侊紝瀹冨叿鏈変粈涔堟帴鍙o紝涔熷氨鏄錛岃兘澶熷瀹冨彂浠涔堟秷鎭紝鎵嶆槸閲嶈鐨勩備綘鍙互鐢↖Unknown::QueryInterface闂粍浠惰兘瀵瑰摢涓緇勬秷鎭綔鍑哄弽搴斻傚悜緇勪歡鍒嗘淳娑堟伅涔熶笉涓瀹氳琚粦瀹氬湪鏂規(guī)硶璋冪敤涓婏紝濡傛灉瀹炵幇浜?IDispatch錛岃繕鍙互瀹炵幇“鑷姩鍖?#8221;璋冪敤錛屼篃灝辨槸COM鏈閲岀殑 Automation錛岃岄氳繃 鍒楅泦錛坢ashal錛夛紝鍙互璺ㄨ繘紼嬨佽法緗戠粶鍚戝彟涓緇勪歡鍙戦佹秷鎭紝閫氳繃 moniker錛屽彲浠ュ湪鍒嗗竷寮忕郴緇熼噷瀹氫綅鍜屽彂鐜扮粍浠躲傚鏋滀綘鎶辯潃“瀵硅薄鈥斺旀秷鎭?#8221;鐨勮蹇靛幓鐪婥OM鐨勮璁★紝灝變細鎰忚瘑鍒幫紝鏁翠釜COM浣撶郴灝辨槸鐢ㄨ鑼冨浣曞仛瀵硅薄錛屽浣曞彂娑堟伅鐨勩傛垨鑰呮洿鐩寸櫧涓鐐癸紝COM灝辨槸鐢–/C++紜槸妯℃嫙鍑轟竴涓猄malltalk銆傝屼笖COM鐨勬蹇典笘鐣岄噷娌℃湁緇ф壙錛屽氨鍏剁函媧佹ц岃█錛屾瘮Smalltalk榪楽malltalk銆傚湪瀵硅薄娉涘瀷涓婏紝COM杈懼埌浜嗕竴涓珮宄幫紝棰嗗厛浜庨偅涓椂浠o紝鐢氳嚦浜庢瘮瀹冪殑緇т換.NET榪樿綰磥銆?/p>

COM鐨勪富瑕侀棶棰樻槸瀹冪殑瀛︿範闅懼害鍜屽畨鍏ㄩ棶棰橈紝鑰屼笖錛屽畠榪囦簬榪芥眰綰磥鎬э紝瀹屽叏鏀懼純浜?#8220;闈㈠悜綾昏璁?#8221; 鐨勬満鍒訛紝鏄懼緱鏈夌偣榪囥?/p>

9. 濂藉儚鏈夌偣鎵繙浜嗭紝鍏跺疄榪樻槸鍦ㄨ姝d簨銆備笂闈㈣鍒扮敱浜嶤++鐨勯潤鎬佹秷鎭満鍒訛紝瀵艱嚧浜嗗艦鑰屼笂瀛︾殑“闈㈠悜綾葷殑璁捐”錛岀ジ瀹蟲棤絀楓備絾瀹為檯涓婏紝C++鏄湁涓涓ˉ鏁戞満浼氱殑錛岄偅灝辨槸瀹炵幇瀵硅薄綰у埆鐨刣elegate鏈哄埗銆傚榪?NET鐨勪漢錛屼竴鍚琩elegate榪欎釜璇嶅氨鐭ラ亾鏄粈涔堟剰鎬濓紝浣咼ava閲屾病鏈夊搴旀満鍒躲傚湪C++鐨勬湳璇綋緋婚噷錛屾墍璋撳璞$駭鍒玠elegate錛屽氨鏄竴涓璞″洖璋冩満鍒躲傞氳繃delegate錛屼竴涓璞鍙互鎶婁竴涓壒瀹氬伐浣滐紝姣斿澶勭悊鐢ㄦ埛鐨勯紶鏍囦簨浠訛紝濮旀墭緇欏彟涓涓璞鐨勪竴涓柟娉曟潵瀹屾垚銆侫涓嶅繀鐭ラ亾B鐨勫悕瀛楋紝涔熶笉鐢ㄧ煡閬撳畠鐨勭被鍨嬶紝鐢氳嚦閮戒笉闇瑕佺煡閬揃鐨勫瓨鍦紝鍙姹侭瀵硅薄鍏鋒湁涓涓鍚嶆紜殑鏂規(guī)硶錛屽氨鍙互閫氳繃delegate鎶婂伐浣滀氦緇橞鐨勮繖涓柟娉曟潵鎵ц銆傚湪C璇█閲岋紝榪欎釜鏈哄埗鏄氳繃鍑芥暟鎸囬拡瀹炵幇鐨勶紝鎵浠ュ緢鑷劧鐨勶紝鍦–++閲岋紝鎴戜滑甯屾湜閫氳繃鎸囧悜鎴愬憳鍑芥暟鐨勬寚閽堟潵瑙e喅綾諱技闂銆?/p>

鐒惰屽氨鍦ㄨ繖涓棶棰樹笂錛孋++璁╀漢鎵艱厱鐥涙儨銆?/p>

zhaoyg 2011-01-20 22:24 鍙戣〃璇勮
]]>
浠涔堟椂鍊欒嚜鍔ㄥ悎鎴愮殑璧嬪兼搷浣滅涓嶈兘鐢?/title><link>http://m.shnenglu.com/zhaoyg/archive/2010/05/08/114852.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sat, 08 May 2010 08:21:00 GMT</pubDate><guid>http://m.shnenglu.com/zhaoyg/archive/2010/05/08/114852.html</guid><wfw:comment>http://m.shnenglu.com/zhaoyg/comments/114852.html</wfw:comment><comments>http://m.shnenglu.com/zhaoyg/archive/2010/05/08/114852.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.shnenglu.com/zhaoyg/comments/commentRss/114852.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zhaoyg/services/trackbacks/114852.html</trackback:ping><description><![CDATA[鍓嶄竴孌墊椂闂村啓浜嗙被浼間簬榪欐牱鐨勪竴孌典唬鐮?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> A<br>{<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ptr;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>    A():ptr(NULL)<br>    {<br>    }<br>};<br><br>A one;<br>A two;<br>two </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> one;</span></div> 緙栬瘧鏃跺彂鐜幫紝緙栬瘧鍣ㄦ彁紺鴻榛樿璧嬪兼搷浣滅涓嶈兘鐢紝鑰屽綋鎴戝幓鎺塸tr鎴愬憳鐨刢onst鍏抽敭瀛楀悗錛屼究濂戒簡銆傚綋鏃跺緢綰抽椃榪欐槸鎬庝箞鎼炵殑銆?br>鍚庢潵鍦ㄥソ蹇冧漢鐨勫府鍔╀笅錛屾墠鎰忚瘑鍒皃tr鏄釜const錛屾墍浠ラ粯璁ょ殑璧嬪兼搷浣滅涓嶈兘瀵筽tr榪涜璧嬪箋?br><br>鍞夛紝褰撴椂鐭ラ亾鏄繖涓師鍥犲悗鐪熺殑鏄緸娑╅毦褰擄紝鑷繁鏄庣煡閬揷onst涓嶈兘琚祴鍊兼槸甯歌瘑闂錛屼絾褰撴椂鍗存媧繪病鑳芥壘鍑哄師鍥犮?br>鑰屾洿瑕佷漢鍛界殑鏄垜涔嬪墠鍦?a href="http://m.shnenglu.com/zhaoyg/archive/2009/10/07/98041.html"><font color=#1a8bc8>{鍋跺皵瀛︿範C++鏍囧噯} 涔?[瀵硅薄鐨勫鍒?- 澶嶅埗鏋勯犱笌璧嬪兼搷浣滅] </font></a>涓氨宸茬粡瀵硅祴鍊兼搷浣滅鍋氫簡涓浜涚瑪璁幫紝浣嗘垜绔熺劧鎶婁竴浜涘唴瀹圭粰蹇樹簡錛堜篃鍙兘鏄帇鏍瑰氨娌℃敞鎰忥級銆?br><br>鐜板湪閲嶆柊灝辮嚜鍔ㄥ悎鎴愮殑璧嬪兼搷浣滅浣曟椂涓嶈兘浣跨敤鍐嶅崟鐙仛涓嬈$瑪璁般?br><br>褰撶被涓嫢鏈変互涓嬩竴縐嶆垨鍑犵鎯呭喌鏃訛紝闅愬紡瀹氫箟鐨勮祴鍊兼搷浣滅鏄笉鑳戒嬌鐢ㄧ殑錛?br>1.闈為潤鎬佺殑const鎴愬憳鍙橀噺<br>2.闈為潤鎬佺殑寮曠敤綾誨瀷鎴愬憳鍙橀噺<br>3.闈為潤鎬佺殑綾葷被鍨嬬殑鎴愬憳鍙橀噺鐨勮祴鍊兼搷浣滅涓嶅彲璁塊棶<br>4.錛堝鏋滄湁錛夊熀綾諱腑鐨勮祴鍊兼搷浣滅涓嶅彲璁塊棶<br><br>娉紝瀵逛簬鎷ユ湁浠ヤ笂鎯呭喌涓殑涓縐嶆垨澶氱鐨勭被錛屾爣鍑嗕腑鐨勭敤璇嶆槸錛歩ll-formed銆傛垜涓嶇煡閬撲負浠涔堣鐢╥ll-formed錛堝瓧闈㈡剰鎬濓細涓嶈鑼冿級錛屼絾涓嶇鎬庢牱錛屽浜巌ll-formed錛岀紪璇戝櫒鐨勮涓哄氨鏄紝鏃犳硶緙栬瘧閫氳繃銆?br><br>鍚庤錛氬笇鏈涜繖嬈′笉瑕佸啀蹇樿榪欎簺鍐呭浜嗐? <img src ="http://m.shnenglu.com/zhaoyg/aggbug/114852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-05-08 16:21 <a href="http://m.shnenglu.com/zhaoyg/archive/2010/05/08/114852.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鏋氫婦鐨勬彃鏇?/title><link>http://m.shnenglu.com/zhaoyg/archive/2010/04/29/114004.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 29 Apr 2010 15:01:00 GMT</pubDate><guid>http://m.shnenglu.com/zhaoyg/archive/2010/04/29/114004.html</guid><wfw:comment>http://m.shnenglu.com/zhaoyg/comments/114004.html</wfw:comment><comments>http://m.shnenglu.com/zhaoyg/archive/2010/04/29/114004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zhaoyg/comments/commentRss/114004.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zhaoyg/services/trackbacks/114004.html</trackback:ping><description><![CDATA[<p>浠婂ぉ錛屾垜鏃犳剰涓皢榧犳爣鏀懼湪涓涓湪綾諱腑瀹氫箟鐨勬灇涓炬垚鍛樺悗錛屽脊鍑轟簡涓涓惈鏈夎鎴愬憳鍘熷瀷鐨勬彁紺轟俊鎭紝鐪嬪埌榪欎釜鎻愮ず鍚庢垜欏挎椂鎰d綇浜?..<br>濡傚浘錛?br><img border=0 src="http://m.shnenglu.com/images/cppblog_com/zhaoyg/enum.png"></p> 褰撴椂鐪嬪埌__unnamed_0000_1鐩存帴鎰d綇浜嗭紝鍝潵鐨刜_unnamed_0000_1錛?br>姝e綋鎴戞兂闂埆浜虹殑鏃跺欙紝紿佺劧鎯沖埌浜嗙瓟妗堬紝鍘熸潵絳旀寰堢畝鍗曘傚洜涓篢ET鏄痚num鐨勪竴涓垚鍛橈紝鏃㈢劧鏄垚鍛橈紝閭d箞蹇呯劧鏈変竴涓綔鐢ㄥ煙浜嗭紝鑰屾垜瀹氫箟鐨勬槸鍖垮悕鐨勬灇涓撅紝鎵浠ョ紪璇戝櫒灝變互__unnamed_0000_1鏉ュ懡鍚嶄簡銆? <img src ="http://m.shnenglu.com/zhaoyg/aggbug/114004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-04-29 23:01 <a href="http://m.shnenglu.com/zhaoyg/archive/2010/04/29/114004.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>[杞琞 鍐嶆綰犵粨浜庡弸鍏冨0鏄庢槸鍚﹀悜澶栧洿寮曞叆鍚嶅瓧http://m.shnenglu.com/zhaoyg/archive/2010/03/07/109091.htmlzhaoygzhaoygSun, 07 Mar 2010 02:49:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2010/03/07/109091.htmlhttp://m.shnenglu.com/zhaoyg/comments/109091.htmlhttp://m.shnenglu.com/zhaoyg/archive/2010/03/07/109091.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/109091.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/109091.html
3. A function first declared in a friend declaration hasexternal linkage (3.5). Otherwise, the function retains its previous linkage (7.1.1).

鎸夌収3涓鐨勶紝涓嬮潰浠g爜鏄簲璇ラ氳繃鐨?
class聽X
{
聽聽聽聽friend聽
void聽f();聽
};

int聽main()
{
聽聽聽聽f();聽
//鍥犱負綾籜涓殑鍙嬪厓鍑芥暟f鐨勫0鏄庢湁澶栭儴閾炬帴錛屾墍浠ワ紝f鍙
}
void聽f()聽{聽/*聽ok聽to聽define聽friend聽function聽in聽the聽class聽body聽*/聽}

緙栬瘧嫻嬭瘯錛?
VC2005/2010閫氳繃 錛岃孏CC 4.4.3鎶ラ敊錛氭棤娉曟壘鍒板悕瀛梖


5. A function can be defined in a friend declaration of a class if and only if the class is a non-local class (9.8),the function name is unqualified, and the function has namespace scope.
[Example:
class M {
聽 聽 friend void f() { } // definition of global f, a friend of M,
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // not the definition of a member function
};
鈥攅nd example]
Such a function is implicitly inline. A friend function defined in a class is in the (lexical) scope of the class in which it is defined. A friend function defined outside the class is not (3.4.1).

鎸夌収5涓鐨勶紝鏃㈢劧鍦ㄧ被涓畾涔夊弸鍏冨嚱鏁癴錛屾槸"definition of global f"錛岄偅涔堜篃灝卞彲浠ョ悊瑙d負涓嬮潰鐨勪唬鐮佹槸鍙互閫氳繃緙栬瘧鐨?
class聽X
{
聽聽聽聽friend聽
void聽f(){聽/*聽ok聽to聽define聽friend聽function聽in聽the聽class聽body聽*/聽}
};

int聽main()
{
聽聽聽聽f();聽
}聽

鐒惰孷C2005/2010鍜孏CC4.4.3閮戒笉鑳介氳繃

TCPL涓鍙嬪厓鏈夊涓嬭鏄庯細
聽 鈥滀竴涓弸鍏冨0鏄庝笉浼氱粰澶栧洿鐨勪綔鐢ㄥ煙寮曡繘涓涓悕瀛椻澛?
聽 鈥滀竴涓弸鍏冨嚱鏁版垨鑰呴渶瑕佸湪鏌愪釜澶栧洿浣滅敤鍩熼噷鏄懼紡澹版槑錛屾垨鑰呬互瀹冪殑綾繪垨鐢辮綾繪淳鐢熺殑綾諱綔涓轟竴涓弬鏁?13錛?鑺?錛屽惁鍒欏氨鏃犳硶璋冪敤榪欎釜鍙嬪厓浜嗐傗?

C++ primer鏈夊涓嬶細
聽 鈥滃弸鍏冨0鏄庡皢宸插懡鍚嶇殑綾繪垨闈炴垚鍛樺嚱鏁板紩鍏ュ埌澶栧洿浣滅敤鍩熶腑銆傛澶栵紝鍙嬪厓鍑芥暟鍙互鍦ㄧ被鐨勫唴閮ㄥ畾涔夛紝璇ュ嚱鏁扮殑浣滅敤鍩熸墿灞曞埌鍖呭洿璇ョ被瀹氫箟鐨勪綔鐢ㄥ煙銆傗澛?
聽 鈥滅敤鍙嬪厓寮曞叆鐨勭被鍚嶅拰鍑芥暟錛堝畾涔夋垨澹版槑錛夛紝鍙互鍍忛鍏堝0鏄庣殑涓鏍蜂嬌鐢ㄢ?
C++ primer涓殑渚嬪瓙錛?
class X {
聽 聽 聽 聽 friend class Y;
聽 聽 聽 聽 friend void f() { /* ok to define friend function in the class body */ }
};
class Z {
聽 聽 聽 聽 Y *ymem; // ok: declaration for class Y introduced by friend in X
聽 聽 聽 聽 void g() { return ::f(); } // ok: declaration of f introduced by X
};


鏍囧噯涓鐨勫拰C++ PRIMER涓鏍鳳紝鑰屽拰TCPL涓嶄竴鏍楓?
鑷充簬緙栬瘧鍣紝GCC鍋氱殑鍜孴CPL璇寸殑涓鏍鳳紝鑰孷C鍜屾爣鍑嗚鐨勯儴鍒嗕竴鏍鳳紙瀵逛簬鍦ㄥ弸鍏冨0鏄庡嚭瀹氫箟鍑芥暟澶勬湁鍑哄叆錛?

涓漢鎬葷粨
涓や釜緙栬瘧鍣ㄨ涓轟笉鍚岋紝鎵浠ュ敖閲忔彁鍓嶅0鏄庡弸鍏冩墍澹版槑鐨勫悕瀛?

浠ヤ笂鍙槸涓漢鐨勭湅娉曪紝濡傛灉鏈変笉瀵圭殑鍦版柟錛?span style="COLOR: #ff0000">鎭寵鍚勪綅澶уぇ鎸囨



zhaoyg 2010-03-07 10:49 鍙戣〃璇勮
]]>
[杞琞 瀵硅薄瀹夊叏鑷潃鐨勬潯浠?/title><link>http://m.shnenglu.com/zhaoyg/archive/2010/02/11/107718.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 11 Feb 2010 10:53:00 GMT</pubDate><guid>http://m.shnenglu.com/zhaoyg/archive/2010/02/11/107718.html</guid><wfw:comment>http://m.shnenglu.com/zhaoyg/comments/107718.html</wfw:comment><comments>http://m.shnenglu.com/zhaoyg/archive/2010/02/11/107718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zhaoyg/comments/commentRss/107718.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zhaoyg/services/trackbacks/107718.html</trackback:ping><description><![CDATA[<p>瀵硅薄濡傛灉瑕佸畨鍏ㄧ殑鑷潃錛屽緱淇濊瘉浠ヤ笅鏉′歡錛?nbsp;</p> <ul> <li>this瀵硅薄鏄繀欏葷敤 new鎿嶄綔絎﹀垎閰?鑰屼笉鏄敤new[]錛屼篃涓嶆槸鐢╬lacement new錛屼篃涓嶆槸灞閮ㄥ璞★紝涔熶笉鏄痝lobal瀵硅薄)銆?</li> <li>delete this鍚庯紝涓嶈兘璁塊棶璇ュ璞′換浣曠殑鎴愬憳鍙橀噺鍙婅櫄鍑芥暟(delete this鍥炴敹鐨勬槸鏁版嵁錛岃繖鍖呮嫭瀵硅薄鐨勬暟鎹垚鍛樹互鍙妚table錛屼笉鍖呮嫭鍑芥暟浠g爜)銆?nbsp;</li> <li>delete this鍚庯紝涓嶈兘鍐嶈闂畉his鎸囬拡銆傛崲鍙ヨ瘽璇達紝浣犱笉鑳藉幓媯鏌ュ畠銆佸皢瀹冨拰鍏朵粬鎸囬拡姣旇緝銆佸拰 NULL姣旇緝銆佹墦鍗板畠銆佽漿鎹㈠畠錛屼互鍙婂叾瀹冪殑浠諱綍浜嬫儏銆?</li> </ul> <img src ="http://m.shnenglu.com/zhaoyg/aggbug/107718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-02-11 18:53 <a href="http://m.shnenglu.com/zhaoyg/archive/2010/02/11/107718.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>瀵瑰彸鍊肩被鐨勪竴鐐瑰皬璁よ瘑http://m.shnenglu.com/zhaoyg/archive/2010/02/10/107129.htmlzhaoygzhaoygWed, 10 Feb 2010 13:35:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2010/02/10/107129.htmlhttp://m.shnenglu.com/zhaoyg/comments/107129.htmlhttp://m.shnenglu.com/zhaoyg/archive/2010/02/10/107129.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/107129.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/107129.htmlclass T{ /**/ };

T fun(){  
return T();  }

int main()
{
    fun() 
= T();
    
return 0;
}


褰撴垜鐪嬪埌涓婇潰榪欐牱鐨勪唬鐮佹椂錛屾垜渚胯涓鴻繖涓唬鐮佹棤娉曠紪璇戦氳繃鐨勶紝鍥犱負鎸夋垜鎵鐭ラ亾鐨勶紝鍑芥暟fun鎵榪斿洖鐨勬槸涓涓復鏃跺璞★紝鑰屼復鏃跺璞℃槸涓嶈兘琚慨鏀圭殑錛岀劧鑰宖un()=T()璇彞渚挎伆鎭版槸鍦ㄥ涓存椂瀵硅薄榪涜淇敼銆備絾鏄綋鎴戠紪璇戜箣鍚庡嵈鍌葷溂浜嗭紝灞呯劧閫氳繃浜嗭紝鎴戝緢綰抽椃銆?br>鍚庢潵鍦ㄧ綉鍙嬬殑甯姪涓嬶紝鍦ㄦ爣鍑嗕腑鎵懼埌浜嗙瓟妗堬細

3.10.5 
The result of calling a function that does not return a reference is an rvalue. User defined operators are functions, and whether such operators expect or yield lvalues is determined by their parameter and return types.

13.5.7
The identities among certain predefined operators applied to basic types (for example, ++a ≡ a+=1) need not hold for operator functions. Some predefined operators, such as +=, require an operand to be an lvalue when applied to basic types; this is not required by operator functions.

3.10
An lvalue for an object is necessary in order to modify the object except that an rvalue of class type can also be used to modify its referent under certain circumstances. [Example: a member function called for an object (9.3) can modify the object. ]



涔熷氨鏄錛屽湪瀵瑰唴緗被鍨嬭繘琛岃祴鍊兼搷浣滄椂錛屽皢璋冪敤鍐呯疆鐨勮祴鍊兼搷浣滅錛岃岃繖縐嶅唴緗殑瑕佹眰宸︽搷浣滄暟蹇呴』鏄乏鍊鹼紱鑰屽綋瀵圭被綾誨瀷瀵硅薄榪涜璧嬪兼椂錛屾墍璋冪敤鐨勬槸閲嶈澆鐨勮祴鍊兼搷浣滅錛屼絾閲嶈澆鐨勬搷浣滅騫舵病鏈夎姹傚繀欏諱嬌鐢ㄥ乏鍊鹼紝涔熷氨鏄錛岃祴鍊兼搷浣滅鐨勫乏鎿嶄綔鏁板彲浠ユ槸鍙沖箋?br>鍚庢潵寰楃煡錛屽湪C++涓彸鍊煎彲浠ユ槸涓涓璞★紝鑰?#8220;瀵硅薄”灝辨寚鐨勬槸“涓孌靛唴瀛樺瓨璐尯鍩?#8221;錛屼絾C涓殑鍙沖煎垯涓嶆槸涓涓璞★紝浠栧彧鏄竴涓箋?br>
浠ヤ笂鍐呭濡傛湁涓嶅涔嬪錛岃繕鏈涗笉鎯滄寚姝c?br>
瀵筶value鍜宺value鐨勮緝璇︾粏浠嬬粛璇風湅鏂囩珷<Lvalues and Rvalues>錛?a href="http://m.shnenglu.com/zhaoyg/archive/2010/02/06/107405.html">http://m.shnenglu.com/zhaoyg/archive/2010/02/06/107405.html



zhaoyg 2010-02-10 21:35 鍙戣〃璇勮
]]>
[杞琞 Lvalues and Rvalueshttp://m.shnenglu.com/zhaoyg/archive/2010/02/06/107405.htmlzhaoygzhaoygSat, 06 Feb 2010 14:41:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2010/02/06/107405.htmlhttp://m.shnenglu.com/zhaoyg/comments/107405.htmlhttp://m.shnenglu.com/zhaoyg/archive/2010/02/06/107405.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/107405.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/107405.htmlC and C++ enforce subtle differences on the expressions to the left and right of the assignment operator

If you've been programming in either C or C++ for a while, it's likely that you've heard the terms lvalue (pronounced "ELL-value") and rvalue (pronounced "AR-value"), if only because they occasionally appear in compiler error messages. There's also a good chance that you have only a vague understanding of what they are. If so, it's not your fault.

Most books on C or C++ do not explain lvalues and rvalues very well. (I looked in a dozen books and couldn't find one explanation I liked.) This may be due to of the lack of a consistent definition even among the language standards. The 1999 C Standard defines lvalue differently from the 1989 C Standard, and each of those definitions is different from the one in the C++ Standard. And none of the standards is clear.

Given the disparity in the definitions for lvalue and rvalue among the language standards, I'm not prepared to offer precise definitions. However, I can explain the underlying concepts common to the standards.

As is often the case with discussions of esoteric language concepts, it's reasonable for you to ask why you should care. Admittedly, if you program only in C, you can get by without understanding what lvalues and rvalues really are. Many programmers do. But understanding lvalues and rvalues provides valuable insights into the behavior of built-in operators and the code compilers generate to execute those operators. If you program in C++, understanding the built-in operators is essential background for writing well-behaved overloaded operators.


Basic concepts

--------------------------------------------------------------------------------

Kernighan and Ritchie coined the term lvalue to distinguish certain expressions from others. In The C Programming Language (Prentice-Hall, 1988), they wrote "An object is a manipulatable region of storage; an lvalue is an expression referring to an object....The name 'lvalue' comes from the assignment expression E1 = E2 in which the left operand E1 must be an lvalue expression."

In other words, the left and right operands of an assignment expression are themselves expressions. For the assignment to be valid, the left operand must refer to an object-it must be an lvalue. The right operand can be any expression. It need not be an lvalue. For example:

int n;

declares n as an object of type int. When you use n in an assignment expression such as:

n = 3;

n is an expression (a subexpression of the assignment expression) referring to an int object. The expression n is an lvalue.

Suppose you switch the left and right operands around:

3 = n;

Unless you're a former Fortran programmer, this is obviously a silly thing to do. The assignment is trying to change the value of an integer constant. Fortunately, C and C++ compilers reject it as an error. The basis for the rejection is that, although the assignment's left operand 3 is an expression, it's not an lvalue. It's an rvalue. It doesn't refer to an object; it just represents a value.

I don't know where the term rvalue comes from. Neither edition of the C Standard uses it, other than in a footnote stating "What is sometimes called 'rvalue' is in this standard described as the 'value of an expression.'"

The C++ Standard does use the term rvalue, defining it indirectly with this sentence: "Every expression is either an lvalue or an rvalue." So an rvalue is any expression that is not an lvalue.

Numeric literals, such as 3 and 3.14159, are rvalues. So are character literals, such as 'a'. An identifier that refers to an object is an lvalue, but an identifier that names an enumeration constant is an rvalue. For example:

enum color { red, green, blue };
color c;
...
c = green;    // ok
blue = green;    // error

The second assignment is an error because blue is an rvalue.

Although you can't use an rvalue as an lvalue, you can use an lvalue as an rvalue. For example, given:

int m, n;

you can assign the value in n to the object designated by m using:

m = n;

This assignment uses the lvalue expression n as an rvalue. Strictly speaking, a compiler performs what the C++ Standard calls an lvalue-to-rvalue conversion to obtain the value stored in the object to which n refers.


Lvalues in other expressions
-------------------------------------------------------------------------------

Although lvalues and rvalues got their names from their roles in assignment expressions, the concepts apply in all expressions, even those involving other built-in operators.

For example, both operands of the built-in binary operator + must be expressions. Obviously, those expressions must have suitable types. After conversions, both expressions must have the same arithmetic type, or one expression must have a pointer type and the other must have an integer type. But either operand can be either an lvalue or an rvalue. Thus, both x + 2 and 2 + x are valid expressions.

Although the operands of a binary + operator may be lvalues, the result is always an rvalue. For example, given integer objects m and n:

m + 1 = n;

is an error. The + operator has higher precedence than the = operator. Thus, the assignment expression is equivalent to:

(m + 1) = n;    // error

which is an error because m + 1 is an rvalue.

As another example, the unary & (address-of) operator requires an lvalue as its operand. That is, &n is a valid expression only if n is an lvalue. Thus, an expression such as &3 is an error. Again, 3 does not refer to an object, so it's not addressable.

Although the unary & requires an lvalue as its operand, it's result is an rvalue. For example:

int n, *p;
...
p = &n;    // ok
&n = p;    // error: &n is an rvalue

In contrast to unary &, unary * produces an lvalue as its result. A non-null pointer p always points to an object, so *p is an lvalue. For example:

int a[N];
int *p = a;
...
*p = 3;     // ok

Although the result is an lvalue, the operand can be an rvalue, as in:

*(p + 1) = 4;    // ok


Data storage for rvalues
--------------------------------------------------------------------------------

Conceptually, an rvalue is just a value; it doesn't refer to an object. In practice, it's not that an rvalue can't refer to an object. It's just that an rvalue doesn't necessarily refer to an object. Therefore, both C and C++ insist that you program as if rvalues don't refer to objects.

The assumption that rvalues do not refer to objects gives C and C++ compilers considerable freedom in generating code for rvalue expressions. Consider an assignment such as:

n = 1;

where n is an int. A compiler might generate named data storage initialized with the value 1, as if 1 were an lvalue. It would then generate code to copy from that initialized storage to the storage allocated for n. In assembly language, this might look like:

one: .word 1
...
mov (one), n

Many machines provide instructions with immediate operand addressing, in which the source operand can be part of the instruction rather than separate data. In assembly, this might look like:

mov #1, n

In this case, the rvalue 1 never appears as an object in the data space. Rather, it appears as part of an instruction in the code space.

On some machines, the fastest way to put the value 1 into an object is to clear it and then increment it, as in:

clr n
inc n

Clearing the object sets it to zero. Incrementing adds one. Yet data representing the values 0 and 1 appear nowhere in the object code.


More to come
--------------------------------------------------------------------------------

Although it's true that rvalues in C do not refer to objects, it's not so in C++. In C++, rvalues of a class type do refer to objects, but they still aren't lvalues. Thus, everything I've said thus far about rvalues is true as long as we're not dealing with rvalues of a class type.

Although lvalues do designate objects, not all lvalues can appear as the left operand of an assignment. I'll pick up with this in my next column.

濡備笅錛?/p>

 

--------------------------------------------------------------------------------
Non-modifiable Lvalues

--------------------------------------------------------------------------------


Lvalues actually come in a variety of flavors. If you really want to understand how compilers evaluate expressions, you'd better develop a taste.

const 闄愬畾絎︾殑鍚箟錛?姣斿 int const m;
瀹冨茍涓嶆槸璇磎鐨勫間笉鑳借淇敼, 鑰屾槸鎸?m 涓嶈兘淇敼瀹冨紩鐢ㄧ殑瀵硅薄錛?br>e.g:
int m;
int const *p = &m;
m += 1;  //right
*p += 1; //wrong
 

An expression is a sequence of operators and operands that specifies a computation. That computation might produce a resulting value and it might generate side effects. An assignment expression has the form:

e1 = e2

where e1 and e2 are themselves expressions. The right operand e2 can be any expression, but the left operand e1 must be an lvalue expression. That is, it must be an expression that refers to an object. As I explained last month ("Lvalues and Rvalues," June 2001, p. 70), the "l" in lvalue stands for "left," as in "the left side of an assignment expression." For example:

int n;

declares n as an object of type int. When you use n in an assignment expression such as:

n = 3;

the n is an expression (a subexpression of the assignment expression) referring to an int object. The expression n is an lvalue. On the other hand:

3 = n;

causes a compilation error, and well it should, because it's trying to change the value of an integer constant. Although the assignment's left operand 3 is an expression, it's not an lvalue. It's an rvalue. An rvalue is simply any expression that is not an lvalue. It doesn't refer to an object; it just represents a value.

Although lvalue gets its name from the kind of expression that must appear to the left of an assignment operator, that's not really how Kernighan and Ritchie defined it. In the first edition of The C Programming Language (Prentice-Hall, 1978), they defined an lvalue as "an expression referring to an object." At that time, the set of expressions referring to objects was exactly the same as the set of expressions eligible to appear to the left of an assignment operator. But that was before the const qualifier became part of C and C++.

The const qualifier renders the basic notion of lvalues inadequate to describe the semantics of expressions. We need to be able to distinguish between different kinds of lvalues. And that's what I'm about to show you how to do. But first, let me recap.


A few key points
--------------------------------------------------------------------------------

The assignment operator is not the only operator that requires an lvalue as an operand. The unary & (address-of) operator requires an lvalue as its sole operand. That is, &n is a valid expression only if n is an lvalue. Thus, an expression such as &3 is an error. The literal 3 does not refer to an object, so it's not addressable.

Not only is every operand either an lvalue or an rvalue, but every operator yields either an lvalue or an rvalue as its result. For example, the binary + operator yields an rvalue. Given integer objects m and n:

m + 1 = n;

is an error. The + operator has higher precedence than the = operator. Thus, the assignment expression is equivalent to:

(m + 1) = n; // error

which is an error because m + 1 is an rvalue.

An operator may require an lvalue operand, yet yield an rvalue result. The unary & is one such operator. For example:

int n, *p;
...
p = &n; // ok
&n = p; // error: &n is an rvalue


On the other hand, an operator may accept an rvalue operand, yet yield an lvalue result, as is the case with the unary * operator. A valid, non-null pointer p always points to an object, so *p is an lvalue. For example:

int a[N];
int *p = a;
...
*p = 3; // ok

Although the result is an lvalue, the operand can be an rvalue, as in:

*(p + 1) = 4; // ok

With this in mind, let's look at how the const qualifier complicates the notion of lvalues.


Lvalues and the const qualifier
--------------------------------------------------------------------------------

A const qualifier appearing in a declaration modifies the type in that declaration, or some portion thereof. For example: int const n = 127;

declares n as object of type "const int." The expression n refers to an object, almost as if const weren't there, except that n refers to an object the program can't modify. For example, an assignment such as:

n = 0; // error, can't modify n

produces a compile-time error, as does:

++n; // error, can't modify n

(I covered the const qualifier in depth in several of my earlier columns. See "Placing const in Declarations," June 1998, p. 19 or "const T vs. T const," February 1999, p. 13, among others.) How is an expression referring to a const object such as n any different from an rvalue? After all, if you rewrite each of the previous two expressions with an integer literal in place of n, as in:

7 = 0; // error, can't modify literal ++7; // error, can't modify literal

they're both still errors. You can't modify n any more than you can an rvalue, so why not just say n is an rvalue, too? The difference is that you can take the address of a const object, but you can't take the address of an integer literal. For example:

int const *p;
...
p = &n; // ok
p = &7; // error

Notice that p declared just above must be a "pointer to const int." If you omitted const from the pointer type, as in:

int *p;

then the assignment:

p = &n; // error, invalid conversion

would be an error. When you take the address of a const int object, you get a value of type "pointer to const int," which you cannot convert to "pointer to int" unless you use a cast, as in:

p = (int *)&n; // (barely) ok

Although the cast makes the compiler stop complaining about the conversion, it's still a hazardous thing to do. (See "What const Really Means," August 1998, p. 11.)

Thus, an expression that refers to a const object is indeed an lvalue, not an rvalue. However, it's a special kind of lvalue called a non-modifiable lvalue-an lvalue that you can't use to modify the object to which it refers. This is in contrast to a modifiable lvalue, which you can use to modify the object to which it refers.

Once you factor in the const qualifier, it's no longer accurate to say that the left operand of an assignment must be an lvalue. Rather, it must be a non-modifiable lvalue. In fact, every arithmetic assignment operator, such as += and *=, requires a modifiable lvalue as its left operand. For all scalar types:

x += y; // arithmetic assignment

is equivalent to:

x = x + y; // assignment

except that it evaluates x only once. Since the x in this assignment must be a modifiable lvalue, it must also be a modifiable lvalue in the arithmetic assignment. Not every operator that requires an lvalue operand requires a modifiable lvalue. The unary & operator accepts either a modifiable or a non-modifiable lvalue as its operand. For example, given:

int m;
int const n = 10;

&m is a valid expression returning a result of type "pointer to int," and &n is a valid expression returning a result of type "pointer to const int."


What it is that's really non-modifiable
--------------------------------------------------------------------------------
Earlier, I said a non-modifiable lvalue is an lvalue that you can't use to modify an object. Notice that I did not say a non-modifiable lvalue refers to an object that you can't modify-I said you can't use the lvalue to modify the object. The distinction is subtle but nonetheless important, as shown in the following example. Consider:

int n = 0;
int const *p;
...
p = &n;

At this point, p points to n, so *p and n are two different expressions referring to the same object. However, *p and n have different types. As I explained in an earlier column ("What const Really Means"), this assignment uses a qualification conversion to convert a value of type "pointer to int" into a value of type "pointer to const int." Expression n has type "(non-const) int." It is a modifiable lvalue. Thus, you can use n to modify the object it designates, as in:

n += 2;

On the other hand, p has type "pointer to const int," so *p has type "const int." Expression *p is a non-modifiable lvalue. You cannot use *p to modify the object n, as in:

*p += 2;

even though you can use expression n to do it. Such are the semantics of const in C and C++.


In summary
--------------------------------------------------------------------------------
Every expression in C and C++ is either an lvalue or an rvalue. An lvalue is an expression that designates (refers to) an object. Every lvalue is, in turn, either modifiable or non-modifiable. An rvalue is any expression that isn't an lvalue. Operationally, the difference among these kinds of expressions is this:

  • A modifiable lvalue is addressable (can be the operand of unary &) and assignable (can be the left operand of =).
  • A non-modifiable lvalue is addressable, but not assignable.
  • An rvalue is neither addressable nor assignable. 
  • Again, as I cautioned last month, all this applies only to rvalues of a non-class type. Classes in C++ mess up these concepts even further. 

Dan Saks is a high school track coach and the president of Saks & Associates, a C/C++ training and consulting company. You can write to him at dsaks@wittenberg.edu.

 

鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/SeeSeaBee/archive/2007/09/08/1777120.aspx



zhaoyg 2010-02-06 22:41 鍙戣〃璇勮
]]>
[杞笘]C++妯℃澘鍏冪紪紼?/title><link>http://m.shnenglu.com/zhaoyg/archive/2009/11/15/100972.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 15 Nov 2009 06:25:00 GMT</pubDate><guid>http://m.shnenglu.com/zhaoyg/archive/2009/11/15/100972.html</guid><wfw:comment>http://m.shnenglu.com/zhaoyg/comments/100972.html</wfw:comment><comments>http://m.shnenglu.com/zhaoyg/archive/2009/11/15/100972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zhaoyg/comments/commentRss/100972.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zhaoyg/services/trackbacks/100972.html</trackback:ping><description><![CDATA[浣滆咃細鑽h<br>鍘熸枃鍑哄錛?a target=_blank><u><font color=#800080>http://www.royaloo.com/articles/articles_2003/Metaprogramming.htm</font></u></a><br><br><br><!-- DETAILS --><strong>鎽樿</strong><br><br>鏈枃鎻忚堪浜嗘ā鏉垮厓緙栫▼鎶鏈殑璧鋒簮銆佹蹇靛拰鏈哄埗錛屽茍浠嬬粛浜嗘ā鏉垮厓緙栫▼鎶鏈湪Blitz++鍜孡oki紼嬪簭搴撲腑鐨勫簲鐢ㄣ?nbsp;<br><br><strong>鍏抽敭瀛?/strong><br><br>緙栬瘧鏈熻綆?nbsp; 妯℃澘鍏冪紪紼?nbsp; Blitz++  Loki <br><br><strong>瀵艱█ </strong><br><br>1994騫達紝C++鏍囧噯濮斿憳浼氬湪鍦h凱鍝ヤ婦琛岀殑涓嬈′細璁湡闂碋rwin Unruh灞曠ず浜嗕竴孌靛彲浠ヤ駭鐢熻川鏁扮殑浠g爜銆傝繖孌典唬鐮佺殑鐗瑰埆涔嬪鍦ㄤ簬璐ㄦ暟浜х敓浜庣紪璇戞湡鑰岄潪榪愯鏈燂紝鍦ㄧ紪璇戝櫒浜х敓鐨勪竴緋誨垪閿欒淇℃伅涓棿澶規(guī)潅鐫浠?鍒版煇涓瀹氬間箣闂寸殑鎵鏈夎川鏁幫細<br> <br><font color=#008000>// Prime number computation by Erwin Unruh</font> <br>template <int i> struct D { D(void*); operator int(); }; <br><br>template <int p, int i> struct is_prime { <br>    enum { prim = (p%i) && is_prime<(i > 2 ? p : 0), i -1> :: prim }; <br>}; <br><br>template < int i > struct Prime_print { <br>    Prime_print<i-1> a; <br>    enum { prim = is_prime<i, i-1>::prim }; <br>    void f() { D<i> d = prim; } <br>}; <br><br>struct is_prime<0,0> { enum {prim=1}; }; <br>struct is_prime<0,1> { enum {prim=1}; }; <br>struct Prime_print<2> { enum {prim = 1}; void f() { D<2> d = prim; } }; <br>#ifndef LAST <br>#define LAST 10 <br>#endif <br>main () { <br>    Prime_print<LAST> a; <br>} <br><br>綾繪ā鏉緿鍙湁涓涓弬鏁頒負void*鐨勬瀯閫犲櫒錛岃屽彧鏈?鎵嶈兘琚悎娉曡漿鎹負void*銆?994騫達紝Erwin Unruh閲囩敤Metaware 緙栬瘧鍣ㄧ紪璇戝嚭閿欎俊鎭涓嬶紙浠ュ強鍏跺畠涓浜涗俊鎭紝綆鐭搗瑙侊紝瀹冧滑琚垹闄や簡錛夛細 <br>| Type `enum{}′ can′t be converted to txpe `D<2>′ ("primes.cpp",L2/C25). <br>| Type `enum{}′ can′t be converted to txpe `D<3>′ ("primes.cpp",L2/C25). <br>| Type `enum{}′ can′t be converted to txpe `D<5>′ ("primes.cpp",L2/C25). <br>| Type `enum{}′ can′t be converted to txpe `D<7>′ ("primes.cpp",L2/C25). <br>濡備粖錛屼笂闈㈢殑浠g爜宸茬粡涓嶅啀鏄悎娉曠殑C++紼嬪簭浜嗐備互涓嬫槸Erwin Unruh浜叉墜緇欏嚭鐨勪慨璁㈢増錛屽彲浠ュ湪浠婂ぉ絎﹀悎鏍囧噯鐨凜++緙栬瘧鍣ㄤ笂榪涜緙栬瘧錛?br> <br><font color=#008000>// Prime number computation by Erwin Unruh</font> <br><br>template <int i> struct D { D(void*); operator int(); }; <br><br>template <int p, int i> struct is_prime { <br>    enum { prim = (p==2) || (p%i) && is_prime<(i>2?p:0), i-1> :: prim }; <br>}; <br><br>template <int i> struct Prime_print { <br>Prime_print<i-1> a; <br>    enum { prim = is_prime<i, i-1>::prim }; <br>    void f() { D<i> d = prim ? 1 : 0; a.f();} <br>}; <br><br>template<> struct is_prime<0,0> { enum {prim=1}; }; <br>template<> struct is_prime<0,1> { enum {prim=1}; }; <br><br>template<> struct Prime_print<1> { <br>    enum {prim=0}; <br>    void f() { D<1> d = prim ? 1 : 0; }; <br>}; <br><br>#ifndef LAST <br>#define LAST 18 <br>#endif <br><br>main() { <br>    Prime_print<LAST> a; <br>    a.f(); <br>} <br>鍦℅NU C++ (MinGW Special) 3.2涓紪璇戣繖孌電▼搴忔椂錛岀紪璇戝櫒灝嗕細緇欏嚭濡備笅鍑洪敊淇℃伅錛堜互鍙婂叾瀹冧竴浜涗俊鎭紝綆鐭搗瑙侊紝瀹冧滑琚垹闄や簡錛夛細 <br>Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 17]'<br>Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 13]'<br>Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 11]'<br>Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 7]'<br>Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 5]'<br>Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 3]'<br>Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 2]' <br>榪欎釜渚嬪瓙灞曠ず浜嗗彲浠ュ埄鐢ㄦā鏉垮疄渚嬪寲鏈哄埗浜庣紪璇戞湡鎵ц涓浜涜綆椼傝繖縐嶉氳繃妯℃澘瀹炰緥鍖栬屾墽琛岀殑緙栬瘧鏈熻綆楁妧鏈嵆琚О涓烘ā鏉垮厓緙栫▼銆?nbsp;<br><br><strong>涓涓彲浠ヨ繍琛岀殑妯℃澘鍏冪紪紼嬩緥瀛?/strong> <br><br>妯℃澘鍏冪紪紼嬶紙Template Metaprogramming錛夋洿鍑嗙‘鐨勫惈涔夊簲璇ユ槸“緙?#8216;鍙互緙栫▼搴忕殑’紼嬪簭”錛岃屾ā鏉垮厓紼嬪簭錛圱emplate Metaprogram錛夊垯鏄?#8220;‘鍙互緙栫▼搴忕殑’紼嬪簭”銆備篃灝辨槸璇達紝鎴戜滑緇欏嚭浠g爜鐨勪駭鐢熻鍒欙紝緙栬瘧鍣ㄥ湪緙栬瘧鏈熻В閲婅繖浜涜鍒欏茍鐢熸垚鏂頒唬鐮佹潵瀹炵幇鎴戜滑棰勬湡鐨勫姛鑳姐?nbsp;<br>Erwin Unruh鐨勯偅孌電粡鍏鎬唬鐮佸茍娌℃湁鎵ц錛屽畠鍙槸浠ョ紪璇戝嚭閿欎俊鎭殑鏂瑰紡杈撳嚭涓棿璁$畻緇撴灉銆傝鎴戜滑鏉ョ湅涓涓彲浠ヨ繍琛岀殑妯℃澘鍏冪紪紼嬩緥瀛?鈥?璁$畻緇欏畾鏁存暟鐨勬寚瀹氭鏂癸細 <br><br><font color=#008000>// xy.h</font><br><br><font color=#008000>//鍘熷鎽告澘</font><br>template<int Base, int Exponent><br>class XY<br>{<br>public:<br>    enum { result_ = Base * XY<Base, Exponent-1>::result_ };<br>};<br><br><font color=#008000>//鐢ㄤ簬緇堢粨閫掑綊鐨勫眬閮ㄧ壒鍖栫増</font><br>template<int Base><br>class XY<Base, 0> <br>{<br>public:<br>    enum { result_ = 1 };<br>};<br>妯℃澘鍏冪紪紼嬫妧鏈箣鏍規(guī)湰鍦ㄤ簬閫掑綊妯℃澘瀹炰緥鍖栥傜涓涓ā鏉垮疄鐜頒簡涓鑸儏鍐典笅鐨勯掑綊瑙勫垯銆傚綋鐢ㄤ竴瀵規(guī)暣鏁?lt;X, Y>鏉ュ疄渚嬪寲妯℃澘鏃訛紝妯℃澘XY<X, Y>闇瑕佽綆楀叾result_鐨勫鹼紝灝嗗悓涓妯℃澘涓拡瀵?lt;X, Y-1>瀹炰緥鍖栨墍寰楃粨鏋滀箻浠鍗沖彲銆傜浜屼釜妯℃澘鏄竴涓眬閮ㄧ壒鍖栫増鏈紝鐢ㄤ簬緇堢粨閫掑綊銆?nbsp;<br>璁╂垜浠湅鐪嬩嬌鐢ㄦ妯℃澘鏉ヨ綆?^4 錛堥氳繃瀹炰緥鍖朮Y<5, 4>錛夋椂鍙戠敓浜嗕粈涔堬細 <br><font color=#008000>// xytest.cpp</font><br><br>#include <iostream><br>#include "xy.h"<br><br>int main() <br>{<br>    std::cout << "X^Y<5, 4>::result_ = " << XY<5, 4>::result_;<br>}<br>棣栧厛錛岀紪璇戝櫒瀹炰緥鍖朮Y<5, 4>錛屽畠鐨剅esult_涓? * XY<5, 3>::result_錛屽姝や竴鏉ワ紝鍙堥渶瑕侀拡瀵?lt;5, 3>瀹炰緥鍖栧悓鏍風殑妯℃澘錛屽悗鑰呭張瀹炰緥鍖朮Y<5, 2>…… 褰撳疄渚嬪寲鍒癤Y<5, 0>鐨勬椂鍊欙紝result_鐨勫艱璁$畻涓?錛岃嚦姝ら掑綊緇撴潫銆?nbsp;<br><strong><br>閫掑綊妯℃澘瀹炰緥鍖栫殑娣卞害鍜岀粓緇撴潯浠?/strong> <br><br>鍙互鎯寵薄錛屽鏋滄垜浠互闈炲父澶х殑Y鍊兼潵瀹炰緥鍖栫被妯℃澘XY錛岄偅鑲畾浼氬崰鐢ㄥぇ閲忕殑緙栬瘧鍣ㄨ祫婧愮敋鑷充細榪呴熻楀敖鍙敤璧勬簮錛堝湪璁$畻緇撴灉婧㈠嚭涔嬪墠錛夛紝鍥犳錛屽湪瀹炶返涓垜浠簲璇ユ湁鑺傚埗鍦頒嬌鐢ㄦā鏉垮厓緙栫▼鎶鏈?nbsp;<br>铏界劧 C++鏍囧噯寤鴻鐨勬渶灝忓疄渚嬪寲娣卞害鍙湁17灞傦紝鐒惰屽ぇ澶氭暟緙栬瘧鍣ㄩ兘鑳藉澶勭悊鑷沖皯鍑犲崄灞傦紝鏈変簺緙栬瘧鍣ㄥ厑璁稿疄渚嬪寲鑷蟲暟鐧懼眰錛屾洿鏈変竴浜涘彲杈炬暟鍗冨眰錛岀洿鑷寵祫婧愯楀敖銆?nbsp;<br>鍋囧鎴戜滑鎷挎帀XY妯℃澘灞閮ㄧ壒鍖栫増鏈紝鎯呭喌浼氬浣曪紵 <br><font color=#008000>// xy2.h<br><br>//鍘熷鎽告澘</font><br>template<int Base, int Exponent><br>class XY<br>{<br>public:<br>    enum { result_ = Base * XY<Base, Exponent-1>::result_ };<br>};<br>嫻嬭瘯紼嬪簭涓嶅彉錛?nbsp;<br><font color=#008000>// xytest2.cpp</font><br><br>#include <iostream><br>#include "xy2.h"<br><br>int main() <br>{<br>    std::cout << "X^Y<5, 4>::result_ = " << XY<5, 4>::result_;<br>}<br>鎵ц濡備笅緙栬瘧鍛戒護錛?nbsp;<br>C:\>g++ -c xytest2.cpp <br>浣犲皢浼氱湅鍒伴掑綊瀹炰緥鍖栧皢涓鐩磋繘琛屼笅鍘伙紝鐩村埌杈懼埌緙栬瘧鍣ㄧ殑鏋侀檺銆?nbsp;<br>GNU C++ (MinGW Special) 3.2鐨勯粯璁ゅ疄渚嬪寲鏋侀檺娣卞害涓?00灞傦紝浣犱篃鍙互鎵嬪伐璋冩暣瀹炰緥鍖栨繁搴︼細 <br>C:\>g++ -ftemplate-depth-3400 -c xytest2.cpp <br>浜嬪疄涓婏紝g++ 3.2鍏佽鐨勬ā鏉垮疄渚嬪寲鏋侀檺娣卞害榪樺彲浠ュ啀澶т竴浜涳紙鎴戠殑嫻嬭瘯緇撴灉鏄笉瓚呰繃3450灞傦級銆?nbsp;<br>鍥犳錛屽湪浣跨敤妯℃澘鍏冪紪紼嬫妧鏈椂錛屾垜浠繪槸瑕佺粰鍑哄師濮嬫ā鏉跨殑鐗瑰寲鐗堬紙灞閮ㄧ壒鍖栫増鎴栧畬鍏ㄧ壒鍖栫増鎴栧吋鑰屾湁涔嬶級錛屼互浣滀負閫掑綊妯℃澘瀹炰緥鍖栫殑緇堢粨鍑嗗垯銆?nbsp;<br><br><strong>鍒╃敤妯℃澘鍏冪紪紼嬫妧鏈В寮寰幆</strong> <br><br>妯℃澘鍏冪紪紼嬫妧鏈渶鏃╃殑瀹為檯搴旂敤涔嬩竴鏄敤浜庢暟鍊艱綆椾腑鐨勮В寰幆銆備婦涓緥瀛愶紝瀵逛竴涓暟緇勮繘琛屾眰鍜岀殑甯歌鏂規(guī)硶鏄細 <br><font color=#008000>// sumarray.h</font><br><br>template <typename T><br>inline T sum_array(int Dim, T* a)<br>{<br>    T result = T();<br>    for (int i = 0; i < Dim; ++i) <br>    { <br>        result += a[i];<br>    }<br>    return result;<br>}<br>榪欏綋鐒跺彲琛岋紝浣嗘垜浠篃鍙互鍒╃敤妯℃澘鍏冪紪紼嬫妧鏈潵瑙e紑寰幆錛?nbsp;<br><font color=#008000>// sumarray2.h<br><br>// 鍘熷妯℃澘</font><br>template <int Dim, typename T><br>class Sumarray <br>{<br>public:<br>    static T result(T* a)<br>    {<br>        return a[0] + Sumarray<Dim-1, T>::result(a+1);<br>    }<br>};<br><br><font color=#008000>// 浣滀負緇堢粨鍑嗗垯鐨勫眬閮ㄧ壒鍖栫増</font><br>template <typename T><br>class Sumarray<1, T> <br>{<br>public:<br>    static T result(T* a)<br>    {<br>        return a[0];<br>    }<br>};<br><br>鐢ㄦ硶濡備笅錛?nbsp;<br><br><font color=#008000>// sumarraytest2.cpp</font><br><br>#include <iostream><br>#include "sumarray2.h"<br><br>int main()<br>{<br>    int a[6] = {1, 2, 3, 4, 5, 6};<br>    std::cout << " Sumarray<6>(a) = " << Sumarray<6, int>::result(a);<br>}<br>褰撴垜浠綆桽umarray<6, int>::result(a)鏃訛紝瀹炰緥鍖栬繃紼嬪涓嬶細 <br>Sumarray<6, int>::result(a)<br>= a[0] + Sumvector<5, int>::result(a+1)<br>= a[0] + a[1] + Sumvector<4, int>::result(a+2)<br>= a[0] + a[1] + a[2] + Sumvector<3, int>::result(a+3)<br>= a[0] + a[1] + a[2] + a[3] + Sumvector<2, int>::result(a+4)<br>= a[0] + a[1] + a[2] + a[3] + a[4] + Sumvector<1, int>::result(a+5)<br>= a[0] + a[1] + a[2] + a[3] + a[4] + a[5] <br>鍙錛屽驚鐜灞曞紑涓篴[0]  + a[1] + a[2] + a[3] + a[4] + a[5]銆傝繖縐嶇洿鎴簡褰撶殑灞曞紑榪愮畻鍑犱箮鎬繪槸姣斿驚鐜潵寰楁洿鏈夋晥鐜囥?nbsp;<br>涔熻鎷夸竴涓湁鐫600涓囦釜鍏冪礌鐨勬暟緇勬潵渚嬭瘉寰幆寮瑙g殑浼樺娍鍙兘鏇存湁璇存湇鍔涖傜敓鎴愯繖鏍風殑鏁扮粍寰堝鏄擄紝鏈夊叴瓚o紝浣犱笉濡ㄦ祴璇曘佸姣斾竴涓嬨?nbsp;<br><br><strong>妯℃澘鍏冪紪紼嬪湪鏁板艱綆楃▼搴忓簱涓殑搴旂敤</strong> <br><br>Blitz++涔嬫墍浠?#8220;蹇闂數”錛堣繖姝f槸blitz鐨勫瓧闈㈠惈涔夛級錛岀涓嶅紑妯℃澘鍏冪▼搴忕殑鍔熷姵銆侭litz++娣嬫紦灝借嚧鍦頒嬌鐢ㄤ簡鍏冪紪紼嬫妧鏈紝浣犲彲浠ュ埌榪欎簺鏂囦歡婧愪唬鐮佷腑紿ユ帰絀剁珶錛?nbsp;<br> <ul> <li>dot.h<br> <li>matassign.h<br> <li>matmat.h<br> <li>matvec.h<br> <li>metaprog.h <br> <li> product.h <br> <li>sum.h <br> <li> vecassign.h <br></li> </ul> 璁╂垜浠湅鐪婤litz++紼嬪簭搴揹ot.h鏂囦歡涓殑妯℃澘鍏冪▼搴忥細<br> <br>template<int N, int I><br>class _bz_meta_vectorDot {<br>public:<br>    enum { loopFlag = (I < N-1) ? 1 : 0 };<br><br>    template<class T_expr1, class T_expr2><br>    static inline BZ_PROMOTE(_bz_typename T_expr1::T_numtype, _bz_typename T_expr2::T_numtype)<br>    f(const T_expr1& a, const T_expr2& b)<br>    {<br>        return a[I] * b[I] + _bz_meta_vectorDot<loopFlag * N, loopFlag * (I+1)>::f(a,b);<br>    }<br><br>    template<class T_expr1, class T_expr2><br>    static inline BZ_PROMOTE(_bz_typename T_expr1::T_numtype, _bz_typename T_expr2::T_numtype)<br>    f_value_ref(T_expr1 a, const T_expr2& b)<br>    {<br>        return a[I] * b[I] + _bz_meta_vectorDot<loopFlag * N, loopFlag * (I+1)>::f(a,b);<br>    }<br><br>    template<class T_expr1, class T_expr2><br>    static inline BZ_PROMOTE(_bz_typename T_expr1::T_numtype, _bz_typename T_expr2::T_numtype)<br>    f_ref_value(const T_expr1& a, T_expr2 b)<br>    {<br>        return a[I] * b[I] + _bz_meta_vectorDot<loopFlag * N, loopFlag * (I+1)>::f(a,b);<br>    }<br><br>    template<class T_expr1, class P_numtype2><br>    static inline BZ_PROMOTE(_bz_typename T_expr1::T_numtype, P_numtype2)<br>    dotWithArgs(const T_expr1& a, P_numtype2 i1, P_numtype2 i2=0,<br>                P_numtype2 i3=0, P_numtype2 i4=0, P_numtype2 i5=0, P_numtype2 i6=0,<br>                P_numtype2 i7=0, P_numtype2 i8=0, P_numtype2 i9=0, P_numtype2 i10=0)<br>    {<br>        return a[I] * i1 + _bz_meta_vectorDot<loopFlag * N, loopFlag * (I+1)>::dotWithArgs<br>                                                                                   (a, i2, i3, i4, i5, i6, i7, i8, i9);<br>    }<br>};<br><br>template<><br>class _bz_meta_vectorDot<0,0> {<br>public:<br>    template<class T_expr1, class T_expr2><br>    static inline _bz_meta_nullOperand f(const T_expr1&, const T_expr2&)<br>    { return _bz_meta_nullOperand(); }<br><br>    template<class T_expr1, class P_numtype2><br>    static inline _bz_meta_nullOperand <br>    dotWithArgs(const T_expr1& a, P_numtype2 i1, P_numtype2 i2=0,<br>                P_numtype2 i3=0, P_numtype2 i4=0, P_numtype2 i5=0, P_numtype2 i6=0,<br>                P_numtype2 i7=0, P_numtype2 i8=0, P_numtype2 i9=0, P_numtype2 i10=0)<br>    {<br>        return _bz_meta_nullOperand(); <br>    }<br>};<br>榪欐浠g爜榪滄瘮瀹冧箥鐪嬩笂鍘葷殑綆鍗曘俖bz_meta_vectorDot綾繪ā鏉夸嬌鐢ㄤ簡涓涓復鏃跺彉閲弆oopFlag鏉ュ瓨鏀炬瘡涓姝ュ驚鐜潯浠剁殑璇勪及緇撴灉錛屽茍浣跨敤浜嗕竴涓畬鍏ㄧ壒鍖栫増浣滀負閫掑綊緇堢粨鐨勬潯浠躲傞渶瑕佽鏄庣殑鏄紝鍜屽嚑涔庢墍鏈夊厓紼嬪簭涓鏍鳳紝榪欎釜涓存椂鍙橀噺浣滅敤鍙戞尌浜庣紪璇戞湡錛屽茍灝嗕粠榪愯浠g爜涓紭鍖栨帀銆?nbsp;<br>Todd鏄湪Blitz++鏁板兼暟緇勫簱鐨勪富瑕佷綔鑰呫傝繖涓▼搴忓簱錛堜互鍙奙TL鍜孭OOMA絳夌▼搴忓簱錛変緥璇佷簡妯℃澘鍏冪▼搴忓彲浠ヤ負鎴戜滑甯︽潵鏇村姞楂樻晥鐨勬暟鍊艱綆楁ц兘銆俆odd瀹gОBlitz++鐨勬ц兘鍙互鍜屽搴旂殑Fortran紼嬪簭搴撳緹庛?br> <br><strong>Loki紼嬪簭搴擄細媧葷敤妯℃澘鍏冪紪紼嬫妧鏈殑鍏歌寖</strong> <br><br>妯℃澘鍏冪紪紼嬬殑浠峰間粎浠呭湪浜庨珮鎬ц兘鏁板艱綆楀悧錛熶笉浠呭姝ゃ侺oki紼嬪簭搴撲互瀵規(guī)硾鍨嬫ā寮忕殑寮鍒涙у伐浣滈椈鍚嶄簬C++紺劇兢銆傚畠寰堝閥濡欏湴鍒╃敤浜嗘ā鏉垮厓緙栫▼鎶鏈疄鐜頒簡Typelist緇勪歡銆俆ypelist鏄疄鐜癆bstract Factory銆乂isitor絳夋硾鍨嬫ā寮忎笉鍙垨緙虹殑鍩虹璁炬柦銆?nbsp;<br>灝卞儚C++鏍囧噯搴撶粍浠秙td::list鎻愪緵瀵逛竴緇勬暟鍊肩殑鎿嶄綔涓鏍鳳紝Typelist鍙互鐢ㄦ潵鎿嶇旱涓緇勭被鍨嬶紝鍏跺畾涔夐潪甯哥畝鍗曪紙鎽樿嚜Loki紼嬪簭搴揟ypelist.h鍗曞厓錛夛細 <br>template <class T, class U><br>struct Typelist<br>{<br>    typedef T Head;<br>    typedef U Tail;<br>}; <br>鏄劇劧錛孴ypelist娌℃湁浠諱綍鐘舵侊紝涔熸湭瀹氫箟浠諱綍鎿嶄綔錛屽叾浣滅敤鍙湪浜庢惡甯︾被鍨嬩俊鎭紝瀹冨茍鏈墦綆楄瀹炰緥鍖栵紝鍥犳錛屽浜嶵ypelist鐨勪換浣曞鐞嗛兘蹇呯劧鍙戠敓浜庣紪璇戞湡鑰岄潪榪愯鏈熴?nbsp;<br>Typelist鍙互琚棤闄愭墿灞曪紝鍥犱負妯℃澘鍙傛暟鍙互鏄換浣曠被鍨嬶紙鍖呮嫭璇ユā鏉跨殑鍏朵粬鍏風幇浣擄級銆備緥濡傦細 <br>Typelist<char, Typelist<int, Typelist<float, NullType> > >  <br>灝辨槸涓涓寘鍚湁char銆乮nt銆乫loat涓夌綾誨瀷鐨凾ypelist銆?nbsp;<br>鎸夌収Loki鐨勭害瀹氾紝姣忎竴涓猅ypelist閮藉繀欏諱互NullType緇撳熬銆侼ullType鐨勪綔鐢ㄧ被浼間簬浼犵粺C瀛楃涓茬殑“\0”錛屽畠琚0鏄庝簬Loki紼嬪簭搴撶殑NullType.h鏂囦歡涓細 <br>class NullType; <br>NullType鍙湁澹版槑錛屾病鏈夊畾涔夛紝鍥犱負Loki紼嬪簭搴撴案榪滈兘涓嶉渶瑕佸垱寤轟竴涓狽ullType瀵硅薄銆?nbsp;<br>璁╂垜浠湅鐪婭ndexOf妯℃澘鍏冪▼搴忥紝瀹冨彲浠ュ湪涓涓猅ypelist涓煡鎵劇粰瀹氱被鍨嬬殑浣嶇疆錛堟憳鑷狶oki紼嬪簭搴撶殑Typelist.h鍗曞厓錛夛細 <br>template <class TList, class T><br>struct IndexOf;<br><br>template <class T><br>struct IndexOf<NullType, T><br>{<br>    enum { value = -1 };<br>};<br><br>template <class T, class Tail><br>struct IndexOf<Typelist<T, Tail>, T><br>{<br>    enum { value = 0 };<br>};<br><br>template <class Head, class Tail, class T><br>struct IndexOf<Typelist<Head, Tail>, T><br>{<br>private:<br>    enum { temp = IndexOf<Tail, T>::value };<br>public:<br>    enum { value = (temp == -1 ? -1 : 1 + temp) };<br>}; <br><br>IndexOf鎻愪緵浜嗕竴涓師濮嬫ā鏉垮拰涓変釜灞閮ㄧ壒鍖栫増銆傜畻娉曢潪甯哥畝鍗曪細濡傛灉TList錛堝氨鏄竴涓猅ypelist錛夋槸涓涓狽ullType錛屽垯value涓?1銆傚鏋淭List鐨勫ご閮ㄥ氨鏄疶錛屽垯value涓?銆傚惁鍒欏皢IndexOf鏂借浜嶵List鐨勫熬閮ㄥ拰T錛屽茍灝嗚瘎浼扮粨鏋滅疆浜庝竴涓復鏃跺彉閲弔emp涓傚鏋渢emp涓?1錛屽垯value涓?1錛屽惁鍒檝alue涓? + temp銆?nbsp;<br>涓轟簡鍔犳繁浣犲Typelist閲囩敤鐨勬ā鏉垮厓緙栫▼鎶鏈殑璁よ瘑錛屾垜浠嶭oki紼嬪簭搴撳墺紱誨嚭濡備笅浠g爜錛屾斁鍏ヤ竴涓猼ypelistlite.h鏂囦歡涓細 <br><font color=#008000>// typelistlite.h<br><br>// 澹版槑Nulltype </font><br>class NullType;<br><br><font color=#008000>// Typelist鐨勫畾涔?/font><br>template <class T, class U><br>struct Typelist<br>{<br>    typedef T Head;<br>    typedef U Tail;<br>};<br><br><font color=#008000>// IndexOf鐨勫畾涔?nbsp;<br><br>// IndexOf鍘熷妯℃澘</font><br>template <class TList, class T> struct IndexOf;<br><br><font color=#008000>// 閽堝NullType鐨勫眬閮ㄧ壒鍖栫増</font><br>template <class T><br>struct IndexOf<NullType, T><br>{<br>    enum { value = -1 };<br>};<br><br><font color=#008000>// 閽堝“Tlist澶撮儴灝辨槸鎴戜滑瑕佹煡鎵劇殑T”鐨勫眬閮ㄧ壒鍖栫増</font><br>template <class T, class Tail><br>struct IndexOf<Typelist<T, Tail>, T><br>{<br>    enum { value = 0 };<br>};<br><br><font color=#008000>// 澶勭悊Tlist灝鵑儴鐨勫眬閮ㄧ壒鍖栫増</font><br>template <class Head, class Tail, class T><br>struct IndexOf<Typelist<Head, Tail>, T><br>{<br>private:<br>    enum { temp = IndexOf<Tail, T>::value };<br>public:<br>    enum { value = (temp == -1 ? -1 : 1 + temp) };<br>}; <br><br>嫻嬭瘯紼嬪簭濡備笅錛?nbsp;<br><br><font color=#008000>// typelistlite_test.cpp</font><br><br>#include <iostream><br>#include "typelistlite.h"<br><br><font color=#008000>// 鑷畾涔夌被鍨婻oyal</font><br>class Royal {};<br><br><font color=#008000>// 瀹氫箟涓涓寘鍚湁char銆乮nt銆丷oyal鍜宖loat鐨凾ypelist</font><br>typedef Typelist<char, Typelist<int, Typelist<Royal, Typelist<float, NullType> > > > CIRF;<br><br>int main()<br>{<br>    std::cout << "IndexOf<CIRF, int>::value = " << IndexOf<CIRF, int>::value << "\n";<br>    std::cout << "IndexOf<CIRF, Royal>::value = " << IndexOf<CIRF, Royal>::value << "\n";<br>    std::cout << "IndexOf<CIRF, double>::value = " << IndexOf<CIRF, double>::value << "\n";<br>} <br><br>紼嬪簭杈撳嚭濡備笅錛?nbsp;<br><br>IndexOf<CIRF, int>::value = 1<br>IndexOf<CIRF, Royal>::value = 2<br>IndexOf<CIRF, double>::value = -1 <br><br><strong>緇撹</strong> <br><br>妯℃澘鍏冪紪紼嬫妧鏈茍闈為兘鏄紭鐐癸紝姣旀柟璇達紝妯℃澘鍏冪▼搴忕紪璇戣楁椂錛屽甫鏈夋ā鏉垮厓紼嬪簭鐨勭▼搴忕敓鎴愮殑浠g爜灝哄瑕佹瘮鏅氱▼搴忕殑澶э紝鑰屼笖閫氬父榪欑紼嬪簭璋冭瘯璧鋒潵涔熸瘮甯歌紼嬪簭鍥伴毦寰楀銆傚彟澶栵紝瀵逛簬涓浜涚▼搴忓憳鏉ヨ錛屼互綾繪ā鏉跨殑鏂瑰紡鎻忚堪綆楁硶涔熻鏈夌偣鎶借薄銆?nbsp;<br>緙栬瘧鑰楁椂鐨勪唬浠鋒崲鏉ョ殑鏄崜瓚婄殑榪愯鏈熸ц兘銆傞氬父鏉ヨ錛屼竴涓湁鎰忎箟鐨勭▼搴忕殑榪愯嬈℃暟錛堟垨鏈嶅焦鏃墮棿錛夋繪槸榪滆繙瓚呰繃緙栬瘧嬈℃暟錛堟垨緙栬瘧鏃墮棿錛夈備負紼嬪簭鐨勭敤鎴峰甫鏉ユ洿濂界殑浣撻獙錛屾垨鑰呬負鎬ц兘瑕佹眰涓ユ牸鐨勬暟鍊艱綆楁崲鍙栨洿楂樼殑鎬ц兘錛屽煎緱紼嬪簭鍛樹粯鍑鴻繖鏍風殑浠d環(huán)銆?nbsp;<br>寰堥毦鎯寵薄妯℃澘鍏冪紪紼嬫妧鏈細鎴愪負姣忎竴涓櫘閫氱▼搴忓憳鐨勬棩甯稿伐鍏鳳紝鐩稿弽錛屽氨鍍廈litz++鍜孡oki閭f牱錛屾ā鏉垮厓紼嬪簭鍑犱箮鎬繪槸搴旇琚皝瑁呭湪涓涓▼搴忓簱鐨勫唴閮ㄣ傚浜庡簱鐨勭敤鎴鋒潵璇達紝瀹冨簲璇ユ槸閫忔槑鐨勩傛ā鏉垮厓紼嬪簭鍙互錛堜篃搴旇錛夌敤浣滃父瑙勬ā鏉夸唬鐮佺殑鍐呮牳錛屼負鍏抽敭鐨勭畻娉曞疄鐜版洿濂界殑鎬ц兘錛屾垨鑰呬負鐗瑰埆鐨勭洰鐨勫疄鐜扮壒鍒殑鏁堟灉銆?nbsp;<br>妯℃澘鍏冪紪紼嬫妧鏈嬈℃寮忎寒鐩鎬簬Todd Veldhuizen鐨?em>Using C++ Template Metaprograms</em>璁烘枃涔嬩腑銆傝繖綃囨枃绔犻鍏堝彂琛ㄤ簬1995騫?鏈堢殑<em>C++ Report</em>鏈熷垔涓婏紝鍚庢潵Stanley Lippman緙栬緫<em>C++ Gems</em>涓涔︽椂鍙堟敹褰曚簡瀹冦傚弬鑰冩枃鐚腑緇欏嚭浜嗚繖綃囨枃绔犵殑閾炬帴錛屽畠榪樻弿榪頒簡璁稿鏈枃娌℃湁鎻忚堪鍒扮殑鍐呭銆?nbsp;<br>David Vandevoorde鍜孨icolai M. Josuttis鍚堣憲鐨?em>C++ Templates: The Complete Guide</em>涓涔﹁姳浜嗕竴鏁寸珷鐨勭瘒騫呬粙緇嶆ā鏉垮厓緙栫▼鎶鏈紝瀹冨悓鏍鋒槸鏈枃鐨勫弬鑰冭祫鏂欏茍涓斾篃搴旇浣滀負浣犵殑琛ュ厖闃呰鏉愭枡銆?nbsp;<br>Andrei Alexandrescu鐨勫ぉ鎵嶈憲浣?em>Modern C++ Design: Generic Programming and Design Patterns Applied</em>鐨勭3绔?em>Typelists</em>瀵筎ypelist鏈夌潃鏇翠負璇﹀敖鐨勬弿榪般?br> <br><strong>鍙傝冩枃鐚?/strong> <br><br>1. David Vandevoorde, Nicolai M. Josuttis, <em>C++ Templates: The Complete Guide</em>, Addison Wesley, 2002<o:p>. <br>2.  Andrei Alexandrescu, <em>Modern C++ Design: Generic Programming and Design Patterns Applied</em>, Addison Wesley, 2001.<br>3. 渚嵎 鏂兼槬鏅?璇戯紝銆奀++璁捐鏂版濈淮銆嬶紝鍗庝腑縐戞妧澶у鍑虹増紺撅紝2003銆?<br>4. Todd Veldhuizen, <em>Template Metaprograms,</em> <a target=_blank><u><font color=#0000ff>http://osl.iu.edu/~tveldhui/papers/Template-Metaprograms/meta-art.html </font></u></a>. <br>5. Todd Veldhuizen, <em>C++ templates as partial evaluation</em> (PEPM99), <a ><u><font color=#0000ff>http://osl.iu.edu/~tveldhui/papers/pepm99/</font></u></a>. <br>6. Erwin Unruh, Prime numbers(Primzahlen - <a ><u><font color=#0000ff>Original</font></u></a>), <a ><u><font color=#0000ff>http://www.erwin-unruh.de/primorig.html </font></u></a>. <br>7. Erwin Unruh, Prime numbers(Primzahlen), <a ><u><font color=#0000ff>http://www.erwin-unruh.de/Prim.html </font></u></a>. <br>8. Blitz++, <a ><u><font color=#800080>http://www.oonumerics.org/blitz </font></u></a>. <br>9. Loki, <a ><u><font color=#0000ff>http://sourceforge.net/projects/loki-lib </font></u></a>. <br>10. POOMA, <a ><u><font color=#0000ff>http://www.pooma.com</font></u></a>. <br>11. MinGW - Minimalist GNU for Windows, <a ><u><font color=#0000ff>http://sourceforge.net/projects/mingw</font></u></a>. </o:p> <img src ="http://m.shnenglu.com/zhaoyg/aggbug/100972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2009-11-15 14:25 <a href="http://m.shnenglu.com/zhaoyg/archive/2009/11/15/100972.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>閽葷煶鍨嬬戶鎵夸腑鐨勮櫄鍑芥暟闂http://m.shnenglu.com/zhaoyg/archive/2009/10/28/99648.htmlzhaoygzhaoygWed, 28 Oct 2009 04:51:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2009/10/28/99648.htmlhttp://m.shnenglu.com/zhaoyg/comments/99648.htmlhttp://m.shnenglu.com/zhaoyg/archive/2009/10/28/99648.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/99648.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/99648.html闂1錛?/span>
class Base1
{
public:
    
virtual void f()
    
{
        cout 
<< "Base1::f" << endl;
    }

    
virtual void g()
    
{
        cout 
<< "Base1::g" << endl;
    }

}
;
class Base2 :public virtual Base1
{
public:

    
virtual void f()
    
{
        cout 
<< "Base2::f" << endl;
    }

    
virtual void g()
    
{
        cout 
<< "Base2::g" << endl;
    }

}
;

class Base3:public virtual Base1
{
public:

    
virtual void f()
    
{
        cout 
<< "Base3::f" << endl;
    }

    
virtual void g()
    
{
        cout 
<< "Base3::g" << endl;
    }

}
;

class Derive : public Base2, public Base3 {
public:
virtual void g() { cout << "Derive::g1" << endl; }
}
;

浠ヤ笂浠g爜鏄湪璁哄潧涓亣瑙佺殑錛屽綋鏃舵垜騫舵病鏈夌珛鍒誨弽搴斾笂鏉ヨ繖鏄粈涔堢紭鏁咃紝鎬濈儲涓闃靛悗錛屾墠寮勬槑鐧姐?br>鍘熸潵錛屽湪Derive涓病鏈夐噸鍐檉鍑芥暟錛屽張鍥犱負褰撴淳鐢熺被娌℃湁閲嶅啓鍩虹被鐨勮櫄鍑芥暟鏃訛紝媧劇敓綾誨璞″璇ヨ櫄鍑芥暟鐨勮皟鐢紝灝嗕細璋冪敤鍏跺熀綾諱腑鐨勭増鏈紝鑰孌erive鍙堟槸澶氱戶鎵匡紝浜庢槸鍦―erive緇ф壙鏃跺氨涓嶇煡閬揃ase1涓殑铏氬嚱鏁拌〃搴旇璁板綍鍝釜鐗堟湰鐨刦鍑芥暟錛屾槸Base2錛岃繕鏄疊ase3銆?br>鍥犱負Derive涓凡閲嶅畾涔塯鍑芥暟錛孊ase1鐨勮櫄鍑芥暟琛ㄨ褰曠殑鏄疍erive::g銆?/p>

==============================================================================

闂2錛?br>浠g爜鏉ユ簮<effective C++>2nd

class Lottery
{
public:
  
virtual int draw();
};

class GraphicalObject 
{
public:
  
virtual int draw();
};

class LotterySimulation: public Lottery,
                         
public GraphicalObject 
{
  
// 娌℃湁澹版槑draw
};

LotterySimulation 
*pls = new LotterySimulation;

pls
->draw();   // 閿欒! ---- 浜屼箟

鍥犱負LotterySimulation涓瓨鍦ㄤ袱涓悕涓篸raw鐨勫嚱鏁幫紝浜庢槸璋冪敤瀛樺湪浜屼箟鎬с傚悓鏃訛紝鍗充究鏇存敼鍏朵腑涓涓猟raw鐨勮闂т篃涓嶈兘閬垮厤榪欑浜屼箟鎬э紝鍥犱負鏀瑰彉涓涓被鎴愬憳鐨勮闂潈闄愪笉搴旇鏀瑰彉紼嬪簭鐨勫惈涔夈?br>瀵逛簬濡備笅浠g爜錛屼粛鐒跺瓨鍦ㄤ簩涔夋?br>
class SpecialLotterySimulation: public LotterySimulation 
{
public:
  
virtual int draw();
};

pls 
= new SpecialLotterySimulation;

pls
->draw();     // 閿欒!  榪樻槸鏈変簩涔?br>
鍥犱負錛宲ls鐨勯潤鎬佺被鍨嬫槸LotterySimulation錛岃屽悕瀛楃殑鏌ユ壘鏄悜涓婅繘琛岀殑錛屾墍浠ュ嵆渚縎pecialLotterySimulation涓畾涔変簡涓涓猟raw錛屽pls鏉ヨ浠栨槸涓嶄細鏌ョ湅SpecialLotterySimilation涓殑鍚嶇О鐨勩?/span>

zhaoyg 2009-10-28 12:51 鍙戣〃璇勮
]]>
{鍋跺皵瀛︿範C++鏍囧噯} 涔?[瀵硅薄鐨勫鍒?- 澶嶅埗鏋勯犱笌璧嬪兼搷浣滅] http://m.shnenglu.com/zhaoyg/archive/2009/10/07/98041.htmlzhaoygzhaoygWed, 07 Oct 2009 12:25:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2009/10/07/98041.htmlhttp://m.shnenglu.com/zhaoyg/comments/98041.htmlhttp://m.shnenglu.com/zhaoyg/archive/2009/10/07/98041.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/98041.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/98041.html闃呰鍏ㄦ枃

zhaoyg 2009-10-07 20:25 鍙戣〃璇勮
]]>
[ 杞?] VC++錛屾巰璧蜂綘鐨勭洊澶存潵鈥斺旇皥VC++瀵硅薄妯″瀷http://m.shnenglu.com/zhaoyg/archive/2009/09/14/96157.htmlzhaoygzhaoygMon, 14 Sep 2009 12:35:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2009/09/14/96157.htmlhttp://m.shnenglu.com/zhaoyg/comments/96157.htmlhttp://m.shnenglu.com/zhaoyg/archive/2009/09/14/96157.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/96157.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/96157.html闃呰鍏ㄦ枃

zhaoyg 2009-09-14 20:35 鍙戣〃璇勮
]]>
鍒濊瘑"榪斿洖鍊間紭鍖?http://m.shnenglu.com/zhaoyg/archive/2009/05/24/85658.htmlzhaoygzhaoygSun, 24 May 2009 15:11:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2009/05/24/85658.htmlhttp://m.shnenglu.com/zhaoyg/comments/85658.htmlhttp://m.shnenglu.com/zhaoyg/archive/2009/05/24/85658.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/85658.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/85658.html鍦?lt;C++緙栫▼鎬濇兂>2th涓枃鐗?絎?2.3.3.2鑺?#8220;榪斿洖鍊間紭鍖?#8221;涓錛屽浜庡鐞?#8220;return Integer(left.i + left.i);”榪欑鐨勮繑鍥炴椂錛岀紪璇戝櫒鐩存帴鍦ㄧ洰鐨勫唴瀛樹腑鍒涘緩錛屼笖鍥犱負涓嶆槸鍒涘緩灞閮ㄥ璞★紝鏁呭彲鐩存帴璋冪敤鏅氭瀯閫犲嚱鏁幫紝鑰屼笉闇瑕佸鍒舵瀯閫犲嚱鏁幫紱浣嗭紝瀵逛簬

Integer temp;
return temp;

榪欐牱鐨勮繑鍥炲煎艦寮忥紝鏄渶瑕佽皟鐢ㄥ鍒舵瀯閫犲嚱鏁版潵鍦ㄧ洰鏍囧唴瀛樹腑鍒涘緩瀵硅薄鐨勩?br>
鎴戝湪VC2005涓瘯浜嗗涓嬬殑灝忓嚱鏁幫紝
X f()
{
    X one(
5);
    
//return one; //鍥犱負VC涓粯璁ゆ儏鍐典笅debug妯″紡浼樺寲琚姝?release妯″紡浼樺寲鍙敤錛屾墍浠ュ湪release妯″紡涓嬬洿鎺ュ皢one鐨勫畾涔夌洰鏍囧唴瀛樹腑;debug鍒欐槸璋冪敤澶嶅埗鏋勯犲湪鐩爣鍐呭瓨涓瀯閫?br>    //return X(4); // release & debug 閮界洿鎺ュ湪鐩爣鍐呭瓨涓瀯閫犲璞?/span>
}

int main()
{
   X test 
= f();
}

瀵逛簬錛?br>Integer temp;
return temp;
榪欑褰㈠紡錛屽湪VC2005涓紝濡傛灉娌℃湁紱佺敤浼樺寲錛屽垯涓嶈姹傚鍒舵瀯閫犲嚱鏁板彲璁塊棶錛屼篃灝辨槸璇村鍒舵瀯閫犲嚱鏁伴兘涓嶄細琚皟鐢ㄣ?br>浣嗘爣鍑嗕腑璇達細“Even when the creation of the temporary object is avoided (12.8), all the semantic restrictions must be respected as if the temporary object was created. [ Example: even if the copy constructor is not called, all the semantic restrictions, such as accessibility (clause 11), shall be satisfied.]”錛屾墍浠ヨ繕鏄繚鐣欏鍒舵瀯閫犲嚱鏁扮殑鍙闂у惂銆?br>
P.S. : 鍚庢潵浜嗚В鍒癡C涓?鎴栬呰鏍囧噯鍏佽)瀵瑰懡鍚嶅璞$殑榪斿洖閲囩敤“鍛藉悕榪斿洖鍊間紭鍖?NRVO)”鏉ヨ繘琛屼紭鍖栵紝浣嗘槸瀵逛簬榪欑浼樺寲鍙湁鍦ㄦ煇浜涚紪璇戝櫒閫夐」寮鍚悗鎵嶅緱浠ュ疄鐜幫紝鑷沖皯VC鏄繖鏍風殑銆?br>

2009.6.18 鏇存柊


zhaoyg 2009-05-24 23:11 鍙戣〃璇勮
]]>
{鍋跺皵瀛︿範C++鏍囧噯} 涔?[鍒濊瘑涓存椂瀵硅薄鐢熷懡鏈焆http://m.shnenglu.com/zhaoyg/archive/2009/05/24/85538.htmlzhaoygzhaoygSun, 24 May 2009 07:53:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2009/05/24/85538.htmlhttp://m.shnenglu.com/zhaoyg/comments/85538.htmlhttp://m.shnenglu.com/zhaoyg/archive/2009/05/24/85538.html#Feedback1http://m.shnenglu.com/zhaoyg/comments/commentRss/85538.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/85538.html闃呰鍏ㄦ枃

zhaoyg 2009-05-24 15:53 鍙戣〃璇勮
]]>
09騫翠箣瀛︿範璁″垝http://m.shnenglu.com/zhaoyg/archive/2009/05/17/83178.htmlzhaoygzhaoygSun, 17 May 2009 04:43:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2009/05/17/83178.htmlhttp://m.shnenglu.com/zhaoyg/comments/83178.htmlhttp://m.shnenglu.com/zhaoyg/archive/2009/05/17/83178.html#Feedback0http://m.shnenglu.com/zhaoyg/comments/commentRss/83178.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/83178.html鍏跺疄鎴戝茍涓嶆兂鍐欒繖涓墍璋撶殑“瀛︿範璁″垝”錛屽彲浠ヨ鏄湁浜涘鎬曞啓榪欎笢瑗匡紝鍥犱負鎴戝父甯告槸“璁″垝璧朵笉涓婂彉鍖?#8221;錛屼緥濡?8騫翠笂鍗婂勾璇存槸瑕佸皢C++瀛﹀畬錛屼絾鍚庢潵鍥犱負鑻辮鍥涚駭鐨勫師鍥犺屼笉寰椾笉鎼佹祬錛堟瘯绔熷洓綰т笉鑳藉皬瑙嗗憖錛夛紝鑰屽悗鏉ュ張鍥犱負涓浜涘叾浠栧洜绱犺嚧浣挎垜鐩村埌浠婂勾4鏈堜喚鎵嶅瀹孋++銆傚彲浠ヨ錛屾墍璋?#8220;璁″垝”灝辨槸瀵規(guī)垜鐨勮鍒恒傚笇鏈涜繖嬈′笉瑕佸啀“璁藉埡”浜嗭紝宸茬粡娌℃椂闂翠簡銆?br>
2009騫翠箣鍐呰瀹屾垚濡備笅鍐呭錛?br>   鍒濇瀛︿細    SQL Server 2005
   鍒濇瀛︿細    VC++緙栫▼
   鐪嬪畬銆婃繁鍏ヨ瑙C++銆?br>   鐪嬪畬銆奡QL Server 緙栫▼鍏ラ棬緇忓吀銆?br>   鐪嬪畬銆奅ffective C++銆?br>   鐪嬪畬銆奅xceptional C++銆?br>   澶氬浜涚畻娉曞強鏁版嵁緇撴瀯
   灝介噺澶氱湅浜涖婃繁鍏ョ悊瑙h綆楁満緋葷粺銆嬩腑鐨勫唴瀹?br>
浣嗘効榪欐鑳芥寜鏃跺畬鎴愪換鍔°?/span>

zhaoyg 2009-05-17 12:43 鍙戣〃璇勮
]]>
[杞創(chuàng)]void鍙妚oid鎸囬拡娣卞眰鎺㈢儲http://m.shnenglu.com/zhaoyg/archive/2008/06/06/52312.htmlzhaoygzhaoygThu, 05 Jun 2008 16:21:00 GMThttp://m.shnenglu.com/zhaoyg/archive/2008/06/06/52312.htmlhttp://m.shnenglu.com/zhaoyg/comments/52312.htmlhttp://m.shnenglu.com/zhaoyg/archive/2008/06/06/52312.html#Feedback2http://m.shnenglu.com/zhaoyg/comments/commentRss/52312.htmlhttp://m.shnenglu.com/zhaoyg/services/trackbacks/52312.html1.姒傝堪
銆銆璁稿鍒濆鑰呭C/C++璇█涓殑void鍙妚oid鎸囬拡綾誨瀷涓嶇敋鐞嗚В錛屽洜姝ゅ湪浣跨敤涓婂嚭鐜頒簡涓浜涢敊璇傛湰鏂囧皢瀵箆oid鍏抽敭瀛楃殑娣卞埢鍚箟榪涜瑙h錛屽茍璇﹁堪void鍙妚oid鎸囬拡綾誨瀷鐨勪嬌鐢ㄦ柟娉曚笌鎶宸с?
銆銆2.void鐨勫惈涔?
銆銆void鐨勫瓧闈㈡剰鎬濇槸“鏃犵被鍨?#8221;錛寁oid *鍒欎負“鏃犵被鍨嬫寚閽?#8221;錛寁oid *鍙互鎸囧悜浠諱綍綾誨瀷鐨勬暟鎹?
銆銆void鍑犱箮鍙湁“娉ㄩ噴”鍜岄檺鍒剁▼搴忕殑浣滅敤錛屽洜涓轟粠鏉ユ病鏈変漢浼氬畾涔変竴涓獀oid鍙橀噺錛岃鎴戜滑璇曠潃鏉ュ畾涔夛細

void a;
銆銆榪欒璇彞緙栬瘧鏃朵細鍑洪敊錛屾彁紺?#8220;illegal use of type 'void'”銆備笉榪囷紝鍗充嬌void a鐨勭紪璇戜笉浼氬嚭閿欙紝瀹冧篃娌℃湁浠諱綍瀹為檯鎰忎箟銆?
銆銆void鐪熸鍙戞尌鐨勪綔鐢ㄥ湪浜庯細
銆銆錛?錛?瀵瑰嚱鏁拌繑鍥炵殑闄愬畾錛?
銆銆錛?錛?瀵瑰嚱鏁板弬鏁扮殑闄愬畾銆?
銆銆鎴戜滑灝嗗湪絎笁鑺傚浠ヤ笂浜岀偣榪涜鍏蜂綋璇存槑銆?
銆銆浼楁墍鍛ㄧ煡錛屽鏋滄寚閽坧1鍜宲2鐨勭被鍨嬬浉鍚岋紝閭d箞鎴戜滑鍙互鐩存帴鍦╬1鍜宲2闂翠簰鐩歌祴鍊鹼紱濡傛灉p1鍜宲2鎸囧悜涓嶅悓鐨勬暟鎹被鍨嬶紝鍒欏繀欏諱嬌鐢ㄥ己鍒剁被鍨嬭漿鎹㈣繍綆楃鎶婅祴鍊艱繍綆楃鍙寵竟鐨勬寚閽堢被鍨嬭漿鎹負宸﹁竟鎸囬拡鐨勭被鍨嬨?
銆銆渚嬪錛?
float *p1;
int *p2;
p1 = p2;
銆銆鍏朵腑p1 = p2璇彞浼氱紪璇戝嚭閿欙紝鎻愮ず“'=' : cannot convert from 'int *' to 'float *'”錛屽繀欏繪敼涓猴細
p1 = (float *)p2;
銆鑰寁oid *鍒欎笉鍚岋紝浠諱綍綾誨瀷鐨勬寚閽堥兘鍙互鐩存帴璧嬪肩粰瀹冿紝鏃犻渶榪涜寮哄埗綾誨瀷杞崲錛?
void *p1;
int *p2;
p1 = p2;
銆銆浣嗚繖騫朵笉鎰忓懗鐫錛寁oid *涔熷彲浠ユ棤闇寮哄埗綾誨瀷杞崲鍦拌祴緇欏叾瀹冪被鍨嬬殑鎸囬拡銆傚洜涓?#8220;鏃犵被鍨?#8221;鍙互鍖呭“鏈夌被鍨?#8221;錛岃?#8220;鏈夌被鍨?#8221;鍒欎笉鑳藉寘瀹?#8220;鏃犵被鍨?#8221;銆傞亾鐞嗗緢綆鍗曪紝鎴戜滑鍙互璇?#8220;鐢蜂漢鍜屽コ浜洪兘鏄漢”錛屼絾涓嶈兘璇?#8220;浜烘槸鐢蜂漢”鎴栬?#8220;浜烘槸濂充漢”銆備笅闈㈢殑璇彞緙栬瘧鍑洪敊錛?
void *p1;
int *p2;
p2 = p1;
銆銆鎻愮ず“'=' : cannot convert from 'void *' to 'int *'”銆?
3.void鐨勪嬌鐢?
銆銆涓嬮潰緇欏嚭void鍏抽敭瀛楃殑浣跨敤瑙勫垯錛?
銆銆瑙勫垯涓 濡傛灉鍑芥暟娌℃湁榪斿洖鍊鹼紝閭d箞搴斿0鏄庝負void綾誨瀷
銆銆鍦–璇█涓紝鍑′笉鍔犺繑鍥炲肩被鍨嬮檺瀹氱殑鍑芥暟錛屽氨浼氳緙栬瘧鍣ㄤ綔涓鴻繑鍥炴暣鍨嬪煎鐞嗐備絾鏄澶氱▼搴忓憳鍗磋浠ヤ負鍏朵負void綾誨瀷銆備緥濡傦細
add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
銆銆紼嬪簭榪愯鐨勭粨鏋滀負杈撳嚭錛?
銆銆2 + 3 = 5
銆銆榪欒鏄庝笉鍔犺繑鍥炲艱鏄庣殑鍑芥暟鐨勭‘涓篿nt鍑芥暟銆?
銆銆鏋楅攼鍗氬+銆婇珮璐ㄩ噺C/C++緙栫▼銆嬩腑鎻愬埌錛?#8220;C++璇█鏈夊緢涓ユ牸鐨勭被鍨嬪畨鍏ㄦ鏌ワ紝涓嶅厑璁鎬笂榪版儏鍐碉紙鎸囧嚱鏁頒笉鍔犵被鍨嬪0鏄庯級鍙戠敓”銆傚彲鏄紪璇戝櫒騫朵笉涓瀹氳繖涔堣瀹氾紝璀鍦╒isual C++6.0涓笂榪癮dd鍑芥暟鐨勭紪璇戞棤閿欎篃鏃犺鍛婁笖榪愯姝g‘錛屾墍浠ヤ笉鑳藉瘎甯屾湜浜庣紪璇戝櫒浼氬仛涓ユ牸鐨勭被鍨嬫鏌ャ?
銆銆鍥犳錛屼負浜嗛伩鍏嶆販涔憋紝鎴戜滑鍦ㄧ紪鍐機/C++紼嬪簭鏃訛紝瀵逛簬浠諱綍鍑芥暟閮藉繀欏諱竴涓笉婕忓湴鎸囧畾鍏剁被鍨嬨傚鏋滃嚱鏁版病鏈夎繑鍥炲鹼紝涓瀹氳澹版槑涓簐oid綾誨瀷銆傝繖鏃㈡槸紼嬪簭鑹ソ鍙鎬х殑闇瑕侊紝涔熸槸緙栫▼瑙勮寖鎬х殑瑕佹眰銆傚彟澶栵紝鍔犱笂void綾誨瀷澹版槑鍚庯紝涔熷彲浠ュ彂鎸ヤ唬鐮佺殑“鑷敞閲?#8221;浣滅敤銆備唬鐮佺殑“鑷敞閲?#8221;鍗充唬鐮佽兘鑷繁娉ㄩ噴鑷繁銆?
瑙勫垯浜?濡傛灉鍑芥暟鏃犲弬鏁幫紝閭d箞搴斿0鏄庡叾鍙傛暟涓簐oid
銆銆鍦–++璇█涓0鏄庝竴涓繖鏍風殑鍑芥暟錛?
int function(void)
{
return 1;
}
銆銆鍒欒繘琛屼笅闈㈢殑璋冪敤鏄笉鍚堟硶鐨勶細
function(2);
銆銆鍥犱負鍦–++涓紝鍑芥暟鍙傛暟涓簐oid鐨勬剰鎬濇槸榪欎釜鍑芥暟涓嶆帴鍙椾換浣曞弬鏁般?
銆銆鎴戜滑鍦═urbo C 2.0涓紪璇戯細
#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}
銆銆緙栬瘧姝g‘涓旇緭鍑?錛岃繖璇存槑錛屽湪C璇█涓紝鍙互緇欐棤鍙傛暟鐨勫嚱鏁頒紶閫佷換鎰忕被鍨嬬殑鍙傛暟錛屼絾鏄湪C++緙栬瘧鍣ㄤ腑緙栬瘧鍚屾牱鐨勪唬鐮佸垯浼氬嚭閿欍傚湪C++涓紝涓嶈兘鍚戞棤鍙傛暟鐨勫嚱鏁頒紶閫佷換浣曞弬鏁幫紝鍑洪敊鎻愮ず“'fun' : function does not take 1 parameters”銆?
銆銆鎵浠ワ紝鏃犺鍦–榪樻槸C++涓紝鑻ュ嚱鏁頒笉鎺ュ彈浠諱綍鍙傛暟錛屼竴瀹氳鎸囨槑鍙傛暟涓簐oid銆?
銆銆瑙勫垯涓?灝忓績浣跨敤void鎸囬拡綾誨瀷
銆銆鎸夌収ANSI(American National Standards Institute)鏍囧噯錛屼笉鑳藉void鎸囬拡榪涜綆楁硶鎿嶄綔錛屽嵆涓嬪垪鎿嶄綔閮芥槸涓嶅悎娉曠殑錛?
void * pvoid;
pvoid++; //ANSI錛氶敊璇?
pvoid += 1; //ANSI錛氶敊璇?
//ANSI鏍囧噯涔嬫墍浠ヨ繖鏍瘋瀹氾紝鏄洜涓哄畠鍧氭寔錛氳繘琛岀畻娉曟搷浣滅殑鎸囬拡蹇呴』鏄‘瀹氱煡閬撳叾鎸囧悜鏁版嵁綾誨瀷澶у皬鐨勩?
//渚嬪錛?
int *pint;
pint++; //ANSI錛氭紜?
銆銆pint++鐨勭粨鏋滄槸浣垮叾澧炲ぇsizeof(int)銆?
銆銆浣嗘槸澶у悕榧庨紟鐨凣NU(GNU's Not Unix鐨勭緝鍐?鍒欎笉榪欎箞璁ゅ畾錛屽畠鎸囧畾void *鐨勭畻娉曟搷浣滀笌char *涓鑷淬?
鍥犳涓嬪垪璇彞鍦℅NU緙栬瘧鍣ㄤ腑鐨嗘紜細
pvoid++; //GNU錛氭紜?
pvoid += 1; //GNU錛氭紜?
銆銆pvoid++鐨勬墽琛岀粨鏋滄槸鍏跺澶т簡1銆?
銆銆鍦ㄥ疄闄呯殑紼嬪簭璁捐涓紝涓鴻繋鍚圓NSI鏍囧噯錛屽茍鎻愰珮紼嬪簭鐨勫彲縐繪鎬э紝鎴戜滑鍙互榪欐牱緙栧啓瀹炵幇鍚屾牱鍔熻兘鐨勪唬鐮侊細
void * pvoid;
(char *)pvoid++; //ANSI錛氭紜紱GNU錛氭紜?
(char *)pvoid += 1; //ANSI錛氶敊璇紱GNU錛氭紜?
銆銆GNU鍜孉NSI榪樻湁涓浜涘尯鍒紝鎬諱綋鑰岃█錛孏NU杈傾NSI鏇?#8220;寮鏀?#8221;錛屾彁渚涗簡瀵規(guī)洿澶氳娉曠殑鏀寔銆備絾鏄垜浠湪鐪熷疄璁捐鏃訛紝榪樻槸搴旇灝藉彲鑳藉湴榪庡悎ANSI鏍囧噯銆?
銆銆瑙勫垯鍥?濡傛灉鍑芥暟鐨勫弬鏁板彲浠ユ槸浠繪剰綾誨瀷鎸囬拡錛岄偅涔堝簲澹版槑鍏跺弬鏁頒負void *
銆銆鍏稿瀷鐨勫鍐呭瓨鎿嶄綔鍑芥暟memcpy鍜宮emset鐨勫嚱鏁板師鍨嬪垎鍒負錛?
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
銆銆榪欐牱錛屼換浣曠被鍨嬬殑鎸囬拡閮藉彲浠ヤ紶鍏emcpy鍜宮emset涓紝榪欎篃鐪熷疄鍦頒綋鐜頒簡鍐呭瓨鎿嶄綔鍑芥暟鐨勬剰涔夛紝鍥犱負瀹冩搷浣滅殑瀵硅薄浠呬粎鏄竴鐗囧唴瀛橈紝鑰屼笉璁鴻繖鐗囧唴瀛樻槸浠涔堢被鍨嬨傚鏋渕emcpy鍜宮emset鐨勫弬鏁扮被鍨嬩笉鏄痸oid *錛岃屾槸char *錛岄偅鎵嶅彨鐪熺殑濂囨簡錛佽繖鏍風殑memcpy鍜宮emset鏄庢樉涓嶆槸涓涓?#8220;綰補鐨勶紝鑴辯浣庣駭瓚e懗鐨?#8221;鍑芥暟錛?
涓嬮潰鐨勪唬鐮佹墽琛屾紜細
//紺轟緥錛歮emset鎺ュ彈浠繪剰綾誨瀷鎸囬拡
int intarray[100];
memset ( intarray, 0, 100*sizeof(int) ); //灝唅ntarray娓?
//紺轟緥錛歮emcpy鎺ュ彈浠繪剰綾誨瀷鎸囬拡
int intarray1[100], intarray2[100];
memcpy ( intarray1, intarray2, 100*sizeof(int) ); //灝唅ntarray2鎷瘋礉緇檌ntarray1
銆銆鏈夎叮鐨勬槸錛宮emcpy鍜宮emset鍑芥暟榪斿洖鐨勪篃鏄痸oid *綾誨瀷錛屾爣鍑嗗簱鍑芥暟鐨勭紪鍐欒呮槸澶氫箞鍦板瘜鏈夊闂晩錛?
銆銆瑙勫垯浜?void涓嶈兘浠h〃涓涓湡瀹炵殑鍙橀噺
銆銆涓嬮潰浠g爜閮戒紒鍥捐void浠h〃涓涓湡瀹炵殑鍙橀噺錛屽洜姝ら兘鏄敊璇殑浠g爜錛?
void a; //閿欒
function(void a); //閿欒
銆銆void浣撶幇浜嗕竴縐嶆娊璞★紝榪欎釜涓栫晫涓婄殑鍙橀噺閮芥槸“鏈夌被鍨?#8221;鐨勶紝璀涓涓漢涓嶆槸鐢蜂漢灝辨槸濂充漢錛堣繕鏈変漢濡栵紵錛夈?
銆銆void鐨勫嚭鐜板彧鏄負浜嗕竴縐嶆娊璞$殑闇瑕侊紝濡傛灉浣犳紜湴鐞嗚В浜嗛潰鍚戝璞′腑“鎶借薄鍩虹被”鐨勬蹇碉紝涔熷緢瀹規(guī)槗鐞嗚Вvoid鏁版嵁綾誨瀷銆傛濡備笉鑳界粰鎶借薄鍩虹被瀹氫箟涓涓疄渚嬶紝鎴戜滑涔熶笉鑳藉畾涔変竴涓獀oid錛堣鎴戜滑綾繪瘮鐨勭Оvoid涓?#8220;鎶借薄鏁版嵁綾誨瀷”錛夊彉閲忋?
4.鎬葷粨
銆銆灝忓皬鐨剉oid钑磋棌鐫寰堜赴瀵岀殑璁捐鍝插錛屼綔涓轟竴鍚嶇▼搴忚璁′漢鍛橈紝瀵歸棶棰樿繘琛屾繁涓涓眰嬈$殑鎬濊冨繀鐒朵嬌鎴戜滑鍙楃泭鍖祬銆?br>

鏉ユ簮錛氬紭灝?nbsp;   http://www.bansun.com/bbs/thread-4880-1-5.html



zhaoyg 2008-06-06 00:21 鍙戣〃璇勮
]]>
[杞澆]鍐呭瓨鍖哄垝鍒嗐佸唴瀛樺垎閰嶃佸父閲忓瓨鍌ㄥ尯銆佸爢銆佹爤銆佽嚜鐢卞瓨鍌ㄥ尯銆佸叏灞鍖?/title><link>http://m.shnenglu.com/zhaoyg/archive/2008/05/30/51587.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Fri, 30 May 2008 05:25:00 GMT</pubDate><guid>http://m.shnenglu.com/zhaoyg/archive/2008/05/30/51587.html</guid><wfw:comment>http://m.shnenglu.com/zhaoyg/comments/51587.html</wfw:comment><comments>http://m.shnenglu.com/zhaoyg/archive/2008/05/30/51587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zhaoyg/comments/commentRss/51587.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zhaoyg/services/trackbacks/51587.html</trackback:ping><description><![CDATA[     鎽樿:   <a href='http://m.shnenglu.com/zhaoyg/archive/2008/05/30/51587.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/zhaoyg/aggbug/51587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2008-05-30 13:25 <a href="http://m.shnenglu.com/zhaoyg/archive/2008/05/30/51587.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://www-8438.com" target="_blank">欧美一区二区福利在线</a>| <a href="http://4008166177.com" target="_blank">国产精品免费观看在线</a>| <a href="http://luoliguo.com" target="_blank">亚洲三级视频在线观看</a>| <a href="http://tareandshare.com" target="_blank">久久9热精品视频</a>| <a href="http://szbeikai.com" target="_blank">羞羞答答国产精品www一本</a>| <a href="http://ooo789.com" target="_blank">欧美影院视频</a>| <a href="http://557523.com" target="_blank">老妇喷水一区二区三区</a>| <a href="http://bjayj.com" target="_blank">亚洲成人在线视频播放</a>| <a href="http://mfgun.com" target="_blank">欧美日韩精品一二三区</a>| <a href="http://xiuxiu124.com" target="_blank">欧美日韩aaaaa</a>| <a href="http://hehextv.com" target="_blank">国产女同一区二区</a>| <a href="http://4008166177.com" target="_blank">亚洲高清在线观看</a>| <a href="http://jobmrleehxx.com" target="_blank">亚洲视频高清</a>| <a href="http://830085.com" target="_blank">久久久国产成人精品</a>| <a href="http://saox28.com" target="_blank">欧美高清免费</a>| <a href="http://6222h.com" target="_blank">亚洲一区网站</a>| <a href="http://mes-dvd.com" target="_blank">亚洲国产精品成人综合色在线婷婷</a>| <a href="http://www-666638.com" target="_blank">欧美制服丝袜</a>| <a href="http://xkm663y.com" target="_blank">麻豆精品在线视频</a>| <a href="http://2220004.com" target="_blank">国产精品扒开腿做爽爽爽视频</a>| <a href="http://zw1019.com" target="_blank">国产亚洲成人一区</a>| <a href="http://uuuu30.com" target="_blank">亚洲精品五月天</a>| <a href="http://126900.com" target="_blank">性亚洲最疯狂xxxx高清</a>| <a href="http://339505.com" target="_blank">欧美成人a∨高清免费观看</a>| <a href="http://0755hqr.com" target="_blank">日韩亚洲成人av在线</a>| <a href="http://551692.com" target="_blank">久久精品国产一区二区电影</a>| <a href="http://4y9k.com" target="_blank">欧美日韩亚洲一区二区三区</a>| <a href="http://91ymz.com" target="_blank">一区在线视频观看</a>| <a href="http://www8xoy.com" target="_blank">亚洲视频在线二区</a>| <a href="http://kk66mm.com" target="_blank">欧美成人蜜桃</a>| <a href="http://7776701.com" target="_blank">性做久久久久久</a>| <a href="http://playav111.com" target="_blank">欧美日本乱大交xxxxx</a>| <a href="http://hhh699.com" target="_blank">国内精品久久久久影院薰衣草 </a>| <a href="http://jjoo4.com" target="_blank">国产欧美一区二区精品忘忧草</a>| <a href="http://www52y.com" target="_blank">亚洲福利精品</a>| <a href="http://3848404.com" target="_blank">久久精品一区二区三区中文字幕</a>| <a href="http://hczztj.com" target="_blank">亚洲精选久久</a>| <a href="http://72avav.com" target="_blank">久久中文在线</a>| <a href="http://491342.com" target="_blank">国产一区二区三区的电影</a>| <a href="http://aaa798.com" target="_blank">亚洲图片欧洲图片av</a>| <a href="http://www-90443.com" target="_blank">美女999久久久精品视频</a>| <a href="http://jzsp101.com" target="_blank">亚洲午夜久久久</a>| <a href="http://89wbw.com" target="_blank">欧美日韩妖精视频</a>| <a href="http://www18818.com" target="_blank">亚洲九九精品</a>| <a href="http://dy123456.com" target="_blank">欧美激情精品久久久久久大尺度 </a>| <a href="http://788997.com" target="_blank">久热成人在线视频</a>| <a href="http://edtxt.com" target="_blank">亚洲欧美国产一区二区三区</a>| <a href="http://8410555.com" target="_blank">欧美精品一区三区在线观看</a>| <a href="http://oimeal.com" target="_blank">亚洲国产美女久久久久</a>| <a href="http://ktokt.com" target="_blank">久久天堂国产精品</a>| <a href="http://2323nn.com" target="_blank">欧美在现视频</a>| <a href="http://hy8r.com" target="_blank">国产一区二区三区黄视频</a>| <a href="http://jpqueyou.com" target="_blank">亚洲男同1069视频</a>| <a href="http://avtb2120.com" target="_blank">avtt综合网</a>| <a href="http://91sp136.com" target="_blank">国产精品www网站</a>| <a href="http://5a07.com" target="_blank">中日韩视频在线观看</a>| <a href="http://22abb.com" target="_blank">日韩视频第一页</a>| <a href="http://cechi8.com" target="_blank">欧美日韩在线观看一区二区</a>| <a href="http://daqinhkvip.com" target="_blank">夜夜爽www精品</a>| <a href="http://www66617.com" target="_blank">亚洲每日更新</a>| <a href="http://73cao.com" target="_blank">国产精品第一区</a>| <a href="http://www33444.com" target="_blank">午夜精品久久久久久久99热浪潮</a>| <a href="http://041935.com" target="_blank">一区二区欧美精品</a>| <a href="http://www-s8.com" target="_blank">国产麻豆9l精品三级站</a>| <a href="http://www474000c.com" target="_blank">久久精品成人一区二区三区</a>| <a href="http://91x8.com" target="_blank">久久国产福利</a>| <a href="http://hhsj31.com" target="_blank">在线精品国产欧美</a>| <a href="http://ddixx.com" target="_blank">亚洲国产精品激情在线观看</a>| <a href="http://bocai4488.com" target="_blank">欧美成人dvd在线视频</a>| <a href="http://dacellflex.com" target="_blank">亚洲欧洲精品成人久久奇米网</a>| <a href="http://mascorcg.com" target="_blank">欧美v日韩v国产v</a>| <a href="http://aotaotao.com" target="_blank">欧美电影免费观看</a>| <a href="http://456888com.com" target="_blank">欧美v亚洲v综合ⅴ国产v</a>| <a href="http://sxhrdyb.com" target="_blank">欧美大香线蕉线伊人久久国产精品</a>| <a href="http://149155.com" target="_blank">永久免费毛片在线播放不卡</a>| <a href="http://pron12.com" target="_blank">欧美成人免费va影院高清</a>| <a href="http://ynzhuoyi.com" target="_blank">老司机精品福利视频</a>| <a href="http://www51avav.com" target="_blank">亚洲精品一二三</a>| <a href="http://excellentjy.com" target="_blank">亚洲美女色禁图</a>| <a href="http://cancerrxa.com" target="_blank">欧美午夜久久</a>| <a href="http://hkbsi.com" target="_blank">久久一区二区三区av</a>| <a href="http://7kz6.com" target="_blank">欧美不卡视频一区发布</a>| <a href="http://bjlaosha.com" target="_blank">中文在线不卡视频</a>| <a href="http://j88866.com" target="_blank">香蕉久久夜色精品国产使用方法</a>| <a href="http://yckjwb.com" target="_blank">国内成人精品一区</a>| <a href="http://mauhorng.com" target="_blank">亚洲激情另类</a>| <a href="http://133686.com" target="_blank">国产伦精品一区二区三区四区免费</a>| <a href="http://baigoso.com" target="_blank">久久久久国产一区二区</a>| <a href="http://4439x9.com" target="_blank">欧美粗暴jizz性欧美20</a>| <a href="http://uuclassroom.com" target="_blank">午夜国产精品视频免费体验区</a>| <a href="http://40346c.com" target="_blank">久久久福利视频</a>| <a href="http://jiujiuri8.com" target="_blank">在线一区二区三区四区五区</a>| <a href="http://100736.com" target="_blank">性欧美大战久久久久久久久</a>| <a href="http://4449992.com" target="_blank">亚洲精品一区二区三</a>| <a href="http://www-440450.com" target="_blank">中文av一区二区</a>| <a href="http://8847m.com" target="_blank">亚洲激情欧美激情</a>| <a href="http://73cao.com" target="_blank">亚洲欧美综合另类中字</a>| <a href="http://2220004.com" target="_blank">亚洲精品国产精品乱码不99</a>| <a href="http://www-988900.com" target="_blank">亚洲免费伊人电影在线观看av</a>| <a href="http://77mcn.com" target="_blank">最近中文字幕日韩精品</a>| <a href="http://wzxjzx.com" target="_blank">亚洲综合色婷婷</a>| <a href="http://tianxiantxtv.com" target="_blank">亚洲另类视频</a>| <a href="http://www34523.com" target="_blank">欧美伊人久久久久久午夜久久久久 </a>| <a href="http://aa56789.com" target="_blank">国产精品一级久久久</a>| <a href="http://2061851.com" target="_blank">欧美国产一区二区在线观看</a>| <a href="http://1369080.com" target="_blank">国产精品入口尤物</a>| <a href="http://5849595.com" target="_blank">亚洲激情在线观看</a>| <a href="http://583775.com" target="_blank">一区在线免费</a>| <a href="http://www278999.com" target="_blank">亚洲欧美日韩国产一区二区</a>| <a href="http://511caifu.com" target="_blank">日韩一级精品视频在线观看</a>| <a href="http://6k6a.com" target="_blank">久久精品一级爱片</a>| <a href="http://fuwu56.com" target="_blank">性欧美精品高清</a>| <a href="http://373gg.com" target="_blank">欧美日韩国产色综合一二三四</a>| <a href="http://yye321.com" target="_blank">久久亚洲私人国产精品va媚药</a>| <a href="http://107766a.com" target="_blank">欧美午夜免费电影</a>| <a href="http://ccnn33.com" target="_blank">亚洲精品乱码久久久久久黑人</a>| <a href="http://mfgun.com" target="_blank">黄色精品一二区</a>| <a href="http://8xfore.com" target="_blank">亚洲欧美一区二区三区久久</a>| <a href="http://www201314.com" target="_blank">亚洲视频香蕉人妖</a>| <a href="http://www-293456.com" target="_blank">欧美激情片在线观看</a>| <a href="http://124909.com" target="_blank">欧美成人黄色小视频</a>| <a href="http://kxm6868.com" target="_blank">国产日韩精品一区二区三区</a>| <a href="http://www-ty177.com" target="_blank">日韩视频亚洲视频</a>| <a href="http://xvideoxxnx.com" target="_blank">亚洲精品一区在线</a>| <a href="http://1397h.com" target="_blank">欧美高清不卡</a>| <a href="http://794278.com" target="_blank">欧美国产一区视频在线观看</a>| <a href="http://jav1111.com" target="_blank">国内精品美女av在线播放</a>| <a href="http://haose23.com" target="_blank">亚洲综合视频1区</a>| <a href="http://749996.com" target="_blank">亚洲自拍电影</a>| <a href="http://fsdashen.com" target="_blank">欧美日韩久久久久久</a>| <a href="http://y1bbs.com" target="_blank">亚洲激情在线播放</a>| <a href="http://wwwhhh396.com" target="_blank">亚洲免费福利视频</a>| <a href="http://8eeeccc.com" target="_blank">国产精品免费一区豆花</a>| <a href="http://woniuminsu.com" target="_blank">亚洲国产合集</a>| <a href="http://wwwavtb2049.com" target="_blank">亚洲国产精品嫩草影院</a>| <a href="http://ad377.com" target="_blank">久久精品99国产精品</a>| <a href="http://by27333.com" target="_blank">久久久久欧美精品</a>| <a href="http://www-116036.com" target="_blank">狠狠色香婷婷久久亚洲精品</a>| <a href="http://haoa009.com" target="_blank">久久成人免费视频</a>| <a href="http://69kun.com" target="_blank">免费中文日韩</a>| <a href="http://dtwave-ind.com" target="_blank">亚洲经典在线</a>| <a href="http://9993334.com" target="_blank">欧美精品在线一区二区</a>| <a href="http://707377c.com" target="_blank">亚洲免费观看视频</a>| <a href="http://626tw.com" target="_blank">欧美亚洲视频一区二区</a>| <a href="http://dy123456.com" target="_blank">国产亚洲激情</a>| <a href="http://www-tk3333.com" target="_blank">久久久久久国产精品一区</a>| <a href="http://6868681.com" target="_blank">欧美wwwwww</a>| <a href="http://25axxa.com" target="_blank">一本大道久久a久久综合婷婷</a>| <a href="http://shght.com" target="_blank">欧美精品观看</a>| <a href="http://wwwen41.com" target="_blank">一本大道久久a久久精品综合</a>| <a href="http://wwwhhh396.com" target="_blank">亚洲一区二区在线播放</a>| <a href="http://p35cc.com" target="_blank">国产精品天天看</a>| <a href="http://2235e.com" target="_blank">久久精品夜色噜噜亚洲a∨</a>| <a href="http://ju5558.com" target="_blank">麻豆成人av</a>| <a href="http://ynjzwh.com" target="_blank">亚洲人成在线观看</a>| <a href="http://569688.com" target="_blank">欧美日韩在线第一页</a>| <a href="http://instantptt.com" target="_blank">亚洲男人第一网站</a>| <a href="http://sao320.com" target="_blank">麻豆国产精品一区二区三区</a>| <a href="http://www-5888c.com" target="_blank">亚洲日本视频</a>| <a href="http://7c3e.com" target="_blank">国产精品乱子久久久久</a>| <a href="http://taotuango.com" target="_blank">久久精品国产亚洲aⅴ</a>| <a href="http://www895pao.com" target="_blank">亚洲第一页在线</a>| <a href="http://www47067.com" target="_blank">亚洲欧美日韩另类精品一区二区三区</a>| <a href="http://www-77537.com" target="_blank">国产乱码精品一区二区三区av</a>| <a href="http://by99969.com" target="_blank">欧美综合77777色婷婷</a>| <a href="http://345fz.com" target="_blank">亚洲国产二区</a>| <a href="http://choaoxing.com" target="_blank">新狼窝色av性久久久久久</a>| <a href="http://012492.com" target="_blank">国内激情久久</a>| <a href="http://bx989.com" target="_blank">欧美吻胸吃奶大尺度电影</a>| <a href="http://tigerpowerinc.com" target="_blank">性欧美暴力猛交另类hd</a>| <a href="http://zb557.com" target="_blank">亚洲国产精品久久久</a>| <a href="http://wwwhhh396.com" target="_blank">欧美一级艳片视频免费观看</a>| <a href="http://noeljgq.com" target="_blank">在线观看国产精品网站</a>| <a href="http://tuokuba520.com" target="_blank">欧美色区777第一页</a>| <a href="http://proenhub.com" target="_blank">久久久久.com</a>| <a href="http://xkm663y.com" target="_blank">亚洲图片你懂的</a>| <a href="http://4430x.com" target="_blank">欧美顶级艳妇交换群宴</a>| <a href="http://uuuu79.com" target="_blank">午夜精品久久久久久99热软件</a>| <a href="http://798200.com" target="_blank">亚洲国产精品va在看黑人</a>| <a href="http://567acg.com" target="_blank">国产精品一区久久久久</a>| <a href="http://www-137999.com" target="_blank">欧美成人自拍</a>| <a href="http://www-222304.com" target="_blank">久久精品导航</a>| <a href="http://888ppxx.com" target="_blank">一区二区免费在线播放</a>| <a href="http://www930666.com" target="_blank">欧美国产一区二区在线观看</a>| <a href="http://hhhtalk.com" target="_blank">欧美在线国产精品</a>| <a href="http://88488848.com" target="_blank">亚洲激情社区</a>| <a href="http://710191.com" target="_blank">好吊妞**欧美</a>| <a href="http://r4747.com" target="_blank">国产美女高潮久久白浆</a>| <a href="http://4006616309.com" target="_blank">欧美劲爆第一页</a>| <a href="http://5767j.com" target="_blank">久久久久女教师免费一区</a>| <a href="http://488f.com" target="_blank">亚洲一区欧美激情</a>| <a href="http://ayxchc.com" target="_blank">亚洲人成在线播放网站岛国</a>| <a href="http://98tangav.com" target="_blank">久久一区二区视频</a>| <a href="http://z169.com" target="_blank">欧美中文字幕</a>| <a href="http://66jj99.com" target="_blank">亚洲一区高清</a>| <a href="http://sg-lxs.com" target="_blank">一卡二卡3卡四卡高清精品视频</a>| <a href="http://www-787333.com" target="_blank">一区二区视频免费完整版观看</a>| <a href="http://zucai168.com" target="_blank">国产精品美女午夜av</a>| <a href="http://avjj80.com" target="_blank">欧美午夜片在线观看</a>| <a href="http://www-18873.com" target="_blank">欧美日韩午夜视频在线观看</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>