LIXUEFENG'S BLOG

来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/index.php?blogid=7625&pg=4&cat= 存档链接: https://web.archive.org/web/20040916110338id_/http://www.blogbus.com:80/blogbus/blog/index.php?blogid=7625&pg=4&cat=


LIXUEFENG'S BLOG ¿ª·¢Ëæ±Ê »¹Ã»ÓĞ·ÖÀà (61) ·ÖÒ³: [1] [2] [3] [4] [5] [6] [7] 2004-06-04 SUN½«¿ª·ÅJavaµÄÔ´´úÂ룿 Sun will Open Java's Source £¬Èç¹ûÊÇÕæµÄ»°£¬Java½«»áµÃµ½¸ü´óµÄ·¢Õ¹£¡£¡²»¹ı²»Çå³ş½«»áʹÓÃʲôÑùµÄÊÚȨЭÒ飿

lixuefeng @ 12:07 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-06-02 ²âÊÔtrackback trackbackµØÖ·:http://www.movabletype.org/mt/trackback/65

lixuefeng @ 17:17 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(1) | ÒıÓÃ(Trackback2) 2004-05-25 C++·ç¸ñÓë¼¼ÇÉ À´×Ô£º http://www.trainlinux.com/p/2003-05-24/4091.html £¨Òë×¢£º±¾Îĵķ­ÒëÏ൱¼è¿à¡£Bjarne Stroustrup²»À¢ÊÇ´´Á¢C++ÓïÑÔµÄÒ»´ú´óʦ£¬²»µ«Ë¼Ï벩´ó¾«É¶øÇÒÔÚDz´ÊÔì¾äÉÏ£¬Ò²·Ç³£¾«Î¢Éî°Â¡£ÓĞºÜ¶àµØ·½£¬ÒëÕß·´¸´Õå×㬶¼²»ÄÜÈ¡µÃÀíÏëµÄЧ¹û£¬Ö»Äܾ¡Á¦¶øÎª¡£ Html¸ñʽµÄÎĵµ¼ûÒëÕßÖ÷Ò³£ºhttp://www.wushuang.net Èç¹ûÄã¶ÔÕâ¸ö·­Òë¸åÓĞÈκÎÒâ¼ûºÍ½¨Ò飬Ç뷢ПøÒëÕߣºonekey@163.com¡£ Ô­ÎĵĵØÖ·Îª£ºhttp://www.research.att.com/~bs/bs_faq.html£© £¨Bjarne Stroustrup²©Ê¿£¬1950Äê³öÉúÓÚµ¤Âó£¬ÏȺó±ÏÒµÓÚµ¤Âó°¢Â³Ë¹´óѧºÍÓ¢¹ú½£ŞØ´óѧ£¬AT&T´ó¹æÄ£³ÌĞòÉè¼ÆÑо¿²¿ÃŸºÔğÈË£¬AT&T ±´¶ûʵÑéÊÒºÍACM³ÉÔ±¡£1979Ä꣬B. S¿ªÊ¼¿ª·¢Ò»ÖÖÓïÑÔ£¬µ±Ê±³ÆÎª"C with Class"£¬ºóÀ´Ñİ»¯ÎªC++¡£1998Ä꣬ANSI/ISO C++±ê×¼½¨Á¢£¬Í¬Ä꣬B. SÍÆ³öÆä¾­µäÖø×÷The C++ Programming LanguageµÄµÚÈı°æ¡££© ÕâÊÇһЩÈËÃǾ­³£ÏòÎÒÎÊÆğµÄÓйØC++µÄ·ç¸ñÓë¼¼ÇɵÄÎÊÌâ¡£Èç¹ûÄãÄÜÌá³ö¸üºÃµÄÎÊÌ⣬»òÕß¶ÔÕâĞ©´ğ°¸ÓĞËù½¨Ò飬ÇëÎñ±Ø·¢Email¸øÎÒ(bs@research.att.com)¡£Çë¼Çס£¬ÎÒ²»ÄܰÑÈ«²¿µÄʱ¼ä¶¼»¨ÔÚ¸üĞÂÎÒµÄÖ÷Ò³ÉÏÃæ¡£ ¸ü¶àµÄÎÊÌâÇë²Î¼ûÎÒµÄgeneral FAQ¡£ ¹ØÓÚÊõÓïºÍ¸ÅÄÇë²Î¼ûÎÒµÄC++ÊõÓï±í£¨C++ glossary.£©¡£ Çë×¢Ò⣬Õâ½ö½öÊÇÒ»¸ö³£¼ûÎÊÌâÓë½â´ğµÄÁĞ±í¡£Ëü²»ÄÜ´úÌæÒ»±¾ÓÅĞã½Ì¿ÆÊéÖĞÄÇĞ©¾­¹ı¾«ĞÄÌôÑ¡µÄ·¶ÀıÓë½âÊÍ¡£ËüÒ²²»ÄÜÏóÒ»±¾²Î¿¼ÊÖ²á»òÓïÑÔ±ê×¼ÄÇÑù£¬ÌṩÏêϸºÍ׼ȷµÄ˵Ã÷¡£ÓйØC++µÄÉè¼ÆµÄÎÊÌ⣬Çë²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷£¨The Design and Evolution of C++£©¡£¹ØÓÚC++ÓïÑÔÓë±ê×¼¿âµÄʹÓã¬Çë²Î¼û¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·£¨The C++ Programming Language£©¡£ Ŀ¼£º ÎÒÈçºÎĞ´Õâ¸ö·Ç³£¼òµ¥µÄ³ÌĞò£¿ Ϊʲô±àÒëÒª»¨Õâô³¤µÄʱ¼ä£¿ Ϊʲôһ¸ö¿ÕÀàµÄ´óĞ¡²»Îª0£¿ ÎÒ±ØĞëÔÚÀàÉùÃ÷´¦¸³ÓèÊı¾İÂ𣿠Ϊʲô³ÉÔ±º¯ÊıĬÈϲ»ÊÇvirtualµÄ£¿ ΪʲôÎö¹¹º¯ÊıĬÈϲ»ÊÇvirtualµÄ£¿ Ϊʲô²»ÄÜÓĞĞéÄâ¹¹Ô캯Êı£¿ ÎªÊ²Ã´ÖØÔØÔڼ̳ĞÀàÖв»¹¤×÷£¿ ÎÒÄܹ»ÔÚ¹¹Ô캯ÊıÖе÷ÓÃÒ»¸öĞéÄ⺯ÊıÂ𣿠ÓĞûÓĞ¡°Ö¸¶¨Î»ÖÃɾ³ı¡±(placement delete)£¿ ÎÒÄÜ·ÀÖ¹±ğÈ˼̳ĞÎÒ×Ô¼ºµÄÀàÂ𣿠Ϊʲô²»ÄÜΪģ°å²ÎÊı¶¨ÒåÔ¼Êø£¨constraints£©£¿ ¼ÈÈ»ÒѾ­ÓĞÁËÓÅĞãµÄqsort()º¯Êı£¬ÎªÊ²Ã´»¹ĞèÒªÒ»¸ösort()£¿ ʲôÊǺ¯Êı¶ÔÏó£¨function object£©£¿ ÎÒÓ¦¸ÃÈçºÎ¶Ô¸¶ÄÚ´æĞ¹Â©£¿ ÎÒΪʲôÔÚ²¶»ñÒ»¸öÒì³£Ö®ºó¾Í²»ÄܼÌĞø£¿ ΪʲôC++ÖĞûÓĞÏ൱ÓÚrealloc()µÄº¯Êı£¿ ÈçºÎʹÓÃÒì³££¿ ÔõÑù´ÓÊäÈëÖжÁȡһ¸ö×Ö·û´®£¿ ΪʲôC++²»Ìṩ¡°finally¡±µÄ¹¹Ô죿 ʲôÊÇ×Ô¶¯Ö¸Õ루auto_ptr£©£¬ÎªÊ²Ã´Ã»ÓĞ×Ô¶¯Êı×飨auto_array£©£¿ ¿ÉÒÔ»ìºÏʹÓÃC·ç¸ñÓëC++·ç¸ñµÄÄÚ´æ·ÖÅÉÓëÖØĞ·ÖÅäÂ𣿠ÎÒΪʲô±ØĞëʹÓÃÒ»¸öÔìĞÍÀ´×ª»»void£¿ ÎÒÈçºÎ¶¨ÒåÒ»¸öÀàÄÚ²¿£¨in-class£©µÄ³£Á¿£¿ Ϊʲôdelete²»»á½«²Ù×÷ÊıÖÃ0£¿ ÎÒÄܹ»Ğ´¡°void main()¡±Â𣿠ΪʲôÎÒ²»ÄÜÖØÔØµã·ûºÅ£¬::£¬sizeof£¬µÈµÈ£¿ ÔõÑù½«Ò»¸öÕûĞÍֵת»»ÎªÒ»¸ö×Ö·û´®£¿ ¡°int p¡±ÕıÈ·»¹ÊÇ¡°int p¡±ÕıÈ·£¿ ¶ÔÓÚÎҵĴúÂ룬ÄÄÒ»ÖÖ²¼¾Ö·ç¸ñ£¨layout style£©ÊÇ×îºÃµÄ£¿ ÎÒÓ¦¸Ã½«¡°const¡±·ÅÔÚÀàĞÍ֮ǰ»¹ÊÇÖ®ºó£¿ ʹÓúêÓĞʲôÎÊÌ⣿ ÎÒÈçºÎĞ´Õâ¸ö·Ç³£¼òµ¥µÄ³ÌĞò£¿ ÌØ±ğÊÇÔÚÒ»¸öѧÆÚµÄ¿ªÊ¼£¬ÎÒ³£³£ÊÕµ½Ğí¶à¹ØÓÚ±àĞ´Ò»¸ö·Ç³£¼òµ¥µÄ³ÌĞòµÄѯÎÊ¡£Õâ¸öÎÊÌâÓĞÒ»¸öºÜ¾ß´ú±íĞԵĽâ¾ö·½·¨£¬ÄǾÍÊÇ£¨ÔÚÄãµÄ³ÌĞòÖĞ£©¶ÁÈ뼸¸öÊı×Ö£¬¶ÔËüÃÇ×öһЩ´¦Àí£¬Ôٰѽá¹ûÊä³ö¡£ÏÂÃæÊÇÒ»¸öÕâÑù×öµÄÀı×Ó£º #include #include #include using namespace std; int main() { vector v; double d; while(cin>>d) v.push_back(d); // ¶ÁÈëÔªËØ if (!cin.eof()) { // ¼ì²éÊäÈëÊÇ·ñ³ö´í cerr << "format error\n"; return 1; // ·µ»ØÒ»¸ö´íÎó } cout << "read " << v.size() << " elements\n"; reverse(v.begin(),v.end()); cout << "elements in reverse order:\n"; for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n'; return 0; // ³É¹¦·µ»Ø } ¶ÔÕâ¶Î³ÌĞòµÄ¹Û²ì£º ÕâÊÇÒ»¶Î±ê×¼µÄISO C++³ÌĞò£¬Ê¹ÓÃÁ˱ê×¼¿â(standard library)¡£±ê×¼¿â¹¤¾ßÔÚÃüÃû¿Õ¼ästdÖĞÉùÃ÷£¬·â×°ÔÚûÓĞ.hºó׺µÄÍ·ÎļşÖĞ¡£ Èç¹ûÄãÒªÔÚWindowsϱàÒëËü£¬ÄãĞèÒª½«Ëü±àÒë³ÉÒ»¸ö¡°¿ØÖÆÌ¨³ÌĞò¡±£¨console application£©¡£¼ÇµÃ½«Ô´Îļş¼ÓÉÏ.cppºó׺£¬·ñÔò±àÒëÆ÷¿ÉÄÜ»áÒÔΪËüÊÇÒ»¶ÎC´úÂë¶ø²»ÊÇC++¡£ Êǵģ¬main()º¯Êı·µ»ØÒ»¸öintÖµ¡£ ¶Áµ½Ò»¸ö±ê×¼µÄÏòÁ¿(vector)ÖĞ£¬¿ÉÒÔ±ÜÃâÔÚËæÒâÈ·¶¨´óĞ¡µÄ»º³åÖĞÒç³öµÄ´íÎó¡£¶Áµ½Ò»¸öÊı×é(array)ÖĞ£¬¶ø²»²úÉú¡°¼òµ¥´íÎó¡±(silly error)£¬ÕâÒѾ­³¬³öÁËÒ»¸öĞÂÊÖµÄÄÜÁ¦¡ª¡ªÈç¹ûÄã×öµ½ÁË£¬ÄÇÄãÒѾ­²»ÊÇÒ»¸öĞÂÊÖÁË¡£Èç¹ûÄã¶Ô´Ë±íʾ»³ÒÉ£¬ÎÒ½¨ÒéÄãÔĶÁÎÒµÄÎÄÕ¡°½«±ê×¼C++×÷ΪһÖÖеÄÓïÑÔÀ´Ñ§Ï°¡±("Learning Standard C++ as a New Language")£¬Äã¿ÉÒÔÔÚ±¾ÈËÖø×÷Áбí(my publications list)ÖĞÏÂÔØµ½Ëü¡£ !cin.eof()ÊǶÔÁ÷µÄ¸ñʽµÄ¼ì²é¡£ÊÂʵÉÏ£¬Ëü¼ì²éÑ­»·ÊÇ·ñÖÕ½áÓÚ·¢ÏÖÒ»¸öend-of-file(Èç¹û²»ÊÇÕâÑù£¬ÄÇôÒâζ×ÅÊäÈëûÓа´ÕÕ¸ø¶¨µÄ¸ñʽ)¡£¸ü¶àµÄ˵Ã÷£¬Çë²Î¼ûÄãµÄC++½Ì¿ÆÊéÖеġ°Á÷״̬¡±(stream state)²¿·Ö¡£ vectorÖªµÀËü×Ô¼ºµÄ´óĞ¡£¬Òò´ËÎÒ²»ĞèÒª¼ÆËãÔªËØµÄÊıÁ¿¡£ Õâ¶Î³ÌĞòûÓаüº¬ÏÔʽµÄÄÚ´æ¹ÜÀí¡£Vectorά»¤Ò»¸öÄÚ´æÖеÄÕ»£¬ÒÔ´æ·ÅËüµÄÔªËØ¡£µ±Ò»¸övectorĞèÒª¸ü¶àµÄÄÚ´æÊ±£¬Ëü»á·ÖÅäһЩ£»µ±Ëü²»ÔÙÉú´æÊ±£¬Ëü»áÊÍ·ÅÄÚ´æ¡£ÓÚÊÇ£¬Ê¹ÓÃÕß²»ĞèÒªÔÙ¹ØĞÄvectorÖĞÔªËØµÄÄÚ´æ·ÖÅäºÍÊÍ·ÅÎÊÌâ¡£ ³ÌĞòÔÚÓöµ½ÊäÈëÒ»¸ö¡°end-of-file¡±Ê±½áÊø¡£Èç¹ûÄãÔÚUNIXƽ̨ÏÂÔËĞĞËü£¬¡°end-of-file¡±µÈÓÚ¼üÅÌÉϵÄCtrl+D¡£Èç¹ûÄãÔÚWindowsƽ̨Ï£¬ÄÇôÓÉÓÚÒ»¸öBUGËüÎŞ·¨±æ±ğ¡°end-of-file¡±×Ö·û£¬Äã¿ÉÄÜÇãÏòÓÚʹÓÃÏÂÃæÕâ¸öÉÔÉÔ¸´ÔÓĞ©µÄ°æ±¾£¬ËüʹÓÃÒ»¸ö´Ê¡°end¡±À´±íʾÊäÈëÒѾ­½áÊø¡£ #include #include #include #include using namespace std; int main() { vector v; double d; while(cin>>d) v.push_back(d); // ¶ÁÈëÒ»¸öÔªËØ if (!cin.eof()) { // ¼ì²éÊäÈëÊÇ·ñʧ°Ü cin.clear(); // Çå³ı´íÎó״̬ string s; cin >> s; // ²éÕÒ½áÊø×Ö·û if (s != "end") { cerr << "format error\n"; return 1; // ·µ»Ø´íÎó } } cout << "read " << v.size() << " elements\n"; reverse(v.begin(),v.end()); cout << "elements in reverse order:\n"; for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n'; return 0; // ³É¹¦·µ»Ø } ¸ü¶àµÄ¹ØÓÚʹÓñê×¼¿â½«ÊÂÇé¼ò»¯µÄÀı×Ó£¬Çë²Î¼û¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·Öеġ°ÂşÓαê×¼¿â¡±("Tour of the Standard Library")Ò»Õ¡£ Ϊʲô±àÒëÒª»¨Õâô³¤µÄʱ¼ä£¿ ÄãµÄ±àÒëÆ÷¿ÉÄÜÓĞÎÊÌâ¡£Ò²ĞíËüÌ«ÀÏÁË£¬Ò²ĞíÄã°²×°ËüµÄʱºò³öÁË´í£¬Ò²ĞíÄãÓõļÆËã»úÒѾ­ÊǸö¹Å¶­¡£ÔÚÖîÈç´ËÀàµÄÎÊÌâÉÏ£¬ÎÒÎŞ·¨°ïÖúÄã¡£ µ«ÊÇ£¬ÕâÒ²ÊǺܿÉÄܵģºÄãÒª±àÒëµÄ³ÌĞòÉè¼ÆµÃ·Ç³£Ôã¸â£¬ÒÔÖÁÓÚ±àÒëÆ÷²»µÃ²»¼ì²éÊıÒ԰ټƵÄÍ·ÎļşºÍÊıÍòĞĞ´úÂë¡£ÀíÂÛÉÏÀ´Ëµ£¬ÕâÊÇ¿ÉÒÔ±ÜÃâµÄ¡£Èç¹ûÕâÊÇÄ㹺ÂòµÄ¿âµÄÉè¼ÆÎÊÌ⣬Äã¶ÔËüÎŞ¼Æ¿ÉÊ©£¨³ıÁË»»Ò»¸ö¸üºÃµÄ¿â£©£¬µ«Äã¿ÉÒÔ½«Äã×Ô¼ºµÄ´úÂë×éÖ¯µÃ¸üºÃһЩ£¬ÒÔÇóµÃ½«Ğ޸ĴúÂëºóµÄÖØĞ±àÒ빤×÷½µµ½×îÉÙ¡£ÕâÑùµÄÉè¼Æ»á¸üºÃ£¬¸üÓĞ¿Éά»¤ĞÔ£¬ÒòΪËüÃÇչʾÁ˸üºÃµÄ¸ÅÄîÉϵķÖÀë¡£ ¿´¿´Õâ¸öµäĞ͵ÄÃæÏò¶ÔÏóµÄ³ÌĞòÀı×Ó£º class Shape { public: // ʹÓÃShapesµÄÓû§µÄ½Ó¿Ú virtual void draw() const; virtual void rotate(int degrees); // ... protected: // common data (for implementers of Shapes) Point center; Color col; // ... }; class Circle : public Shape { public: void draw() const; void rotate(int) { } // ... protected: int radius; // ... }; class Triangle : public Shape { public: void draw() const; void rotate(int); // ... protected: Point a, b, c; // ... }; Éè¼ÆË¼ÏëÊÇ£¬Óû§Í¨¹ıShapeµÄpublic½Ó¿ÚÀ´²Ù×İËüÃÇ£¬¶øÅÉÉúÀࣨÀıÈçCircleºÍTriangle£©µÄʵÏÖ²¿·ÖÔò¹²ÏíÓÉprotected³ÉÔ±±íÏÖµÄÄDz¿·ÖʵÏÖ£¨implementation£©¡£ Õâ²»ÊÇÒ»¼şÈİÒ×µÄÊÂÇ飺ȷ¶¨ÄÄЩʵÏÖ²¿·ÖÊǶÔËùÓеÄÅÉÉúÀà¶¼ÓĞÓõ쬲¢½«Ö®¹²Ïí³öÀ´¡£Òò´Ë£¬Óëpublic½Ó¿ÚÏà±È£¬protected³ÉÔ±ÍùÍùÒª×ö¶àµÃ¶àµÄ¸Ä¶¯¡£¾ÙÀıÀ´Ëµ£¬ËäÈ»ÀíÂÛÉÏ¡°ÖĞĞÄ¡±(center)¶ÔËùÓеÄͼĞζ¼ÊÇÒ»¸öÓĞЧµÄ¸ÅÄµ«µ±ÄãҪά»¤Ò»¸öÈı½ÇĞεġ°ÖĞĞÄ¡±µÄʱºò£¬ÊÇÒ»¼ş·Ç³£Âé·³µÄÊÂÇ顪¡ª¶ÔÓÚÈı½ÇĞΣ¬µ±ÇÒ½öµ±Ëüȷʵ±»ĞèÒªµÄʱºò£¬¼ÆËãÕâ¸öÖĞĞIJÅÊÇÓĞÒâÒåµÄ¡£ protected³ÉÔ±ºÜ¿ÉÄÜÒªÒÀÀµÓÚʵÏÖ²¿·ÖµÄϸ½Ú£¬¶øShapeµÄÓû§£¨Òë×¢£ºuser´Ë´¦ÒëΪÓû§£¬Ö¸Ê¹ÓÃShapeÀàµÄ´úÂ룬ÏÂͬ£©È´²»¼ûµÃ±ØĞëÒÀÀµËüÃÇ¡£¾ÙÀıÀ´Ëµ£¬ºÜ¶à£¨´ó¶àÊı£¿£©Ê¹ÓÃShapeµÄ´úÂëÔÚÂß¼­ÉÏÊÇÓë¡°ÑÕÉ«¡±Î޹ص쬵«ÊÇÓÉÓÚShapeÖĞ¡°ÑÕÉ«¡±Õâ¸ö¶¨ÒåµÄ´æÔÚ£¬È´¿ÉÄÜĞèÒªÒ»¶Ñ¸´ÔÓµÄÍ·Îļş£¬À´½áºÏ²Ù×÷ϵͳµÄÑÕÉ«¸ÅÄî¡£ µ±protected²¿·Ö·¢ÉúÁ˸ıäʱ£¬Ê¹ÓÃShapeµÄ´úÂë±ØĞëÖØĞ±àÒ롪¡ª¼´Ê¹Ö»ÓĞÅÉÉúÀàµÄʵÏÖ²¿·Ö²ÅÄܹ»·ÃÎÊprotected³ÉÔ±¡£ ÓÚÊÇ£¬»ùÀàÖеġ°ÊµÏÖÏà¹ØµÄĞÅÏ¢¡±(information helpful to implementers)¶ÔÓû§À´Ëµ±ä³ÉÁËÏó½Ó¿ÚÒ»ÑùÃô¸ĞµÄ¶«Î÷£¬ËüµÄ´æÔÚµ¼ÖÂÁËʵÏÖ²¿·ÖµÄ²»Îȶ¨£¬Óû§´úÂëµÄÎŞÎ½µÄÖØ±àÒ루µ±ÊµÏÖ²¿·Ö·¢Éú¸Ä±äʱ£©£¬ÒÔ¼°½«Í·ÎļşÎ޽ÚÖÆµØ°üº¬½øÓû§´úÂëÖĞ£¨ÒòΪ¡°ÊµÏÖÏà¹ØµÄĞÅÏ¢¡±ĞèÒªËüÃÇ£©¡£ÓĞʱÕâ±»³ÆÎª¡°´àÈõµÄ»ùÀàÎÊÌ⡱(brittle base class problem)¡£ Ò»¸öºÜÃ÷ÏԵĽâ¾ö·½°¸¾ÍÊÇ£¬ºöÂÔ»ùÀàÖĞÄÇĞ©Ïó½Ó¿ÚÒ»Ñù±»Ê¹Óõġ°ÊµÏÖÏà¹ØµÄĞÅÏ¢¡±¡£»»¾ä»°Ëµ£¬Ê¹Óýӿڣ¬´¿´âµÄ½Ó¿Ú¡£Ò²¾ÍÊÇ˵£¬ÓóéÏó»ùÀàµÄ·½Ê½À´±íʾ½Ó¿Ú£º class Shape { public: //ʹÓÃShapesµÄÓû§µÄ½Ó¿Ú virtual void draw() const = 0; virtual void rotate(int degrees) = 0; virtual Point center() const = 0; // ... // ûÓĞÊı¾İ }; class Circle : public Shape { public: void draw() const; void rotate(int) { } Point center() const { return center; } // ... protected: Point cent; Color col; int radius; // ... }; class Triangle : public Shape { public: void draw() const; void rotate(int); Point center() const; // ... protected: Color col; Point a, b, c; // ... }; ÏÖÔÚ£¬Óû§´úÂëÓëÅÉÉúÀàµÄʵÏÖ²¿·ÖµÄ±ä»¯Ö®¼äµÄ¹ØÏµ±»¸ôÀëÁË¡£ÎÒÔø¾­¼û¹ıÕâÖÖ¼¼ÊõʹµÃ±àÒëµÄʱ¼ä¼õÉÙÁ˼¸¸öÊıÁ¿¼¶¡£ µ«ÊÇ£¬Èç¹ûȷʵ´æÔÚ×ŶÔËùÓĞÅÉÉúÀࣨ»ò½ö½ö¶ÔijЩÅÉÉúÀࣩ¶¼ÓĞÓõĹ«¹²ĞÅϢʱÔõô°ìÄØ£¿¿ÉÒÔ¼òµ¥°ÑÕâĞ©ĞÅÏ¢·â×°³ÉÀ࣬Ȼºó´ÓËüÅÉÉú³öʵÏÖ²¿·ÖµÄÀࣺ class Shape { public: //ʹÓÃShapesµÄÓû§µÄ½Ó¿Ú virtual void draw() const = 0; virtual void rotate(int degrees) = 0; virtual Point center() const = 0; // ... // no data }; struct Common { Color col; // ... }; class Circle : public Shape, protected Common { public: void draw() const; void rotate(int) { } Point center() const { return center; } // ... protected: Point cent; int radius; }; class Triangle : public Shape, protected Common { public: void draw() const; void rotate(int); Point center() const; // ... protected: Point a, b, c; }; Ϊʲôһ¸ö¿ÕÀàµÄ´óĞ¡²»Îª0£¿ ÒªÇå³ş£¬Á½¸ö²»Í¬µÄ¶ÔÏóµÄµØÖ·Ò²ÊDz»Í¬µÄ¡£»ùÓÚͬÑùµÄÀíÓÉ£¬new×ÜÊÇ·µ»ØÖ¸Ïò²»Í¬¶ÔÏóµÄÖ¸Õë¡£ ¿´¿´£º class Empty { }; void f() { Empty a, b; if (&a == &b) cout << "impossible: report error to compiler supplier"; Empty p1 = new Empty; Empty* p2 = new Empty; if (p1 == p2) cout << "impossible: report error to compiler supplier"; } ÓĞÒ»ÌõÓĞȤµÄ¹æÔò£ºÒ»¸ö¿ÕµÄ»ùÀಢ²»Ò»¶¨ÓĞ·Ö¸ô×Ö½Ú¡£ struct X : Empty { int a; // ... }; void f(X* p) { void* p1 = p; void* p2 = &p->a; if (p1 == p2) cout << "nice: good optimizer"; } ÕâÖÖÓÅ»¯ÊÇÔÊĞíµÄ£¬¿ÉÒÔ±»¹ã·ºÊ¹Óá£ËüÔÊĞí³ÌĞòԱʹÓÿÕÀàÒÔ±íÏÖһЩ¼òµ¥µÄ¸ÅÄî¡£ÏÖÔÚÓĞĞ©±àÒëÆ÷ÌṩÕâÖÖ¡°¿Õ»ùÀàÓÅ»¯¡±(empty base class optimization)¡£ ÎÒ±ØĞëÔÚÀàÉùÃ÷´¦¸³ÓèÊı¾İÂ𣿠²»±ØĞë¡£Èç¹ûÒ»¸ö½Ó¿Ú²»ĞèÒªÊı¾İʱ£¬ÎŞĞëÔÚ×÷Ϊ½Ó¿Ú¶¨ÒåµÄÀàÖи³ÓèÊı¾İ¡£´úÖ®ÒÔÔÚÅÉÉúÀàÖиø³öËüÃÇ¡£²Î¼û¡°ÎªÊ²Ã´±àÒëÒª»¨Õâô³¤µÄʱ¼ä£¿¡±¡£ ÓĞʱºò£¬Äã±ØĞëÔÚÒ»¸öÀàÖи³ÓèÊı¾İ¡£¿¼ÂÇһϸ´ÊıÀàµÄÇé¿ö£º template class complex { public: complex() : re(0), im(0) { } complex(Scalar r) : re(r), im(0) { } complex(Scalar r, Scalar i) : re(r), im(i) { } // ... complex& operator+=(const complex& a) { re+=a.re; im+=a.im; return this; } // ... private: Scalar re, im; }; Éè¼ÆÕâÖÖÀàĞ͵ÄÄ¿µÄÊǽ«Ëüµ±×öÒ»¸öÄÚ½¨£¨built-in£©ÀàĞÍÒ»Ñù±»Ê¹Óá£ÔÚÉùÃ÷´¦¸³ÖµÊDZØĞëµÄ£¬ÒÔ±£Ö¤ÈçÏ¿ÉÄÜ£º½¨Á¢ÕæÕıµÄ±¾µØ¶ÔÏó£¨genuinely local objects£©(±ÈÈçÄÇĞ©ÔÚÕ»Öжø²»ÊÇÔÚ¶ÑÖĞ·ÖÅäµÄ¶ÔÏó)£¬»òÕßʹijЩ¼òµ¥²Ù×÷±»Êʵ±µØinline»¯¡£¶ÔÓÚÄÇЩ֧³ÖÄÚ½¨µÄ¸´ºÏÀàĞ͵ÄÓïÑÔÀ´Ëµ£¬Òª»ñµÃËüÃÇÌṩµÄЧÂÊ£¬ÕæÕıµÄ±¾µØ¶ÔÏóºÍinline»¯¶¼ÊDZØÒªµÄ¡£ Ϊʲô³ÉÔ±º¯ÊıĬÈϲ»ÊÇvirtualµÄ£¿ ÒòΪºÜ¶àÀಢ²»ÊDZ»Éè¼Æ×÷Ϊ»ùÀàµÄ¡£ÀıÈ縴ÊıÀà¡£ ¶øÇÒ£¬Ò»¸ö°üº¬ĞéÄ⺯ÊıµÄÀàµÄ¶ÔÏó£¬ÒªÕ¼Óøü¶àµÄ¿Õ¼äÒÔʵÏÖĞéÄ⺯Êıµ÷ÓûúÖÆ¡ª¡ªÍùÍùÊÇÿ¸ö¶ÔÏóÕ¼ÓÃÒ»¸ö×Ö(word)¡£Õâ¸ö¶îÍâµÄ×ÖÊǷdz£¿É¹ÛµÄ£¬¶øÇÒÔÚÉæ¼°ºÍÆäËüÓïÑÔµÄÊı¾İµÄ¼æÈİĞÔʱ£¬¿ÉÄܵ¼ÖÂÂé·³(ÀıÈçC»òFortranÓïÑÔ)¡£ ÒªÁ˽â¸ü¶àµÄÉè¼ÆÔ­Àí£¬Çë²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷£¨The Design and Evolution of C++£©¡£ ΪʲôÎö¹¹º¯ÊıĬÈϲ»ÊÇvirtualµÄ£¿ ÒòΪºÜ¶àÀಢ²»ÊDZ»Éè¼Æ×÷Ϊ»ùÀàµÄ¡£Ö»ÓĞÀàÔÚĞĞΪÉÏÊÇËüµÄÅÉÉúÀàµÄ½Ó¿Úʱ(ÕâĞ©ÅÉÉúÀàÍùÍùÔÚ¶ÑÖĞ·ÖÅ䣬ͨ¹ıÖ¸Õë»òÒıÓÃÀ´·ÃÎÊ)£¬ĞéÄ⺯Êı²ÅÓĞÒâÒå¡£ ÄÇôʲôʱºò²ÅÓ¦¸Ã½«Îö¹¹º¯Êı¶¨ÒåΪĞéÄâÄØ£¿µ±ÀàÖÁÉÙÓµÓĞÒ»¸öĞéÄ⺯Êıʱ¡£ÓµÓĞĞéÄ⺯ÊıÒâζ×ÅÒ»¸öÀàÊÇÅÉÉúÀàµÄ½Ó¿Ú£¬ÔÚÕâÖÖÇé¿öÏ£¬Ò»¸öÅÉÉúÀàµÄ¶ÔÏó¿ÉÄÜͨ¹ıÒ»¸ö»ùÀàÖ¸ÕëÀ´Ïú»Ù¡£ÀıÈ磺 class Base { // ... virtual ~Base(); }; class Derived : public Base { // ... ~Derived(); }; void f() { Base p = new Derived; delete p; // ĞéÄâÎö¹¹º¯Êı±£Ö¤~Derivedº¯Êı±»µ÷Óà } Èç¹û»ùÀàµÄÎö¹¹º¯Êı²»ÊÇĞéÄâµÄ£¬ÄÇôÅÉÉúÀàµÄÎö¹¹º¯Êı½«²»»á±»µ÷Ó᪡ªÕâ¿ÉÄܲúÉúÔã¸âµÄ½á¹û£¬ÀıÈçÅÉÉúÀàµÄ×ÊÔ´²»»á±»ÊÍ·Å¡£ Ϊʲô²»ÄÜÓĞĞéÄâ¹¹Ô캯Êı£¿ ĞéÄâµ÷ÓÃÊÇÒ»ÖÖÄܹ»ÔÚ¸ø¶¨ĞÅÏ¢²»ÍêÈ«(given partial information)µÄÇé¿öϹ¤×÷µÄ»úÖÆ¡£ÌØ±ğµØ£¬ĞéÄâÔÊĞíÎÒÃǵ÷ÓÃij¸öº¯Êı£¬¶ÔÓÚÕâ¸öº¯Êı£¬½ö½öÖªµÀËüµÄ½Ó¿Ú£¬¶ø²»ÖªµÀ¾ßÌåµÄ¶ÔÏóÀàĞÍ¡£µ«ÊÇÒª½¨Á¢Ò»¸ö¶ÔÏó£¬Äã±ØĞëÓµÓĞÍêÈ«µÄĞÅÏ¢¡£ÌØ±ğµØ£¬ÄãĞèÒªÖªµÀÒª½¨Á¢µÄ¶ÔÏóµÄ¾ßÌåÀàĞÍ¡£Òò´Ë£¬¶Ô¹¹Ô캯ÊıµÄµ÷Óò»¿ÉÄÜÊÇĞéÄâµÄ¡£ µ±ÒªÇó½¨Á¢Ò»¸ö¶ÔÏóʱ£¬Ò»ÖÖ¼ä½ÓµÄ¼¼Êõ³£³£±»µ±×÷¡°ĞéÄâ¹¹Ô캯Êı¡±À´Ê¹Óá£ÓйØÀı×Ó£¬Çë²Î¼û¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·µÚÈı°æ15.6.2.½Ú¡£ ÏÂÃæÕâ¸öÀı×ÓչʾһÖÖ»úÖÆ£ºÈçºÎʹÓÃÒ»¸ö³éÏóÀàÀ´½¨Á¢Ò»¸öÊʵ±ÀàĞ͵ĶÔÏó¡£ struct F { // ¶ÔÏó½¨Á¢º¯ÊıµÄ½Ó¿Ú virtual A* make_an_A() const = 0; virtual B* make_a_B() const = 0; }; void user(const F& fac) { A* p = fac.make_an_A(); // ½«A×÷ΪºÏÊʵÄÀàĞÍ B* q = fac.make_a_B(); // ½«B×÷ΪºÏÊʵÄÀàĞÍ // ... } struct FX : F { A* make_an_A() const { return new AX(); } // AXÊÇAµÄÅÉÉú B* make_a_B() const { return new BX(); } // AXÊÇBµÄÅÉÉú }; struct FY : F { A* make_an_A() const { return new AY(); } // AYÊÇAµÄÅÉÉú B* make_a_B() const { return new BY(); } // BYÊÇBµÄÅÉÉú }; int main() { user(FX()); // ´ËÓû§½¨Á¢AXÓëBX user(FY()); // ´ËÓû§½¨Á¢AYÓëBY // ... } ÕâÊÇËùνµÄ¡°¹¤³§Ä£Ê½¡±(the factory pattern)µÄÒ»¸ö±äĞΡ£¹Ø¼üÔÚÓÚ£¬userº¯ÊıÓëAX»òAYÕâÑùµÄÀàµÄĞÅÏ¢±»ÍêÈ«·ÖÀ뿪À´ÁË¡£ ÎªÊ²Ã´ÖØÔØÔڼ̳ĞÀàÖв»¹¤×÷£¿ Õâ¸öÎÊÌ⣨·Ç³£³£¼û£©ÍùÍù³öÏÖÓÚÕâÑùµÄÀı×ÓÖĞ£º #include using namespace std; class B { public: int f(int i) { cout << "f(int): "; return i+1; } // ... }; class D : public B { public: double f(double d) { cout << "f(double): "; return d+1.3; } // ... }; int main() { D* pd = new D; cout << pd->f(2) << '\n'; cout << pd->f(2.3) << '\n'; } ËüÊä³öµÄ½á¹ûÊÇ£º f(double): 3.3 f(double): 3.6 ¶ø²»ÊÇÏóÓĞĞ©È˲ÂÏëµÄÄÇÑù£º f(int): 3 f(double): 3.6 »»¾ä»°Ëµ£¬ÔÚBºÍDÖ®¼ä²¢Ã»ÓĞ·¢ÉúÖØÔØµÄ½âÎö¡£±àÒëÆ÷ÔÚDµÄÇøÓòÄÚѰÕÒ£¬ÕÒµ½ÁËÒ»¸öº¯Êıdouble f(double)£¬²¢Ö´ĞĞÁËËü¡£ËüÓÀÔ¶²»»áÉæ¼°£¨±»·â×°µÄ£©BµÄÇøÓò¡£ÔÚC++ÖĞ£¬Ã»ÓĞ¿çÔ½ÇøÓòµÄÖØÔØ¡ª¡ª¶ÔÓÚÕâÌõ¹æÔò£¬¼Ì³ĞÀàÒ²²»ÀıÍâ¡£¸ü¶àµÄϸ½Ú£¬²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷ºÍ¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·¡£ µ«ÊÇ£¬Èç¹ûÎÒĞèÒªÔÚ»ùÀàºÍ¼Ì³ĞÀàÖ®¼ä½¨Á¢Ò»×éÖØÔØµÄf()º¯ÊıÄØ£¿ºÜ¼òµ¥£¬Ê¹ÓÃusingÉùÃ÷£º class D : public B { public: using B::f; // make every f from B available double f(double d) { cout << "f(double): "; return d+1.3; } // ... }; ½øĞĞÕâ¸öĞŞ¸ÄÖ®ºó£¬Êä³ö½á¹û½«ÊÇ£º f(int): 3 f(double): 3.6 ÕâÑù£¬ÔÚBµÄf()ºÍDµÄf()Ö®¼ä£¬ÖØÔØÈ·ÊµÊµÏÖÁË£¬²¢ÇÒÑ¡ÔñÁËÒ»¸ö×îºÏÊʵÄf()½øĞе÷ÓᣠÎÒÄܹ»ÔÚ¹¹Ô캯ÊıÖе÷ÓÃÒ»¸öĞéÄ⺯ÊıÂ𣿠¿ÉÒÔ£¬µ«ÊÇҪСĞÄ¡£Ëü¿ÉÄܲ»ÏóÄãÆÚÍûµÄÄÇÑù¹¤×÷¡£ÔÚ¹¹Ô캯ÊıÖĞ£¬ĞéÄâµ÷ÓûúÖÆ²»Æğ×÷Óã¬ÒòΪ¼Ì³ĞÀàµÄÖØÔØ»¹Ã»ÓĞ·¢Éú¡£¶ÔÏóÏÈ´Ó»ùÀà±»´´½¨£¬¡°»ùÀàÏÈÓڼ̳ĞÀà(base before derived)¡±¡£ ¿´¿´Õâ¸ö£º #include #include using namespace std; class B { public: B(const string& ss) { cout << "B constructor\n"; f(ss); } virtual void f(const string&) { cout << "B::f\n";} }; class D : public B { public: D(const string & ss) :B(ss) { cout << "D constructor\n";} void f(const string& ss) { cout << "D::f\n"; s = ss; } private: string s; }; int main() { D d("Hello"); } ³ÌĞò±àÒëÒÔºó»áÊä³ö£º B constructor B::f D constructor ×¢Òâ²»ÊÇD::f¡£ÉèÏëһϣ¬Èç¹û³öÓÚ²»Í¬µÄ¹æÔò£¬B::B()¿ÉÒÔµ÷ÓÃD::f()µÄ»°£¬»á²úÉúʲôÑùµÄºó¹û£ºÒòΪ¹¹Ô캯ÊıD::D()»¹Ã»ÓĞÔËĞĞ£¬D::f()½«»áÊÔͼ½«Ò»¸ö»¹Ã»Óгõʼ»¯µÄ×Ö·û´®s¸³ÓèËüµÄ²ÎÊı¡£½á¹ûºÜ¿ÉÄÜÊǵ¼ÖÂÁ¢¼´±ÀÀ£¡£ Îö¹¹º¯ÊıÔÚ¡°¼Ì³ĞÀàÏÈÓÚ»ùÀࡱµÄ»úÖÆÏÂÔËĞĞ£¬Òò´ËĞéÄâ»úÖÆµÄĞĞΪºÍ¹¹Ô캯ÊıÒ»Ñù£ºÖ»Óб¾µØ¶¨Òå(local definitions)±»Ê¹Ó᪡ª²»»áµ÷ÓÃĞéÄ⺯Êı£¬ÒÔÃâ´¥¼°¶ÔÏóÖеģ¨ÏÖÔÚÒѾ­±»Ïú»ÙµÄ£©¼Ì³ĞÀàµÄ²¿·Ö¡£ ¸ü¶àµÄϸ½Ú£¬²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷13.2.4.2ºÍ¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·15.4.3¡£ ÓĞÈ˰µÊ¾£¬ÕâÖ»ÊÇÒ»ÌõʵÏÖʱµÄÈËÎªÖÆÔìµÄ¹æÔò¡£²»ÊÇÕâÑùµÄ¡£ÊÂʵÉÏ£¬ÒªÊµÏÖÕâÖÖ²»°²È«µÄ·½·¨µ¹ÊǷdz£ÈİÒ׵ģºÔÚ¹¹Ô캯ÊıÖĞÖ±½Óµ÷ÓÃĞéÄ⺯Êı£¬¾ÍÏóµ÷ÓÃÆäËüº¯ÊıÒ»Ñù¡£µ«ÊÇ£¬ÕâÑù¾ÍÒâζ×Å£¬ÈκÎĞéÄ⺯Êı¶¼ÎŞ·¨±àĞ´ÁË£¬ÒòΪËüÃÇĞèÒªÒÀ¿¿»ùÀàµÄ¹Ì¶¨µÄ´´½¨(invariants established by base classes)¡£Õ⽫»áµ¼ÖÂһƬ»ìÂÒ¡£ ÓĞûÓĞ¡°Ö¸¶¨Î»ÖÃɾ³ı¡±(placement delete)£¿ ûÓĞ£¬²»¹ıÈç¹ûÄãĞèÒªµÄ»°£¬¿ÉÒÔ×Ô¼ºĞ´Ò»¸ö¡£ ¿´¿´Õâ¸öÖ¸¶¨Î»Öô´½¨(placement new)£¬Ëü½«¶ÔÏó·Å½øÁËһϵÁĞArenaÖĞ£» class Arena { public: void* allocate(size_t); void deallocate(void*); // ... }; void* operator new(size_t sz, Arena& a) { return a.allocate(sz); } Arena a1(some arguments); Arena a2(some arguments); ÕâÑùʵÏÖÁËÖ®ºó£¬ÎÒÃǾͿÉÒÔÕâôд£º X* p1 = new(a1) X; Y* p2 = new(a1) Y; Z* p3 = new(a2) Z; // ... µ«ÊÇ£¬ÒÔºóÔõÑùÕıÈ·µØÏú»ÙÕâĞ©¶ÔÏóÄØ£¿Ã»ÓжÔÓ¦ÓÚÕâÖÖ¡°placement new¡±µÄÄÚ½¨µÄ¡°placement delete¡±£¬Ô­ÒòÊÇ£¬Ã»ÓĞÒ»ÖÖͨÓõķ½·¨¿ÉÒÔ±£Ö¤Ëü±»ÕıÈ·µØÊ¹Óá£ÔÚC++µÄÀàĞÍϵͳÖĞ£¬Ã»ÓĞʲô¶«Î÷¿ÉÒÔÈÃÎÒÃÇÈ·ÈÏ£¬p1Ò»¶¨Ö¸ÏòÒ»¸öÓÉArenaÀàĞ͵Äa1·ÖÅɵĶÔÏó¡£p1¿ÉÄÜÖ¸ÏòÈκζ«Î÷·ÖÅɵÄÈκÎÒ»¿éµØ·½¡£ È»¶ø£¬ÓĞʱºò³ÌĞòÔ±ÊÇÖªµÀµÄ£¬ËùÒÔÕâÊÇÒ»ÖÖ·½·¨£º template void destroy(T* p, Arena& a) { if (p) { p->~T(); // explicit destructor call a.deallocate(p); } } ÏÖÔÚÎÒÃÇ¿ÉÒÔÕâôд£º destroy(p1,a1); destroy(p2,a2); destroy(p3,a3); Èç¹ûArenaά»¤ÁËËü±£´æ×ŵĶÔÏóµÄÏßË÷£¬ÄãÉõÖÁ¿ÉÒÔ×Ô¼ºĞ´Ò»¸öÎö¹¹º¯Êı£¬ÒÔ±ÜÃâËü·¢Éú´íÎó¡£ ÕâÒ²ÊÇ¿ÉÄܵģº¶¨ÒåÒ»¶ÔÏ໥ƥÅäµÄ²Ù×÷·ûnew()ºÍdelete()£¬ÒÔά»¤¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·15.6ÖеÄÀà¼Ì³ĞÌåϵ¡£²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷10.4ºÍ¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·19.4.5¡£ ÎÒÄÜ·ÀÖ¹±ğÈ˼̳ĞÎÒ×Ô¼ºµÄÀàÂ𣿠¿ÉÒÔ£¬µ«ÄãΪʲôҪÄÇô×öÄØ£¿ÕâÊÇÁ½¸ö³£¼ûµÄ»Ø´ğ£º ЧÂÊ£º±ÜÃâÎҵĺ¯Êı±»ĞéÄâµ÷Óà °²È«£º±£Ö¤ÎÒµÄÀ಻±»ÓÃ×÷Ò»¸ö»ùÀࣨÀıÈ磬±£Ö¤ÎÒÄܹ»¸´ÖƶÔÏó¶ø²»Óõ£ĞijöÊ£© ¸ù¾İÎҵľ­Ñ飬ЧÂÊÔ­ÒòÍùÍùÊDz»±ØÒªµÄµ£ĞÄ¡£ÔÚC++ÖĞ£¬ĞéÄ⺯Êıµ÷ÓÃÊÇÈç´ËÖ®¿ì£¬ÒÔÖÂÓÚËüÃÇÔÚÒ»¸ö°üº¬ĞéÄ⺯ÊıµÄÀàÖб»Êµ¼ÊʹÓÃʱ£¬Ïà±ÈÆÕͨµÄº¯Êıµ÷Ó㬸ù±¾²»»á²úÉúÖµµÃ¿¼ÂǵÄÔËĞĞÆÚ¿ªÖ§¡£×¢Ò⣬½ö½öͨ¹ıÖ¸Õë»òÒıÓÃʱ£¬²Å»áʹÓÃĞéÄâµ÷ÓûúÖÆ¡£µ±Ö±½Óͨ¹ı¶ÔÏóÃû×Öµ÷ÓÃÒ»¸öº¯Êıʱ£¬ĞéÄ⺯Êıµ÷ÓõĿªÖ§¿ÉÒÔ±»ºÜÈİÒ×µØÓÅ»¯µô¡£ Èç¹ûȷʵÓĞÕæÕıµÄĞèÒª£¬Òª½«Ò»¸öÀà·â±ÕÆğÀ´ÒÔ·ÀÖ¹ĞéÄâµ÷Óã¬ÄÇô¿ÉÄÜÊ×ÏÈÓ¦¸ÃÎÊÎÊΪʲôËüÃÇÊÇĞéÄâµÄ¡£ÎÒ¿´¼û¹ıһЩÀı×Ó£¬ÄÇĞ©ĞÔÄܱíÏÖ²»¼ÑµÄº¯Êı±»ÉèÖÃΪĞéÄ⣬ûÓĞÆäËûÔ­Òò£¬½ö½öÊÇÒòΪ¡°ÎÒÃÇϰ¹ßÕâô¸É¡±¡£ Õâ¸öÎÊÌâµÄÁíÒ»¸ö²¿·Ö£¬ÓÉÓÚÂß¼­ÉϵÄÔ­ÒòÈçºÎ·ÀÖ¹Àà±»¼Ì³Ğ£¬ÓĞÒ»¸ö½â¾ö·½°¸¡£²»ĞÒµÄÊÇ£¬Õâ¸ö·½°¸²¢²»ÍêÃÀ¡£Ëü½¨Á¢ÔÚÕâÑùÒ»¸öÊÂʵµÄ»ù´¡Ö®ÉÏ£¬ÄǾÍÊÇ£º´ó¶àÊıµÄ¼Ì³ĞÀà±ØĞ뽨Á¢Ò»¸öĞéÄâµÄ»ùÀà¡£ÕâÊÇÒ»¸öÀı×Ó£º class Usable; class Usable_lock { friend class Usable; private: Usable_lock() {} Usable_lock(const Usable_lock&) {} }; class Usable : public virtual Usable_lock { // ... public: Usable(); Usable(char*); // ... }; Usable a; class DD : public Usable { }; DD dd; // ´íÎó: DD::DD() ²»ÄÜ·ÃÎÊ // Usable_lock::Usable_lock()ÊÇÒ»¸ö˽ÓгÉÔ± (À´×Ô¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷11.4.3) Ϊʲô²»ÄÜΪģ°å²ÎÊı¶¨ÒåÔ¼Êø£¨constraints£©£¿ ¿ÉÒԵ쬶øÇÒ·½·¨·Ç³£¼òµ¥ºÍͨÓᣠ¿´¿´Õâ¸ö£º template void draw_all(Container& c) { for_each(c.begin(),c.end(),mem_fun(&Shape::draw)); } Èç¹û³öÏÖÀàĞÍ´íÎ󣬿ÉÄÜÊÇ·¢ÉúÔÚÏ൱¸´ÔÓµÄfor_each()µ÷ÓÃʱ¡£ÀıÈ磬Èç¹ûÈİÆ÷µÄÔªËØÀàĞÍÊÇint£¬ÎÒÃǽ«µÃµ½Ò»¸öºÍfor_each()Ïà¹ØµÄº¬ÒåÄ£ºıµÄ´íÎó(ÒòΪ²»Äܹ»¶Ô¶ÔÒ»¸öintÖµµ÷ÓÃShape::drawµÄ·½·¨)¡£ ΪÁËÌáǰ²¶×½Õâ¸ö´íÎó£¬ÎÒÕâÑùĞ´£º template void draw_all(Container& c) { Shape* p = c.front(); // accept only containers of Shapes for_each(c.begin(),c.end(),mem_fun(&Shape::draw)); } ¶ÔÓÚÏÖÔڵĴó¶àÊı±àÒëÆ÷£¬Öмä±äÁ¿pµÄ³õʼ»¯½«»á´¥·¢Ò»¸öÒ×ÓÚÁ˽âµÄ´íÎó¡£Õâ¸öÇÏÃÅÔںܶàÓïÑÔÖж¼ÊÇͨÓõ쬶øÇÒÔÚËùÓеıê×¼´´½¨Öж¼±ØĞëÕâÑù×ö¡£ÔÚ³ÉÆ·µÄ´úÂëÖĞ£¬ÎÒÒ²Ğí¿ÉÒÔÕâÑùĞ´£º template void draw_all(Container& c) { typedef typename Container::value_type T; Can_copy<T,Shape>(); // accept containers of only Shapes for_each(c.begin(),c.end(),mem_fun(&Shape::draw)); } ÕâÑù¾ÍºÜÇå³şÁË£¬ÎÒÔÚ½¨Á¢Ò»¸ö¶ÏÑÔ(assertion)¡£Can_copyÄ£°å¿ÉÒÔÕâÑù¶¨Ò壺 template<class T1, class T2> struct Can_copy { static void constraints(T1 a, T2 b) { T2 c = a; b = a; } Can_copy() { void(p)(T1,T2) = constraints; } }; Can_copy(ÔÚÔËĞĞʱ)¼ì²éT1ÊÇ·ñ¿ÉÒÔ±»¸³Öµ¸øT2¡£Can_copy<T,Shape>¼ì²éTÊÇ·ñÊÇShapeÀàĞÍ£¬»òÕßÊÇÒ»¸öÖ¸ÏòÓÉShapeÀ๫¹²¼Ì³Ğ¶øÀ´µÄÀàµÄ¶ÔÏóµÄÖ¸Õ룬»òÕßÊDZ»Óû§×ª»»µ½ShapeÀàĞ͵Äij¸öÀàĞÍ¡£×¢ÒâÕâ¸ö¶¨Òå±»¾«¼òµ½ÁË×îĞ¡£º Ò»ĞĞÃüÃûÒª¼ì²éµÄÔ¼Êø£¬ºÍÒª¼ì²éµÄÀàĞÍ Ò»ĞĞÁгöÖ¸¶¨µÄÒª¼ì²éµÄÔ¼Êø(constraints()º¯Êı) Ò»ĞĞÌṩ´¥·¢¼ì²éµÄ·½·¨(ͨ¹ı¹¹Ô캯Êı) ×¢ÒâÕâ¸ö¶¨ÒåÓĞÏ൱ºÏÀíµÄĞÔÖÊ£º Äã¿ÉÒÔ±í´ïÒ»¸öÔ¼Êø£¬¶ø²»ÓÃÉùÃ÷»ò¸´ÖƱäÁ¿£¬Òò´ËÔ¼ÊøµÄ±àĞ´Õß¿ÉÒÔÓò»×ÅÈ¥ÉèÏë±äÁ¿ÈçºÎ±»³õʼ»¯£¬¶ÔÏóÊÇ·ñÄܹ»±»¸´ÖÆ£¬±»Ïú»Ù£¬ÒÔ¼°ÖîÈç´ËÀàµÄÊÂÇé¡£(µ±È»£¬Ô¼ÊøÒª¼ì²éÕâĞ©ÊôĞÔµÄÇé¿öʱÀıÍâ¡£) ʹÓÃÏÖÔڵıàÒëÆ÷£¬²»ĞèÒªÎªÔ¼Êø²úÉú´úÂë ¶¨ÒåºÍʹÓÃÔ¼Êø£¬²»ĞèҪʹÓÃºê µ±Ô¼ÊøÊ§°Üʱ£¬±àÒëÆ÷»á¸ø³ö¿É½ÓÊܵĴíÎóĞÅÏ¢£¬°üÀ¨¡°constraints¡±Õâ¸ö´Ê£¨¸øÓû§Ò»¸öÏßË÷£©£¬Ô¼ÊøµÄÃû×Ö£¬ÒÔ¼°µ¼ÖÂÔ¼ÊøÊ§°ÜµÄÏêϸ´íÎó£¨ÀıÈç¡°ÎŞ·¨ÓÃdouble³õʼ»¯Shape*¡±£©¡£ ÄÇô£¬ÔÚC++ÓïÑÔÖĞ£¬ÓĞûÓĞÀàËÆÓÚCan_copy¡ª¡ª»òÕ߸üºÃ¡ª¡ªµÄ¶«Î÷ÄØ£¿ÔÚ¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷ÖĞ£¬¶ÔÓÚÔÚC++ÖĞʵÏÖÕâÖÖͨÓÃÔ¼ÊøµÄÀ§ÄѽøĞĞÁË·ÖÎö¡£´ÓÄÇÒÔÀ´£¬³öÏÖÁ˺ܶ෽·¨£¬À´ÈÃÔ¼ÊøÀà±äµÃ¸ü¼ÓÈİÒ×±àĞ´£¬Í¬Ê±ÈÔÈ»ÄÜ´¥·¢Á¼ºÃµÄ´íÎóĞÅÏ¢¡£ÀıÈ磬ÎÒĞÅÈÎÎÒÔÚCan_copyÖĞʹÓõĺ¯ÊıÖ¸ÕëµÄ·½Ê½£¬ËüÔ´×ÔAlex StepanovºÍJeremy Siek¡£ÎÒ²¢²»ÈÏΪCan_copy()ÒѾ­¿ÉÒÔ±ê×¼»¯ÁË¡ª¡ªËüĞèÒª¸ü¶àµÄʹÓá£Í¬Ñù£¬ÔÚC++ÉçÇøÖĞ£¬¸÷ÖÖ²»Í¬µÄÔ¼Êø·½Ê½±»Ê¹Ó㻵½µ×ÊÇÄÄÒ»ÖÖÔ¼ÊøÄ£°åÔڹ㷺µÄʹÓÃÖб»Ö¤Ã÷ÊÇ×îÓĞЧµÄ£¬»¹Ã»ÓĞ´ï³ÉÒ»ÖµÄÒâ¼û¡£ µ«ÊÇ£¬ÕâÖÖ·½Ê½·Ç³£ÆÕ±é£¬±ÈÓïÑÔÌṩµÄרÃÅÓÃÓÚÔ¼Êø¼ì²éµÄ»úÖÆ¸ü¼ÓÆÕ±é¡£ÎŞÂÛÈçºÎ£¬µ±ÎÒÃDZàĞ´Ò»¸öÄ£°åʱ£¬ÎÒÃÇÓµÓĞÁËC++ÌṩµÄ×î·á¸»µÄ±í´ïÁ¦Á¿¡£¿´¿´Õâ¸ö£º template<class T, class B> struct Derived_from { static void constraints(T* p) { B* pb = p; } Derived_from() { void(p)(T) = constraints; } }; template<class T1, class T2> struct Can_copy { static void constraints(T1 a, T2 b) { T2 c = a; b = a; } Can_copy() { void(p)(T1,T2) = constraints; } }; template<class T1, class T2 = T1> struct Can_compare { static void constraints(T1 a, T2 b) { a==b; a!=b; a<b; } Can_compare() { void(p)(T1,T2) = constraints; } }; template<class T1, class T2, class T3 = T1> struct Can_multiply { static void constraints(T1 a, T2 b, T3 c) { c = ab; } Can_multiply() { void(p)(T1,T2,T3) = constraints; } }; struct B { }; struct D : B { }; struct DD : D { }; struct X { }; int main() { Derived_from<D,B>(); Derived_from<DD,B>(); Derived_from<X,B>(); Derived_from<int,B>(); Derived_from<X,int>(); Can_compare<int,float>(); Can_compare<X,B>(); Can_multiply<int,float>(); Can_multiply<int,float,double>(); Can_multiply<B,X>(); Can_copy<D,B>(); Can_copy<D,B*>(); Can_copy<int,B*>(); } // µäĞ͵ġ°ÔªËرØĞë¼Ì³Ğ×ÔMybase*¡±Ô¼Êø: template class Container : Derived_from<T,Mybase> { // ... }; ÊÂʵÉÏ£¬Derived_from²¢²»¼ì²éÀ´Ô´£¨derivation£©£¬¶ø½ö½ö¼ì²éת»»£¨conversion£©£¬²»¹ıÕâÍùÍùÊÇÒ»¸ö¸üºÃµÄÔ¼Êø¡£ÎªÔ¼ÊøÏëÒ»¸öºÃÃû×ÖÊǺÜÄѵġ£ ¼ÈÈ»ÒѾ­ÓĞÁËÓÅĞãµÄqsort()º¯Êı£¬ÎªÊ²Ã´»¹ĞèÒªÒ»¸ösort()£¿ ¶ÔÓÚ³õѧÕßÀ´Ëµ£¬ qsort(array,asize,sizeof(elem),elem_compare); ¿´ÉÏȥ̫¹Å¹ÖÁË£¬¶øÇÒ±ÈÕâ¸ö¸üÄÑÀí½â£º sort(vec.begin(),vec.end()); ¶ÔÓÚר¼ÒÀ´Ëµ£¬ÔÚÔªËØÓë±È½Ï·½Ê½£¨comparison criteria£©¶¼ÏàͬµÄÇé¿öÏ£¬sort()±Èqsort()¸ü¿ì£¬ÕâÊǺÜÖØÒªµÄ¡£¶øÇÒ£¬qsort()ÊÇͨÓõģ¬ËùÒÔËü¿ÉÒÔÓÃÓÚ²»Í¬ÈİÆ÷ÀàĞÍ¡¢ÔªËØÀàĞÍ¡¢±È½Ï·½Ê½µÄÈÎÒâÓĞÒâÒåµÄ×éºÏ¡£¾ÙÀıÀ´Ëµ£º struct Record { string name; // ... }; struct name_compare { // ʹÓÃ"name"×÷Ϊ¼ü±È½ÏRecord bool operator()(const Record& a, const Record& b) const { return a.name<b.name; } }; void f(vector& vs) { sort(vs.begin(), vs.end(), name_compare()); // ... } ¶øÇÒ£¬ºÜ¶àÈËĞÀÉÍsort()ÊÇÒòΪËüÊÇÀàĞͰ²È«µÄ£¬Ê¹ÓÃËü²»ĞèÒª½øĞĞÔìĞÍ£¨cast£©£¬Ã»ÓĞÈ˱ØĞëȥΪ»ù±¾ÀàĞÍĞ´Ò»¸öcompare()º¯Êı¡£ ¸ü¶àµÄϸ½Ú£¬²Î¼ûÎÒµÄÎÄÕ¡¶½«±ê×¼C++×÷ΪһÖÖеÄÓïÑÔÀ´Ñ§Ï°¡·£¨Learning C++ as a New language£©£¬¿ÉÒÔ´ÓÎÒµÄÎÄÕÂÁбíÖĞÕÒµ½¡£ sort()ʤ¹ıqsort()µÄÖ÷ÒªÔ­ÒòÊÇ£¬±È½Ï²Ù×÷ÔÚÄÚÁª£¨inlines£©ÉÏ×öµÃ¸üºÃ¡£ ʲôÊǺ¯Êı¶ÔÏó£¨function object£©£¿ ¹ËÃû˼Ò壬¾ÍÊÇÔÚijÖÖ·½Ê½ÉϱíÏÖµÃÏóÒ»¸öº¯ÊıµÄ¶ÔÏó¡£µäĞ͵أ¬ËüÊÇÖ¸Ò»¸öÀàµÄʵÀı£¬Õâ¸öÀඨÒåÁËÓ¦ÓòÙ×÷·ûoperator()¡£ º¯Êı¶ÔÏóÊDZȺ¯Êı¸ü¼ÓͨÓõĸÅÄÒòΪº¯Êı¶ÔÏó¿ÉÒÔ¶¨Òå¿çÔ½¶à´Îµ÷ÓõĿɳ־õIJ¿·Ö£¨ÀàËÆ¾²Ì¬¾Ö²¿±äÁ¿£©£¬Í¬Ê±ÓÖÄܹ»´Ó¶ÔÏóµÄÍâÃæ½øĞгõʼ»¯ºÍ¼ì²é£¨ºÍ¾²Ì¬¾Ö²¿±äÁ¿²»Í¬£©¡£ÀıÈ磺 class Sum { int val; public: Sum(int i) :val(i) { } operator int() const { return val; } // È¡µÃÖµ int operator()(int i) { return val+=i; } // Ó¦Óà }; void f(vector v) { Sum s = 0; // initial value 0 s = for_each(v.begin(), v.end(), s); // ÇóËùÓĞÔªËØµÄºÍ cout << "the sum is " << s << "\n"; //»òÕßÉõÖÁ£º cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n"; } ×¢ÒâÒ»¸öÓµÓĞÓ¦ÓòÙ×÷·ûµÄº¯Êı¶ÔÏó¿ÉÒÔ±»ÍêÃÀµØÄÚÁª»¯£¨inline£©£¬ÒòΪËüûÓĞÉæ¼°µ½ÈκÎÖ¸Õ룬ºóÕß¿ÉÄܵ¼Ö¾ܾøÓÅ»¯¡£ÓëÖ®ĞγɶԱȵÄÊÇ£¬ÏÖÓеÄÓÅ»¯Æ÷¼¸ºõ²»ÄÜ£¨»òÕßÍêÈ«²»ÄÜ£¿£©½«Ò»¸öͨ¹ıº¯ÊıÖ¸ÕëµÄµ÷ÓÃÄÚÁª»¯¡£ ÔÚ±ê×¼¿âÖĞ£¬º¯Êı¶ÔÏ󱻹㷺µØÊ¹ÓÃÒÔ»ñµÃµ¯ĞÔ¡£ ÎÒÓ¦¸ÃÈçºÎ¶Ô¸¶ÄÚ´æĞ¹Â©£¿ Ğ´³öÄÇĞ©²»»áµ¼ÖÂÈκÎÄÚ´æĞ¹Â©µÄ´úÂë¡£ºÜÃ÷ÏÔ£¬µ±ÄãµÄ´úÂëÖе½´¦³äÂúÁËnew ²Ù×÷¡¢delete²Ù×÷ºÍÖ¸ÕëÔËËãµÄ»°£¬Ä㽫»áÔÚij¸öµØ·½¸ãÔÎÁËÍ·£¬µ¼ÖÂÄÚ´æĞ¹Â©£¬Ö¸ÕëÒıÓôíÎó£¬ÒÔ¼°ÖîÈç´ËÀàµÄÎÊÌâ¡£ÕâºÍÄãÈçºÎĞ¡ĞĵضԴıÄÚ´æ·ÖÅ乤×÷ÆäʵÍêȫûÓйØÏµ£º´úÂëµÄ¸´ÔÓĞÔ×îÖÕ×ÜÊǻᳬ¹ıÄãÄܹ»¸¶³öµÄʱ¼äºÍŬÁ¦¡£ÓÚÊÇËæºó²úÉúÁËһЩ³É¹¦µÄ¼¼ÇÉ£¬ËüÃÇÒÀÀµÓÚ½«ÄÚ´æ·ÖÅ䣨allocations£©ÓëÖØĞ·ÖÅ䣨deallocation£©¹¤×÷Òş²ØÔÚÒ×ÓÚ¹ÜÀíµÄÀàĞÍÖ®ºó¡£±ê×¼ÈİÆ÷£¨standard containers£©ÊÇÒ»¸öÓÅĞãµÄÀı×Ó¡£ËüÃDz»ÊÇͨ¹ıÄã¶øÊÇ×Ô¼ºÎªÔªËعÜÀíÄڴ棬´Ó¶ø±ÜÃâÁ˲úÉúÔã¸âµÄ½á¹û¡£ÏëÏóһϣ¬Ã»ÓĞstringºÍvectorµÄ°ïÖú£¬Ğ´³öÕâ¸ö£º #include #include #include #include using namespace std; int main() // small program messing around with strings { cout << "enter some whitespace-separated words:\n"; vector v; string s; while (cin>>s) v.push_back(s); sort(v.begin(),v.end()); string cat; typedef vector::const_iterator Iter; for (Iter p = v.begin(); p!=v.end(); ++p) cat += p+"+"; cout << cat << '\n'; } ÄãÓжàÉÙ»ú»áÔÚµÚÒ»´Î¾ÍµÃµ½ÕıÈ·µÄ½á¹û£¿ÄãÓÖÔõô֪µÀÄãûÓе¼ÖÂÄÚ´æĞ¹Â©ÄØ£¿ ×¢Ò⣬ûÓгöÏÖÏÔʽµÄÄÚ´æ¹ÜÀí£¬ºê£¬ÔìĞÍ£¬Òç³ö¼ì²é£¬ÏÔʽµÄ³¤¶ÈÏŞÖÆ£¬ÒÔ¼°Ö¸Õ롣ͨ¹ıʹÓú¯Êı¶ÔÏóºÍ±ê×¼Ëã·¨£¨standard algorithm£©£¬ÎÒ¿ÉÒÔ±ÜÃâʹÓÃÖ¸Õ롪¡ªÀıÈçʹÓõü´ú×Ó£¨iterator£©£¬²»¹ı¶ÔÓÚÒ»¸öÕâôСµÄ³ÌĞòÀ´ËµÓеãĞ¡Ìâ´ó×÷ÁË¡£ ÕâĞ©¼¼Çɲ¢²»ÍêÃÀ£¬ÒªÏµÍ³»¯µØÊ¹ÓÃËüÃÇÒ²²¢²»×ÜÊÇÄÇôÈİÒס£µ«ÊÇ£¬Ó¦ÓÃËüÃDzúÉúÁ˾ªÈ˵IJîÒ죬¶øÇÒͨ¹ı¼õÉÙÏÔʽµÄÄÚ´æ·ÖÅäÓëÖØĞ·ÖÅäµÄ´ÎÊı£¬ÄãÉõÖÁ¿ÉÒÔʹÓàϵÄÀı×Ó¸ü¼ÓÈİÒ×±»¸ú×Ù¡£ÔçÔÚ1981Ä꣬ÎÒ¾ÍÖ¸³ö£¬Í¨¹ı½«ÎÒ±ØĞëÏÔʽµØ¸ú×ٵĶÔÏóµÄÊıÁ¿´Ó¼¸Íò¸ö¼õÉÙµ½¼¸´ò£¬ÎªÁËʹ³ÌĞòÕıÈ·ÔËĞжø¸¶³öµÄŬÁ¦´Ó¿ÉŵĿ๤£¬±ä³ÉÁËÓ¦¸¶Ò»Ğ©¿É¹ÜÀíµÄ¶ÔÏó£¬ÉõÖÁ¸ü¼Ó¼òµ¥ÁË¡£ Èç¹ûÄãµÄ³ÌĞò»¹Ã»Óаüº¬½«ÏÔʽÄÚ´æ¹ÜÀí¼õÉÙµ½×îĞ¡ÏŞ¶ÈµÄ¿â£¬ÄÇôҪÈÃÄã³ÌĞòÍê³ÉºÍÕıÈ·ÔËĞеϰ£¬×î¿ìµÄ;¾¶Ò²Ğí¾ÍÊÇÏȽ¨Á¢Ò»¸öÕâÑùµÄ¿â¡£ Ä£°åºÍ±ê×¼¿âʵÏÖÁËÈİÆ÷¡¢×ÊÔ´¾ä±úÒÔ¼°ÖîÈç´ËÀàµÄ¶«Î÷£¬¸üÔçµÄʹÓÃÉõÖÁÔÚ¶àÄêÒÔǰ¡£Òì³£µÄʹÓÃʹ֮¸ü¼ÓÍêÉÆ¡£ Èç¹ûÄãʵÔÚ²»Äܽ«ÄÚ´æ·ÖÅä/ÖØĞ·ÖÅäµÄ²Ù×÷Òş²Øµ½ÄãĞèÒªµÄ¶ÔÏóÖĞʱ£¬Äã¿ÉÒÔʹÓÃ×ÊÔ´¾ä±ú£¨resource handle£©£¬ÒÔ½«ÄÚ´æĞ¹Â©µÄ¿ÉÄÜĞÔ½µÖÁ×îµÍ¡£ÕâÀïÓиöÀı×Ó£ºÎÒĞèҪͨ¹ıÒ»¸öº¯Êı£¬ÔÚ¿ÕÏĞÄÚ´æÖн¨Á¢Ò»¸ö¶ÔÏó²¢·µ»ØËü¡£Õâʱºò¿ÉÄÜÍü¼ÇÊÍ·ÅÕâ¸ö¶ÔÏ󡣱Ͼ¹£¬ÎÒÃDz»ÄÜ˵£¬½ö½ö¹Ø×¢µ±Õâ¸öÖ¸ÕëÒª±»ÊͷŵÄʱºò£¬Ë­½«¸ºÔğÈ¥×ö¡£Ê¹ÓÃ×ÊÔ´¾ä±ú£¬ÕâÀïÓÃÁ˱ê×¼¿âÖеÄauto_ptr£¬Ê¹ĞèҪΪ֮¸ºÔğµÄµØ·½±äµÃÃ÷È·ÁË¡£ #include #include using namespace std; struct S { S() { cout << "make an S\n"; } ~S() { cout << "destroy an S\n"; } S(const S&) { cout << "copy initialize an S\n"; } S& operator=(const S&) { cout << "copy assign an S\n"; } }; S f() { return new S; // Ë­¸Ã¸ºÔğÊÍ·ÅÕâ¸öS£¿ }; auto_ptr g() { return auto_ptr(new S); // ÏÔʽ´«µİ¸ºÔğÊÍ·ÅÕâ¸öS } int main() { cout << "start main\n"; S* p = f(); cout << "after f() before g()\n"; // S* q = g(); // ½«±»±àÒëÆ÷²¶×½ auto_ptr q = g(); cout << "exit main\n"; // p²úÉúÁËÄÚ´æĞ¹Â© // q±»×Ô¶¯ÊÍ·Å } ÔÚ¸üÒ»°ãµÄÒâÒåÉÏ¿¼ÂÇ×ÊÔ´£¬¶ø²»½ö½öÊÇÄÚ´æ¡£ Èç¹ûÔÚÄãµÄ»·¾³Öв»ÄÜϵͳµØÓ¦ÓÃÕâĞ©¼¼ÇÉ£¨ÀıÈ磬Äã±ØĞëʹÓñğµÄµØ·½µÄ´úÂ룬»òÕßÄãµÄ³ÌĞòµÄÁíÒ»²¿·Ö¼òÖ±ÊÇԭʼÈËÀࣨÒë×¢£ºÔ­ÎÄÊÇNeanderthals£¬Äá°²µÂÌØÈË£¬¾ÉʯÆ÷ʱ´ú¹ã·º·Ö²¼ÔÚÅ·ÖŞµÄÔ³ÈË£©Ğ´µÄ£¬Èç´ËµÈµÈ£©£¬ÄÇôעÒâʹÓÃÒ»¸öÄÚ´æĞ¹Â©¼ì²âÆ÷×÷Ϊ¿ª·¢¹ı³ÌµÄÒ»²¿·Ö£¬»òÕß²åÈëÒ»¸öÀ¬»øÊÕ¼¯Æ÷£¨garbage collector£©¡£ ÎÒΪʲôÔÚ²¶»ñÒ»¸öÒì³£Ö®ºó¾Í²»ÄܼÌĞø£¿ »»¾ä»°Ëµ£¬C++Ϊʲô²»ÌṩһÖÖ¼òµ¥µÄ·½Ê½£¬ÈóÌĞòÄܹ»»Øµ½Òì³£Å׳öµãÖ®ºó£¬²¢¼ÌĞøÖ´ĞĞ£¿ Ö÷ÒªµÄÔ­ÒòÊÇ£¬Èç¹û´ÓÒì³£´¦ÀíÖ®ºó¼ÌĞø£¬ÄÇÃ´ÎŞ·¨Ô¤ÖªÖÀ³öµãÖ®ºóµÄ´úÂëÈçºÎ¶Ô´ıÒì³£´¦Àí£¬ÊÇ·ñ½ö½ö¼ÌĞøÖ´ĞĞ£¬¾ÍÏóʲôҲûÓĞ·¢ÉúÒ»Ñù¡£Òì³£´¦ÀíÕßÎŞ·¨ÖªµÀ£¬ÔÚ¼ÌĞøÖ®Ç°£¬ÓйصÄÉÏÏÂÎÄ»·¾³£¨context£©ÊÇ·ñÊÇ¡°ÕıÈ·¡±µÄ¡£ÒªÈÃÕâÑùµÄ´úÂëÕıÈ·Ö´ĞĞ£¬Å׳öÒì³£µÄ±àĞ´ÕßÓë²¶»ñÒì³£µÄ±àĞ´Õß±ØĞë¶Ô±Ë´ËµÄ´úÂëÓëÉÏÏÂÎÄ»·¾³¶¼·Ç³£ÊìϤ²ÅĞĞ¡£ÕâÑù»á²úÉú·Ç³£¸´ÔÓµÄÒÀÀµĞÔ£¬Òò´ËÎŞÂÛÔÚʲôÇé¿öÏ£¬¶¼»áµ¼ÖÂһϵÁĞÑÏÖØµÄά»¤ÎÊÌâ¡£ µ±ÎÒÉè¼ÆC++µÄÒì³£´¦Àí»úÖÆÊ±£¬ÎÒÔø¾­ÈÏÕæµØ¿¼ÂǹıÔÊĞíÕâÖÖ¼ÌĞøµÄ¿ÉÄÜĞÔ£¬¶øÇÒÔÚ±ê×¼»¯µÄ¹ı³ÌÖĞ£¬Õâ¸öÎÊÌâ±»·Ç³£ÏêϸµØÌÖÂÛ¹ı¡£Çë²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷ÖеÄÒì³£´¦ÀíÕ½ڡ£ ÔÚÒ»´ÎĞÂÎÅ×éµÄÌÖÂÛÖĞ£¬ÎÒÔø¾­ÒÔÒ»ÖÖÉÔ΢²»Í¬µÄ·½Ê½»Ø´ğ¹ıÕâ¸öÎÊÌâ¡£ ΪʲôC++ÖĞûÓĞÏ൱ÓÚrealloc()µÄº¯Êı£¿ Èç¹ûÄãĞèÒª£¬Ä㵱Ȼ¿ÉÒÔʹÓÃrealloc()¡£µ«ÊÇ£¬realloc()½ö½ö±£Ö¤Äܹ¤×÷ÓÚÕâÑùµÄÊı×éÖ®ÉÏ£ºËüÃDZ»malloc()£¨»òÕßÀàËÆµÄº¯Êı£©·ÖÅ䣬°üº¬Ò»Ğ©Ã»ÓĞÓû§¶¨ÒåµÄ¸´Öƹ¹Ô캯Êı£¨copy constructors£©µÄ¶ÔÏó¡£¶øÇÒ£¬Òª¼Çס£¬Óëͨ³£µÄÆÚÍûÏà·´£¬realloc()ÓĞʱҲ±ØĞë¸´ÖÆËüµÄ²ÎÊıÊı×é¡£ ÔÚC++ÖĞ£¬´¦ÀíÄÚ´æÖØĞ·ÖÅäµÄ¸üºÃµÄ·½·¨ÊÇ£¬Ê¹Óñê×¼¿âÖеÄÈİÆ÷£¬ÀıÈçvector£¬²¢ÈÃËü×ÔÎÒÔö³¤¡£ ÈçºÎʹÓÃÒì³££¿ ²Î¼û¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·µÚ4Õ£¬µÚ8.3½Ú£¬ÒÔ¼°¸½Â¼E¡£Õâ¸ö¸½Â¼Õë¶ÔµÄÊÇÈçºÎÔÚÒªÇó¿Á¿ÌµÄ³ÌĞòÖĞĞ´³öÒì³£°²È«µÄ´úÂëµÄ¼¼ÇÉ£¬¶ø²»ÊÇÕë¶Ô³õѧÕߵġ£Ò»¸ö¹Ø¼üµÄ¼¼ÊõÊÇ¡°×ÊÔ´»ñµÃ¼´³õʼ»¯¡±£¨resource acquisiton is initialization£©£¬ËüʹÓÃһЩÓĞÎö¹¹º¯ÊıµÄÀ࣬À´ÊµÏÖÇ¿ÖÆµÄ×ÊÔ´¹ÜÀí¡£ ÔõÑù´ÓÊäÈëÖжÁȡһ¸ö×Ö·û´®£¿ Äã¿ÉÒÔÓÃÕâÖÖ·½Ê½¶Áȡһ¸öµ¥¶ÀµÄÒÔ¿Õ¸ñ½áÊøµÄ´Ê£º #include #include using namespace std; int main() { cout << "Please enter a word:\n"; string s; cin>>s; cout << "You entered " << s << '\n'; } ×¢Ò⣬ÕâÀïûÓĞÏÔʽµÄÄÚ´æ¹ÜÀí£¬Ò²Ã»ÓĞ¿ÉÄܵ¼ÖÂÒç³öµÄ¹Ì¶¨´óĞ¡µÄ»º³åÇø¡£ Èç¹ûÄãȷʵÏëµÃµ½Ò»Ğжø²»ÊÇÒ»¸öµ¥¶ÀµÄ´Ê£¬¿ÉÒÔÕâÑù×ö£º #include #include using namespace std; int main() { cout << "Please enter a line:\n"; string s; getline(cin,s); cout << "You entered " << s << '\n'; } ÔÚ¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·£¨¿ÉÔÚÏß»ñµÃ£©µÄµÚ3Õ£¬¿ÉÒÔÕÒµ½Ò»¸ö¶ÔÖîÈç×Ö·û´®ÓëÁ÷ÕâÑùµÄ±ê×¼¿â¹¤¾ßµÄ¼ò½é¡£¶ÔÓÚʹÓÃCÓëC++½øĞмòµ¥ÊäÈëÊä³öµÄÏêϸ±È½Ï£¬²Î¼ûÎÒµÄÎÄÕ¡¶½«±ê×¼C++×÷ΪһÖÖеÄÓïÑÔÀ´Ñ§Ï°¡·(Learning Standard C++ as a New Language)£¬Äã¿ÉÒÔÔÚ±¾ÈËÖø×÷Áбí(my publications list)ÖĞÏÂÔØµ½Ëü¡£ ΪʲôC++²»Ìṩ¡°finally¡±µÄ¹¹Ô죿 ÒòΪC++ÌṩÁËÁíÍâÒ»ÖÖ·½·¨£¬Ëü¼¸ºõ×ÜÊǸüºÃµÄ£º¡°×ÊÔ´»ñµÃ¼´³õʼ»¯¡±£¨resource acquisiton is initialization£©¼¼Êõ¡£»ù±¾µÄ˼·ÊÇ£¬Í¨¹ıÒ»¸ö¾Ö²¿¶ÔÏóÀ´±íÏÖ×ÊÔ´£¬ÓÚÊǾֲ¿¶ÔÏóµÄÎö¹¹º¯Êı½«»áÊÍ·Å×ÊÔ´¡£ÕâÑù£¬³ÌĞòÔ±¾Í²»»áÍü¼ÇÊÍ·Å×ÊÔ´ÁË¡£¾ÙÀıÀ´Ëµ£º class File_handle { FILE p; public: File_handle(const char n, const char* a) { p = fopen(n,a); if (p==0) throw Open_error(errno); } File_handle(FILE* pp) { p = pp; if (p==0) throw Open_error(errno); } ~File_handle() { fclose(p); } operator FILE*() { return p; } // ... }; void f(const char* fn) { File_handle f(fn,"rw"); //´ò¿ªfn½øĞжÁĞ´ // ͨ¹ıfʹÓÃÎļş } ÔÚÒ»¸öϵͳÖĞ£¬ĞèҪΪÿһ¸ö×ÊÔ´¶¼Ê¹ÓÃÒ»¸ö¡°×ÊÔ´¾ä±ú¡±Àà¡£ÎŞÂÛÈçºÎ£¬ÎÒÃDz»ĞèҪΪÿһ¸ö×ÊÔ´»ñµÃ¶¼Ğ´³ö¡°finally¡±Óï¾ä¡£ÔÚʵʱϵͳÖĞ£¬×ÊÔ´»ñµÃÒªÔ¶Ô¶¶àÓÚ×ÊÔ´µÄÖÖÀ࣬Òò´ËºÍʹÓá°finally¡±¹¹ÔìÏà±È£¬¡°×ÊÔ´»ñµÃ¼´³õʼ»¯¡±¼¼Êõ»á²úÉúÉٵöàµÄ´úÂë¡£ ʲôÊÇ×Ô¶¯Ö¸Õ루auto_ptr£©£¬ÎªÊ²Ã´Ã»ÓĞ×Ô¶¯Êı×飨auto_array£©£¿ auto_ptrÊÇÒ»¸ö·Ç³£¼òµ¥µÄ¾ä±úÀàµÄÀı×Ó£¬ÔÚÖж¨Ò壬ͨ¹ı¡°×ÊÔ´»ñµÃ¼´³õʼ»¯¡±¼¼ÊõÖ§³ÖÒì³£°²È«¡£auto_ptr±£´æ×ÅÒ»¸öÖ¸Õ룬Äܹ»ÏóÖ¸ÕëÒ»Ñù±»Ê¹Ó㬲¢ÔÚÉú´æÆÚ½áÊøÊ±ÊÍ·ÅÖ¸ÏòµÄ¶ÔÏó¡£¾ÙÀı£º #include using namespace std; struct X { int m; // .. }; void f() { auto_ptr p(new X); X* q = new X; p->m++; // ÏóÒ»¸öÖ¸ÕëÒ»ÑùʹÓÃp q->m++; // ... delete q; } Èç¹ûÔÚ...²¿·ÖÅ׳öÁËÒ»¸öÒì³££¬p³ÖÓеĶÔÏ󽫱»auto_ptrµÄÎö¹¹º¯ÊıÕıÈ·µØÊÍ·Å£¬¶øqÖ¸ÏòµÄX¶ÔÏóÔò²úÉúÁËÄÚ´æĞ¹Â©¡£¸ü¶àµÄϸ½Ú£¬²Î¼û¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·14.4.2½Ú¡£ auto_ptrÊÇÒ»¸ö·Ç³£¼òµ¥µÄÀà¡£ÌØ±ğµØ£¬Ëü²»ÊÇÒ»¸öÒıÓüÆÊı£¨reference counted£©µÄÖ¸Õë¡£Èç¹ûÄ㽫һ¸öauto_ptr¸³Öµ¸øÁíÒ»¸ö£¬ÄÇô±»¸³ÖµµÄauto_ptr½«³ÖÓĞÖ¸Õ룬¶øÔ­À´µÄauto_ptr½«³ÖÓĞ0¡£¾ÙÀı£º #include #include using namespace std; struct X { int m; // .. }; int main() { auto_ptr p(new X); auto_ptr q(p); cout << "p " << p.get() << " q " << q.get() << "\n"; } ½«»á´òÓ¡³öÒ»¸öÖ¸Ïò0µÄÖ¸ÕëºÍÒ»¸öÖ¸Ïò·Ç0µÄÖ¸Õë¡£ÀıÈ磺 p 0x0 q 0x378d0 auto_ptr::get()·µ»ØÄǸö¸¨ÖúµÄÖ¸Õë¡£ ÕâÖÖ¡°×ªÒÆ¡±ÓïÒ岻ͬÓÚͨ³£µÄ¡°¸´ÖÆ¡±ÓïÒ壬ÕâÊÇÁîÈ˾ªÑȵġ£ÌØ±ğµØ£¬ÓÀÔ¶²»ÒªÊ¹ÓÃauto_ptr×÷Ϊһ¸ö±ê×¼ÈİÆ÷µÄ³ÉÔ±¡£±ê×¼ÈİÆ÷ĞèҪͨ³£µÄ¡°¸´ÖÆ¡±ÓïÒå¡£ÀıÈ磺 std::vector<auto_ptr >v; // ´íÎó auto_ptrÖ»³ÖÓĞÖ¸ÏòÒ»¸öµ¥¶ÀÔªËØµÄÖ¸Õ룬¶ø²»ÊÇÖ¸ÏòÒ»¸öÊı×éµÄÖ¸Õ룺 void f(int n) { auto_ptr p(new X[n]); //´íÎó // ... } ÕâÊÇ´íÎóµÄ£¬ÒòΪÎö¹¹º¯Êı»áµ÷ÓÃdelete¶ø²»ÊÇdelete[]À´ÊÍ·ÅÖ¸Õ룬ÕâÑù¾Í²»»áµ÷ÓÃÓàϵÄn-1¸öXµÄÎö¹¹º¯Êı¡£ ÄÇôÎÒÃÇĞèÒªÒ»¸öauto_arrayÀ´³ÖÓĞÊı×éÂ𣿲»¡£Ã»ÓĞauto_array¡£Ô­ÒòÊǸù±¾Ã»ÓĞÕâÖÖĞèÒª¡£¸üºÃµÄ½â¾ö·½°¸ÊÇʹÓÃvector£º void f(int n) { vector v(n); // ... } µ±...²¿·Ö·¢ÉúÒ쳣ʱ£¬vµÄÎö¹¹º¯Êı»á±»ÕıÈ·µØµ÷Óᣠ¿ÉÒÔ»ìºÏʹÓÃC·ç¸ñÓëC++·ç¸ñµÄÄÚ´æ·ÖÅÉÓëÖØĞ·ÖÅäÂ𣿠ÔÚÕâÖÖÒâÒåÉÏÊÇ¿ÉÒԵģºÄã¿ÉÒÔÔÚͬһ¸ö³ÌĞòÖĞʹÓÃmalloc()ºÍnew¡£ ÔÚÕâÖÖÒâÒåÉÏÊDz»ĞеģºÄã²»ÄÜʹÓÃmalloc()À´½¨Á¢Ò»¸ö¶ÔÏó£¬ÓÖͨ¹ıdeleteÀ´ÊÍ·ÅËü¡£ÄãÒ²²»ÄÜÓÃnew½¨Á¢Ò»¸öеĶÔÏó£¬È»ºóͨ¹ıfree()À´ÊÍ·ÅËü£¬»òÕßͨ¹ırealloc()ÔÚÊı×éÖĞÔÙ½¨Á¢Ò»¸öеġ£ C++ÖеÄnewºÍdelete²Ù×÷¿ÉÒÔ±£Ö¤ÕıÈ·µÄ¹¹ÔìºÍÎö¹¹£º¹¹Ô캯ÊıºÍÎö¹¹º¯ÊıÔÚĞèÒªËüÃǵÄʱºò±»µ÷Óá£C·ç¸ñµÄº¯Êıalloc(), calloc(), free(), ºÍrealloc()È´²»Äܱ£Ö¤ÕâÒ»µã¡£´ËÍ⣬ÓÃnewºÍdeleteÀ´»ñµÃºÍÊͷŵÄԭʼÄڴ棬²¢²»Ò»¶¨Äܱ£Ö¤Óëmalloc()ºÍfree()¼æÈİ¡£Èç¹ûÕâÖÖ»ìºÏµÄ·ç¸ñÔÚÄãµÄϵͳÖĞÄܹ»ÔËÓã¬Ö»ÄÜ˵ÊÇÄã×ßÔË¡ª¡ªÔİʱµÄ¡£ Èç¹ûÄã¾õµÃĞèҪʹÓÃrealloc()¡ª¡ª»òÕßÒª×ö¸ü¶à¡ª¡ª¿¼ÂÇʹÓñê×¼¿âÖеÄvector¡£ÀıÈ磺 // ´ÓÊäÈëÖн«´Ê¶ÁÈ¡µ½Ò»¸ö×Ö·û´®vectorÖĞ vector words; string s; while (cin>>s && s!=".") words.push_back(s); vector»áÊÓĞèÒª×Ô¶¯Ôö³¤¡£ ¸ü¶àµÄÀı×ÓÓëÌÖÂÛ£¬²Î¼ûÎÒµÄÎÄÕ¡¶½«±ê×¼C++×÷ΪһÖÖеÄÓïÑÔÀ´Ñ§Ï°¡·(Learning Standard C++ as a New Language)£¬Äã¿ÉÒÔÔÚ±¾ÈËÖø×÷Áбí(my publications list)ÖĞÏÂÔØµ½Ëü¡£ ÎÒΪʲô±ØĞëʹÓÃÒ»¸öÔìĞÍÀ´×ª»»void£¿ ÔÚCÓïÑÔÖĞ£¬Äã¿ÉÒÔÒşÊ½µØ½«voidת»»ÎªT¡£ÕâÊDz»°²È«µÄ¡£¿¼ÂÇһϣº #include<stdio.h> int main() { char i = 0; char j = 0; char p = &i; void* q = p; int* pp = q; /* ²»°²È«µÄ£¬ÔÚCÖĞ¿ÉÒÔ£¬C++²»ĞĞ / printf("%d %d\n",i,j); pp = -1; / ¸²¸ÇÁË´Ói¿ªÊ¼µÄÄÚ´æ / printf("%d %d\n",i,j); } ʹÓÃÒ»¸ö²¢²»Ö¸ÏòTÀàĞ͵ÄT½«ÊÇÒ»³¡ÔÖÄÑ¡£Òò´Ë£¬ÔÚC++ÖĞ£¬Èç¹û´ÓÒ»¸övoidµÃµ½Ò»¸öT*£¬Äã±ØĞë½øĞĞÏÔʽת»»¡£¾ÙÀıÀ´Ëµ£¬ÒªµÃµ½ÉÏÁгÌĞòµÄÕâ¸öÁîÈ˱ğŤµÄЧ¹û£¬Äã¿ÉÒÔÕâÑùĞ´£º int* pp = (int*)q; »òÕßʹÓÃÒ»¸öеÄÀàĞÍÔìĞÍ£¬ÒÔʹÕâÖÖûÓмì²éµÄÀàĞÍת»»²Ù×÷±äµÃ¸ü¼ÓÇåÎú£º int* pp = static_cast<int*>(q); ÔìĞͱ»×îºÃµØ±ÜÃâÁË¡£ ÔÚCÓïÑÔÖĞ£¬ÕâÖÖ²»°²È«µÄת»»×î³£¼ûµÄÓ¦ÓÃÖ®Ò»£¬Êǽ«malloc()µÄ½á¹û¸³ÓèÒ»¸öºÏÊʵÄÖ¸Õë¡£ÀıÈ磺 int* p = malloc(sizeof(int)); ÔÚC++ÖĞ£¬Ê¹ÓÃÀàĞͰ²È«µÄnew²Ù×÷·û£º int* p = new int; ¸½´øµØ£¬new²Ù×÷·û»¹ÌṩÁËʤ¹ımalloc()µÄĞÂÌØĞÔ£º new²»»áżȻ·ÖÅä´íÎóµÄÄÚ´æÊıÁ¿£» new»áÒşÊ½µØ¼ì²éÄÚ´æºÄ¾¡Çé¿ö£¬¶øÇÒ newÌṩÁ˳õʼ»¯¡£ ¾ÙÀı£º typedef std::complex cmplx; /* C·ç¸ñ: / cmplx p = (cmplx*)malloc(sizeof(int)); /* ´íÎó£ºÀàĞͲ»ÕıÈ· / / Íü¼Ç²âÊÔp==0 / if (p == 7) { / ... / } / Ôã¸â£¬Íü¼ÇÁ˳õʼ»¯p / // C++·ç¸ñ: cmplx q = new cmplx(1,2); // Èç¹ûÄÚ´æºÄ¾¡£¬½«Å׳öÒ»¸öbad_allocÒì³£ if (q == 7) { / ... / } ÎÒÈçºÎ¶¨ÒåÒ»¸öÀàÄÚ²¿£¨in-class£©µÄ³£Á¿£¿ Èç¹ûÄãĞèÒªÒ»¸öͨ¹ı³£Á¿±í´ïʽÀ´¶¨ÒåµÄ³£Á¿£¬ÀıÈçÊı×éµÄ·¶Î§£¬ÄãÓĞÁ½ÖÖÑ¡Ôñ£º class X { static const int c1 = 7; enum { c2 = 19 }; char v1[c1]; char v2[c2]; // ... }; Õ§¿´ÆğÀ´£¬c1µÄÉùÃ÷Òª¸ü¼ÓÇåÎú£¬µ«ÊÇҪעÒâµÄÊÇ£¬Ê¹ÓÃÕâÖÖÀàÄÚ²¿µÄ³õʼ»¯Óï·¨µÄʱºò£¬³£Á¿±ØĞëÊDZ»Ò»¸ö³£Á¿±í´ïʽ³õʼ»¯µÄÕûĞÍ»òö¾ÙÀàĞÍ£¬¶øÇÒ±ØĞëÊÇstaticºÍconstĞÎʽ¡£ÕâÊǺÜÑÏÖØµÄÏŞÖÆ£º class Y { const int c3 = 7; // ´íÎ󣺲»ÊÇstatic static int c4 = 7; // ´íÎ󣺲»ÊÇconst static const float c5 = 7; // ´íÎ󣺲»ÊÇÕûĞÍ }; ÎÒÇãÏòʹÓÃö¾ÙµÄ·½Ê½£¬ÒòΪËü¸ü¼Ó·½±ã£¬¶øÇÒ²»»áÓÕʹÎÒȥʹÓò»¹æ·¶µÄÀàÄÚ³õʼ»¯Óï·¨¡£ ÄÇô£¬ÎªÊ²Ã´»á´æÔÚÕâÖÖ²»·½±ãµÄÏŞÖÆÄØ£¿Ò»°ãÀ´Ëµ£¬ÀàÔÚÒ»¸öÍ·ÎļşÖб»ÉùÃ÷£¬¶øÍ·Îļş±»°üº¬µ½Ğí¶à»¥Ïàµ÷Óõĵ¥ÔªÈ¥¡£µ«ÊÇ£¬ÎªÁ˱ÜÃ⸴ÔӵıàÒëÆ÷¹æÔò£¬C++ÒªÇóÿһ¸ö¶ÔÏóÖ»ÓĞÒ»¸öµ¥¶ÀµÄ¶¨Òå¡£Èç¹ûC++ÔÊĞíÔÚÀàÄÚ²¿¶¨ÒåÒ»¸öºÍ¶ÔÏóÒ»ÑùÕ¼¾İÄÚ´æµÄʵÌåµÄ»°£¬ÕâÖÖ¹æÔò¾Í±»ÆÆ»µÁË¡£¶ÔÓÚC++ÔÚÕâ¸öÉè¼ÆÉϵÄȨºâ£¬Çë²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷¡£ Èç¹ûÄã²»ĞèÒªÓó£Á¿±í´ïʽÀ´³õʼ»¯Ëü£¬ÄÇô¿ÉÒÔ»ñµÃ¸ü´óµÄµ¯ĞÔ£º class Z { static char p; // ÔÚ¶¨ÒåÖгõʼ»¯ const int i; // ÔÚ¹¹Ô캯ÊıÖгõʼ»¯ public: Z(int ii) :i(ii) { } }; char Z::p = "hello, there"; Äã¿ÉÒÔ»ñȡһ¸östatic³ÉÔ±µÄµØÖ·£¬µ±ÇÒ½öµ±ËüÓĞÒ»¸öÀàÍⲿµÄ¶¨ÒåµÄʱºò£º class AE { // ... public: static const int c6 = 7; static const int c7 = 31; }; const int AE::c7; // ¶¨Òå int f() { const int p1 = &AE::c6; // ´íÎó£ºc6ûÓĞ×óÖµ const int* p2 = &AE::c7; // ok // ... } Ϊʲôdelete²»»á½«²Ù×÷ÊıÖÃ0£¿ ¿¼ÂÇһϣº delete p; // ... delete p; Èç¹ûÔÚ...²¿·ÖûÓĞÉæ¼°µ½pµÄ»°£¬ÄÇôµÚ¶ş¸ö¡°delete p;¡±½«ÊÇÒ»¸öÑÏÖØµÄ´íÎó£¬ÒòΪC++µÄʵÏÖ£¨Òë×¢£ºÔ­ÎÄΪa C++ implementation£¬µ±Ö¸VC++ÕâÑùµÄʵÏÖÁËC++±ê×¼µÄ¾ßÌ幤¾ß£©²»ÄÜÓĞЧµØ·ÀÖ¹ÕâÒ»µã£¨³ı·Çͨ¹ı·ÇÕıʽµÄÔ¤·ÀÊֶΣ©¡£¼ÈÈ»delete 0´Ó¶¨ÒåÉÏÀ´ËµÊÇÎŞº¦µÄ£¬ÄÇôһ¸ö¼òµ¥µÄ½â¾ö·½°¸¾ÍÊÇ£¬²»¹ÜÔÚʲôµØ·½Ö´ĞĞÁË¡°delete p;¡±£¬Ëæºó¶¼Ö´ĞĞ¡°p=0;¡±¡£µ«ÊÇ£¬C++²¢²»Äܱ£Ö¤ÕâÒ»µã¡£ Ò»¸öÔ­ÒòÊÇ£¬deleteµÄ²Ù×÷Êı²¢²»ĞèÒªÒ»¸ö×óÖµ£¨lvalue£©¡£¿¼ÂÇһϣº delete p+1; delete f(x); ÔÚÕâÀ±»Ö´ĞеÄdelete²¢Ã»ÓĞÓµÓĞÒ»¸ö¿ÉÒÔ±»¸³Óè0µÄÖ¸Õë¡£ÕâĞ©Àı×Ó¿ÉÄܺÜÉÙ¼û£¬µ«ËüÃǵÄÈ·Ö¸³öÁË£¬ÎªÊ²Ã´±£Ö¤¡°ÈκÎÖ¸Ïò±»É¾³ı¶ÔÏóµÄÖ¸Õ붼Ϊ0¡±ÊDz»¿ÉÄܵġ£ÈƹıÕâÌõ¡°¹æÔò¡±µÄÒ»¸ö¼òµ¥µÄ·½·¨ÊÇ£¬ÓĞÁ½¸öÖ¸ÕëÖ¸Ïòͬһ¸ö¶ÔÏó£º T* p = new T; T* q = p; delete p; delete q; // Ôã¸â£¡ C++ÏÔʽµØÔÊĞídelete²Ù×÷½«²Ù×÷Êı×óÖµÖÃ0£¬¶øÇÒÎÒÔø¾­Ï£ÍûC++µÄʵÏÖÄܹ»×öµ½ÕâÒ»µã£¬µ«ÕâÖÖ˼Ïë¿´À´²¢Ã»ÓĞÔÚC++µÄʵÏÖÖбäµÃÁ÷ĞĞ¡£ Èç¹ûÄãÈÏΪָÕëÖÃ0ºÜÖØÒª£¬¿¼ÂÇʹÓÃÒ»¸öÏú»ÙµÄº¯Êı£º template inline void destroy(T*& p) { delete p; p = 0; } ¿¼ÂÇһϣ¬ÕâÒ²ÊÇΪʲôĞèÒªÒÀ¿¿±ê×¼¿âµÄÈİÆ÷¡¢¾ä±úµÈµÈ£¬À´½«¶ÔnewºÍdeleteµÄÏÔʽµ÷Óýµµ½×îµÍÏŞ¶ÈµÄÁíÒ»¸öÔ­Òò¡£ ×¢Ò⣬ͨ¹ıÒıÓÃÀ´´«µİÖ¸Õ루ÒÔÔÊĞíÖ¸Õë±»ÖÃ0£©ÓĞÒ»¸ö¶îÍâµÄºÃ´¦£¬ÄÜ·ÀÖ¹destroy()ÔÚÓÒÖµÉÏ£¨rvalue£©±»µ÷Ó㺠int* f(); int* p; // ... destroy(f()); // ´íÎó£ºÓ¦¸ÃʹÓÃÒ»¸ö·Ç³£Á¿£¨non-const£©µÄÒıÓô«µİÓÒÖµ destroy(p+1); // ´íÎó£ºÓ¦¸ÃʹÓÃÒ»¸ö·Ç³£Á¿£¨non-const£©µÄÒıÓô«µİÓÒÖµ ÎÒÄܹ»Ğ´¡°void main()¡±Â𣿠ÕâÖÖ¶¨Ò壺 void main() { /* ... / } ÔÚC++ÖĞ´Óδ±»ÔÊĞí£¬ÔÚCÓïÑÔÖĞÒ²ÊÇÒ»Ñù¡£²Î¼ûISO C++±ê×¼3.6.1[2]»òÕßISO C±ê×¼5.1.2.2.1¡£¹æ·¶µÄʵÏÖ½ÓÊÜÕâÖÖ·½Ê½£º int main() { / ... / } ºÍ int main(int argc, char argv[]) { /* ... / } Ò»¸ö¹æ·¶µÄʵÏÖ¿ÉÄÜÌṩĞí¶à°æ±¾µÄmain()£¬µ«ËüÃǶ¼±ØĞë·µ»ØintÀàĞÍ¡£main()·µ»ØµÄintÖµ£¬ÊdzÌĞò·µ»ØÒ»¸öÖµ¸øµ÷ÓÃËüµÄϵͳµÄ·½Ê½¡£ÔÚÄÇĞ©²»¾ß±¸ÕâÖÖ·½Ê½µÄϵͳÖĞ£¬·µ»ØÖµ±»ºöÂÔÁË£¬µ«Õâ²¢²»Ê¹¡°void main()¡±ÔÚC++»òCÖгÉΪºÏ·¨µÄ¡£¼´Ê¹ÄãµÄ±àÒëÆ÷½ÓÊÜÁË¡°void main()¡±£¬Ò²Òª±ÜÃâʹÓÃËü£¬·ñÔòÄ㽫ð×ű»CºÍC++³ÌĞòÔ±ÊÓÎªÎŞÖªµÄ·çÏÕ¡£ ÔÚC++ÖĞ£¬main()²¢²»ĞèÒª°üº¬ÏÔʽµÄreturnÓï¾ä¡£ÔÚÕâÖÖÇé¿öÏ£¬·µ»ØÖµÊÇ0£¬±íʾִĞгɹ¦¡£ÀıÈ磺 #include int main() { std::cout << "This program returns the integer value 0\n"; } ×¢Òâ£¬ÎŞÂÛÊÇISO C++»¹ÊÇC99£¬¶¼²»ÔÊĞíÔÚÉùÃ÷ÖĞ©µôÀàĞÍ¡£ÄǾÍÊÇ˵£¬ÓëC89ºÍARM C++ĞγɶÔÕÕ£¬µ±ÉùÃ÷ÖĞȱÉÙÀàĞÍʱ£¬²¢²»»á±£Ö¤ÊÇ¡°int¡±¡£ÓÚÊÇ£º #include main() { / ... / } ÊÇ´íÎóµÄ£¬ÒòΪȱÉÙmain()µÄ·µ»ØÀàĞÍ¡£ ΪʲôÎÒ²»ÄÜÖØÔØµã·ûºÅ£¬::£¬sizeof£¬µÈµÈ£¿ ´ó¶àÊıµÄÔËËã·ûÄܹ»±»³ÌĞòÔ±ÖØÔØ¡£ÀıÍâµÄÊÇ£º . (µã·ûºÅ) :: ?: sizeof ²¢Ã»ÓĞʲô¸ù±¾µÄÔ­ÒòÒª½ûÖ¹ÖØÔØ?:¡£½ö½öÊÇÒòΪ£¬ÎÒûÓĞ·¢ÏÖÓĞÄÄÖÖÌØÊâµÄÇé¿öĞèÒªÖØÔØÒ»¸öÈıÔªÔËËã·û¡£×¢ÒâÒ»¸öÖØÔØÁË ±í´ïʽ1£¿±í´ïʽ2£º±í´ïʽ3 µÄº¯Êı£¬²»Äܹ»±£Ö¤±í´ïʽ2£º±í´ïʽ3ÖĞÖ»ÓĞÒ»¸ö»á±»Ö´ĞĞ¡£ Sizeof²»Äܹ»±»ÖØÔØÊÇÒòΪÄÚ½¨µÄ²Ù×÷£¨built-in operations£©£¬ÖîÈç¶ÔÒ»¸öÖ¸ÏòÊı×éµÄÖ¸Õë½øĞĞÔöÁ¿²Ù×÷£¬±ØĞëÒÀ¿¿Ëü¡£¿¼ÂÇһϣº X a[10]; X p = &a[3]; X* q = &a[3]; p++; // pÖ¸Ïòa[4] // ÄÇôpµÄÕûĞÍÖµ±ØĞë±ÈqµÄÕûĞÍÖµ´ó³öÒ»¸ösizeof(X) ËùÒÔ£¬sizeof(X)²»ÄÜÓɳÌĞòÔ±À´¸³ÓèÒ»¸ö²»Í¬µÄĞÂÒâÒ壬ÒÔÃâÎ¥·´»ù±¾µÄÓï·¨¡£ ÔÚN::mÖĞ£¬ÎŞÂÛN»¹ÊÇm¶¼²»ÊÇÖµµÄ±í´ïʽ£»NºÍmÊDZàÒëÆ÷ÖªµÀµÄÃû×Ö£¬::Ö´ĞĞÒ»¸ö£¨±àÒëÆÚµÄ£©·¶Î§½âÎö£¬¶ø²»ÊDZí´ïʽÇóÖµ¡£Äã¿ÉÒÔÏëÏóһϣ¬ÔÊĞíÖØÔØx::yµÄ»°£¬x¿ÉÄÜÊÇÒ»¸ö¶ÔÏó¶ø²»ÊÇÒ»¸öÃû×ֿռ䣨namespace£©»òÕßÒ»¸öÀ࣬ÕâÑù¾Í»áµ¼Ö¡ª¡ªÓëÔ­À´µÄ±íÏÖÏà·´¡ª¡ª²úÉúеÄÓï·¨£¨ÔÊĞí ±í´ïʽ1::±í´ïʽ2£©¡£ºÜÃ÷ÏÔ£¬ÕâÖÖ¸´ÔÓĞÔ²»»á´øÀ´Èκκô¦¡£ ÀíÂÛÉÏÀ´Ëµ£¬.£¨µãÔËËã·û£©¿ÉÒÔͨ¹ıʹÓúÍ->Ò»ÑùµÄ¼¼ÊõÀ´½øĞĞÖØÔØ¡£µ«ÊÇ£¬ÕâÑù×ö»áµ¼ÖÂÒ»¸öÎÊÌ⣬ÄǾÍÊÇÎŞ·¨È·¶¨²Ù×÷µÄÊÇÖØÔØÁË.µÄ¶ÔÏóÄØ£¬»¹ÊÇͨ¹ı.ÒıÓõÄÒ»¸ö¶ÔÏó¡£ÀıÈ磺 class Y { public: void f(); // ... }; class X { // ¼ÙÉèÄãÄÜÖØÔØ. Y* p; Y& operator.() { return p; } void f(); // ... }; void g(X& x) { x.f(); // X::f»¹ÊÇY::f»¹ÊÇ´íÎó£¿ } Õâ¸öÎÊÌâÄܹ»Óü¸ÖÖ²»Í¬µÄ·½·¨½â¾ö¡£ÔÚ±ê×¼»¯µÄʱºò£¬ÄÄÖÖ·½·¨×îºÃ»¹Ã»Óж¨ÂÛ¡£¸ü¶àµÄϸ½Ú£¬Çë²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷¡£ ÔõÑù½«Ò»¸öÕûĞÍֵת»»ÎªÒ»¸ö×Ö·û´®£¿ ×î¼òµ¥µÄ·½·¨ÊÇʹÓÃÒ»¸ö×Ö·û´®Á÷£¨stringstream£©£º #include #include #include using namespace std; string itos(int i) // ½«intת»»³Éstring { stringstream s; s << i; return s.str(); } int main() { int i = 127; string ss = itos(i); const char p = ss.c_str(); cout << ss << " " << p << "\n"; } ×ÔÈ»µØ£¬ÕâÖÖ¼¼ÊõÄܹ»½«ÈκÎʹÓÃ<<Êä³öµÄÀàĞÍת»»Îª×Ö·û´®¡£¶ÔÓÚ×Ö·û´®Á÷µÄ¸ü¶à˵Ã÷£¬²Î¼û¡¶C++³ÌĞòÉè¼ÆÓïÑÔ¡·21.5.3½Ú¡£ ¡°int* p¡±ÕıÈ·»¹ÊÇ¡°int p¡±ÕıÈ·£¿ ¶şÕß¶¼ÊÇÕıÈ·µÄ£¬ÒòΪ¶şÕßÔÚCºÍC++Öж¼ÊÇÓĞЧµÄ£¬¶øÇÒÒâÒåÍêȫһÑù¡£¾ÍÓïÑԵ͍ÒåÓëÏà¹ØµÄ±àÒëÆ÷À´Ëµ£¬ÎÒÃÇ»¹¿ÉÒÔ˵¡°intp¡±»òÕß¡°int * p¡±¡£ ÔÚ¡°int* p¡±ºÍ¡°int p¡±Ö®¼äµÄÑ¡ÔñÓëÕıÈ·»ò´íÎóÎŞ¹Ø£¬¶øÖ»¹Øºõ·ç¸ñÓë²àÖØµã¡£C²àÖØ±í´ïʽ£»¶ÔÉùÃ÷ÍùÍù±È¿ÉÄÜ´øÀ´µÄÎÊÌ⿼Âǵøü¶à¡£ÁíÒ»·½Ã棬C++Ôò·Ç³£ÖØÊÓÀàĞÍ¡£ Ò»¸ö¡°µäĞ͵ÄC³ÌĞòÔ±¡±Ğ´³É¡°int p¡±£¬²¢ÇÒ½âÊÍ˵¡°p±íʾһ¸öʲôÑùµÄint¡±ÒÔÇ¿µ÷Óï·¨£¬¶øÇÒ¿ÉÄÜÖ¸³öC£¨ÓëC++£©µÄÓï·¨À´Ö¤Ã÷ÕâÖÖ·ç¸ñµÄÕıÈ·ĞÔ¡£Êǵģ¬ÔÚÓï·¨Éϱ»°ó¶¨µ½Ãû×ÖpÉÏ¡£ Ò»¸ö¡°µäĞ͵ÄC++³ÌĞòÔ±¡±Ğ´³É¡°int p¡±£¬²¢ÇÒ½âÊÍ˵¡°pÊÇÒ»¸öÖ¸ÏòintµÄÖ¸ÕëÀàĞÍ¡±ÒÔÇ¿µ÷ÀàĞÍ¡£Êǵģ¬pÊÇÒ»¸öÖ¸ÏòintµÄÖ¸ÕëÀàĞÍ¡£ÎÒÃ÷È·µØÇãÏòÓÚÕâÖÖ²àÖØ·½Ïò£¬¶øÇÒÈÏΪ¶ÔÓÚѧºÃ¸ü¶àµÄ¸ß¼¶C++ÕâÊǺÜÖØÒªµÄ¡£ ÑÏÖØµÄ»ìÂÒ£¨½ö½ö£©·¢ÉúÔÚµ±ÈËÃÇÊÔͼÔÚÒ»ÌõÉùÃ÷ÖĞÉùÃ÷¼¸¸öÖ¸ÕëµÄʱºò£º int p, p1; // Ò²ĞíÊÇ´íµÄ£ºp1²»ÊÇÒ»¸öint* °Ñ*·Åµ½Ãû×ÖÕâÒ»±ß£¬¿´À´Ò²²»ÄÜÓĞЧµØ¼õÉÙÕâÖÖ´íÎó£º int p, p1; // Ò²ĞíÊÇ´íµÄ£¿ Ϊÿһ¸öÃû×ÖĞ´Ò»ÌõÉùÃ÷×î´ó³Ì¶ÈµØ½â¾öÁËÎÊÌ⡪¡ªÌرğÊǵ±ÎÒÃdzõʼ»¯±äÁ¿µÄʱºò¡£ÈËÃǼ¸ºõ²»»áÕâÑùĞ´£º int p = &i; int p1 = p; // ´íÎó£ºintÓÃÒ»¸öint³õʼ»¯ÁË Èç¹ûËûÃÇÕæµÄÕâô¸ÉÁË£¬±àÒëÆ÷Ò²»áÖ¸³ö¡£ ÿµ±ÊÂÇé¿ÉÒÔÓĞÁ½ÖÖ·½·¨Íê³É£¬ÓĞÈ˾ͻáÃÔ»ó¡£Ã¿µ±ÊÂÇé½ö½öÊÇÒ»¸ö·ç¸ñµÄÎÊÌ⣬ÕùÂ۾ͻáûÍêûÁË¡£ÎªÃ¿Ò»¸öÖ¸ÕëĞ´Ò»ÌõÉùÃ÷£¬¶øÇÒÓÀÔ¶¶¼Òª³õʼ»¯±äÁ¿£¬ÕâÑù£¬»ìÂÒÖ®Ô´¾ÍÏûʧÁË¡£¸ü¶àµÄ¹ØÓÚCµÄÉùÃ÷Óï·¨µÄÌÖÂÛ£¬²Î¼û¡¶C++ÓïÑÔµÄÉè¼ÆºÍÑݱ䡷¡£ ¶ÔÓÚÎҵĴúÂ룬ÄÄÒ»ÖÖ²¼¾Ö·ç¸ñ£¨layout style£©ÊÇ×îºÃµÄ£¿ ÕâÖÖ·ç¸ñÎÊÌâÊôÓÚ¸öÈ˵İ®ºÃ¡£ÈËÃÇÍùÍù¶Ô²¼¾Ö·ç¸ñµÄÎÊÌâ³ÖÓĞÇ¿ÁÒµÄÒâ¼û£¬²»¹ı£¬Ò²ĞíÒ»¹áĞÔ±ÈijÖÖÌØ¶¨µÄ·ç¸ñ¸ü¼ÓÖØÒª¡£Ïó´ó¶àÊıÈËÒ»Ñù£¬ÎÒ»¨Á˺ܳ¤µÄʱ¼ä£¬À´ÎªÎ񵀮«ºÃ×÷³öÒ»¸ö¹Ì¶¨µÄ½áÂÛ¡£ ÎÒ¸öÈËʹÓÃͨ³£³ÆÎª¡°K&R¡±µÄ·ç¸ñ¡£µ±Ê¹ÓÃCÓïÑÔûÓеĹ¹Ô캯Êıʱ£¬ĞèÒªÔö¼ÓеÄϰ¹ß£¬ÕâÑù¾Í±ä³ÉÁËÒ»ÖÖÓĞʱ±»³ÆÎª¡°Stroustrup¡±µÄ·ç¸ñ¡£ÀıÈ磺 class C : public B { public: // ... }; void f(int p, int max) { if (p) { // ... } for (int i = 0; i<max; ++i) { // ... } } ±È´ó¶àÊı²¼¾Ö·ç¸ñ¸üºÃ£¬ÕâÖÖ·ç¸ñ±£ÁôÁË´¹Ö±µÄ¿Õ¸ñ£¬ÎÒϲ»¶¾¡¿ÉÄܵØÔÚºÏÀíµÄÇé¿öÏÂ¶ÔÆëÆÁÄ»¡£¶Ôº¯Êı¿ªÍ·µÄ´óÀ¨»¡µÄ·ÅÖã¬ÓĞÖúÓÚÎÒµÚÒ»Ñ۾ͷֱğ³öÀàµÄ¶¨ÒåºÍº¯ÊıµÄ¶¨Òå¡£ Ëõ½øÊǷdz£ÖØÒªµÄ¡£ Éè¼ÆÎÊÌ⣬ÖîÈç×÷ΪÖ÷Òª½Ó¿ÚµÄ³éÏó»ùÀàµÄʹÓã¬Ê¹ÓÃÄ£°åÒÔ±íÏÖÓе¯ĞÔµÄÀàĞͰ²È«µÄ³éÏó£¬ÒÔ¼°ÕıÈ·µØÊ¹ÓÃÒì³£ÒÔ±íÏÖ´íÎ󣬱Ȳ¼¾Ö·ç¸ñµÄÑ¡ÔñÒªÖØÒªµÃ¶à¡£ ÎÒÓ¦¸Ã½«¡°const¡±·ÅÔÚÀàĞÍ֮ǰ»¹ÊÇÖ®ºó£¿ ÎÒ°ÑËü·ÅÔÚÇ°Ãæ£¬µ«Äǽö½öÊǸöÈ˰®ºÃÎÊÌâ¡£¡°const T¡±ºÍ¡°T const¡±×ÜÊǶ¼±»ÔÊĞíµÄ£¬¶øÇÒÊǵÈЧµÄ¡£ÀıÈ磺 const int a = 1; // ok int const b = 2; // also ok ÎÒ²ÂÏëµÚÒ»ÖÖ°æ±¾¿ÉÄÜ»áÈÃÉÙÊı£¨¸ü¼Ó¹ÌÊØÓï·¨¹æ·¶£©µÄ³ÌĞòÔ±¸Ğµ½ÃÔ»ó¡£ ÎªÊ²Ã´£¿µ±ÎÒ·¢Ã÷¡°const¡±£¨×î³õµÄÃû³Æ½Ğ×ö¡°readonly¡±£¬²¢ÇÒÓĞÒ»¸ö¶ÔÓ¦µÄ¡°writeonly¡±£©µÄʱºò£¬ÎÒ¾ÍÔÊĞíËü³öÏÖÔÚÀàĞÍ֮ǰ»òÖ®ºó£¬ÒòΪÕâÑù×ö²»»á´øÀ´Èκβ»Ã÷È·¡£±ê׼֮ǰµÄCºÍC++¹æ¶¨Á˺ÜÉٵģ¨Èç¹ûÓеϰ£©Ìض¨µÄ˳Ğò¹æ·¶¡£ ÎÒ²»¼ÇµÃµ±Ê±ÓйıÈκÎÓйØË³ĞòÎÊÌâµÄÉîÈë˼¿¼»òÌÖÂÛ¡£ÄÇʱ£¬ÔçÆÚµÄһЩʹÓÃÕß¡ª¡ªÌرğÊÇÎÒ¡ª¡ª½ö½öϲ»¶ÕâÖÖÑù×Ó£º const int c = 10; ¿´ÆğÀ´±ÈÕâÖÖ¸üºÃ£º int const c = 10; Ò²ĞíÎÒÒ²ÊÜÁËÕâÖÖÓ°Ï죺ÔÚÎÒ×îÔçµÄһЩʹÓá°readonly¡±µÄÀı×ÓÖĞ readonly int c = 10; ±ÈÕâ¸ö¸ü¾ßÓпɶÁĞÔ£º int readonly c = 10; ÎÒ´´ÔìµÄÄÇĞ©×îÔçµÄʹÓá°const¡±µÄ£¨C»òC++£©´úÂ룬¿´À´ÒѾ­ÔÚÈ«Çò·¶Î§ÄÚÈ¡´úÁË¡°readonly¡±¡£ ÎҼǵÃÕâ¸öÓï·¨µÄÑ¡ÔñÔÚ¼¸¸öÈË¡ª¡ªÀıÈçDennis Ritchie¡ª¡ªµ±ÖĞÌÖÂÛ¹ı£¬µ«ÎÒ²»¼ÇµÃµ±Ê±ÎÒÇãÏòÓÚÄÄÖÖÓïÑÔÁË¡£ ×¢ÒâÔڹ̶¨Ö¸Õ루const pointer£©ÖĞ£¬¡°const¡±ÓÀÔ¶³öÏÖÔÚ¡°¡±Ö®ºó¡£ÀıÈ磺 int const p1 = q; // Ö¸Ïòint±äÁ¿µÄ¹Ì¶¨Ö¸Õë int const p2 = q; //Ö¸Ïòint³£Á¿µÄÖ¸Õë const int p3 = q; //Ö¸Ïòint³£Á¿µÄÖ¸Õë ʹÓúêÓĞʲôÎÊÌ⣿ ºê²»×ñÑ­C++ÖйØÓÚ·¶Î§ºÍÀàĞ͵ĹæÔò¡£Õâ¾­³£µ¼ÖÂһЩ΢ÃîµÄ»ò²»ÄÇô΢ÃîµÄÎÊÌâ¡£Òò´Ë£¬C++Ìṩ¸üÊÊºÏÆäËûµÄC++£¨Òë×¢£ºÔ­ÎÄΪthe rest of C++£¬µ±Ö¸C++³ıÁ˼æÈİCÒÔÍâµÄ²¿·Ö£©µÄÌæ´úÆ·£¬ÀıÈçÄÚÁªº¯Êı¡¢Ä£°åÓëÃû×ֿռ䡣 ¿¼ÂÇһϣº #include "someheader.h" struct S { int alpha; int beta; }; Èç¹ûijÈË£¨²»Ã÷Öǵأ©µØĞ´ÁËÒ»¸ö½Ğ¡°alpha¡±»ò¡°beta¡±µÄºê£¬ÄÇôËü½«²»»á±»±àÒ룬»òÕß±»´íÎ󵨱àÒ룬²úÉú²»¿ÉÔ¤ÖªµÄ½á¹û¡£ÀıÈ磬¡°someheader.h¡±¿ÉÄܰüº¬£º #define alpha 'a' #define beta b[2] ½«ºê£¨¶øÇÒ½ö½öÊǺ꣩ȫ²¿´óĞ´µÄϰ¹ß£¬»áÓĞËù°ïÖú£¬µ«ÊǶÔÓں겢ûÓĞÓïÑÔ²ã´ÎÉϵı£»¤»úÖÆ¡£ÀıÈ磬ËäÈ»³ÉÔ±µÄÃû×Ö°üº¬ÔڽṹÌåµÄÄÚ²¿£¬µ«ÕâÎŞ¼ÃÓÚÊ£ºÔÚ±àÒëÆ÷Äܹ»ÕıÈ·µØ±æ±ğÕâÒ»µã֮ǰ£¬ºêÒѾ­½«³ÌĞò×÷Ϊһ¸ö×Ö·ûÁ÷½øĞĞÁË´¦Àí¡£Ë³±ã˵һ¾ä£¬ÕâÊÇCºÍC++³ÌĞò¿ª·¢»·¾³ºÍ¹¤¾ßÄܹ»±»¼ò»¯µÄÒ»¸öÖ÷ÒªÔ­Òò£ºÈËÓë±àÒëÆ÷¿´µ½µÄÊDz»Í¬µÄ¶«Î÷¡£ ²»ĞÒµÄÊÇ£¬Äã²»ÄܼÙÉè±ğµÄ³ÌĞòÔ±×ÜÊÇÄܹ»±ÜÃâÕâÖÖÄãÈÏΪ¡°Ï൱°×³Õ¡±µÄÊÂÇé¡£ÀıÈ磬×î½üÓĞÈ˱¨¸æÎÒ£¬ËûÃÇÓöµ½ÁËÒ»¸ö°üº¬gotoµÄºê¡£ÎÒÒ²¼û¹ıÕâÖÖÇé¿ö£¬¶øÇÒÌıµ½¹ıһЩ¡ª¡ªÔںܴàÈõµÄʱºò¡ª¡ª¿´ÆğÀ´È·ÊµÓĞÀíµÄÒâ¼û¡£ÀıÈ磺 #define prefix get_ready(); int ret__ #define Return(i) ret__=i; do_something(); goto exit #define suffix exit: cleanup(); return ret__ void f() { prefix; // ... Return(10); // ... Return(x++); //... suffix; } ×÷Ϊһ¸öά»¤µÄ³ÌĞòÔ±£¬¾Í»á²úÉúÕâÖÖÓ¡Ïó£»½«ºê¡°Òş²Ø¡±µ½Ò»¸öÍ·ÎļşÖĞ¡ª¡ªÕâ²¢²»º±¼û¡ª¡ªÊ¹µÃÕâÖÖ¡°Ä§·¨¡±¸üÄÑÒÔ±»±æ±ğ¡£ Ò»¸ö³£¼ûµÄ΢ÃîÎÊÌâÊÇ£¬Ò»¸öº¯Êı·ç¸ñµÄºê²¢²»×ñÊØº¯Êı²ÎÊı´«µİµÄ¹æÔò¡£ÀıÈ磺 #define square(x) (xx) void f(double d, int i) { square(d); // ºÃ square(i++); // Ôã¸â£ºÕâ±íʾ (i++i++) square(d+1); //Ôã¸â£ºÕâ±íʾ(d+1d+1); Ò²¾ÍÊÇ (d+d+1) // ... } ¡°d+1¡±µÄÎÊÌ⣬¿ÉÒÔͨ¹ıÔÚ¡°µ÷Óá±Ê±»òºê¶¨ÒåʱÌí¼ÓÒ»¶ÔÔ²À¨ºÅÀ´½â¾ö£º #define square(x) ((x)(x)) /*ÕâÑù¸üºÃ */ µ«ÊÇ£¬ i++±»Ö´ĞĞÁËÁ½´Î£¨¿ÉÄܲ¢²»ÊÇÓĞÒâÒªÕâô×ö£©µÄÎÊÌâÈÔÈ»´æÔÚ¡£ Êǵģ¬ÎÒȷʵ֪µÀÓĞĞ©ÌØÊâµÄºê²¢²»»áµ¼ÖÂC/C++Ô¤´¦ÀíºêÕâÑùµÄÎÊÌâ¡£µ«ÊÇ£¬ÎÒÎŞĞÄÈ¥·¢Õ¹C++Öеĺꡣ×÷ÎªÌæ´ú£¬ÎÒÍÆ¼öʹÓÃC++ÓïÑÔÖкÏÊʵŤ¾ß£¬ÀıÈçÄÚÁªº¯Êı£¬Ä£°å£¬¹¹Ô캯Êı£¨ÓÃÀ´³õʼ»¯£©£¬Îö¹¹º¯Êı£¨ÓÃÀ´Çå³ı£©£¬Òì³££¨ÓÃÀ´Í˳öÉÏÏÂÎÄ»·¾³£©£¬µÈµÈ¡£

lixuefeng @ 13:53 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-05-21 Ten things Google has found to be true http://www.google.com/corporate/tenthings.html

lixuefeng @ 13:29 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-04-24 ×ÀÃælinux½«»á´Ù½øÎ¢Èí´´Ğ ¶ÔÓÚÊг¡À´Ëµ,ĞèÒªµÄ²»ÊÇ¢¶Ï,¶øÊǾºÕù. ÓĞÁ˾ºÕù,Óû§¾ÍÓĞÁ˸ü¶àÑ¡ÔñµÄȨÀû,¿ª·¢É̾ͱØĞë²»¶ÏµÄ´´ĞÂ,¿ª·¢³ö¸üºÃµÄ²úÆ·. ÕâÑùÒ»·½ÃæÊÇ´Ù½øÁËÕâ¸öĞĞÒµµÄ·¢Õ¹,ÁíÒ»·½ÃæÓû§»á×îÖÕÊÜÒæ. Desktop Linux 'will force Microsoft to innovate'

lixuefeng @ 13:02 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-04-24 IT£º±ê×¼¾ÍÊÇÊг¡ µÃ±ê×¼ÕßµÃÌìÏ (ת) ¡¡¡¡ÑÇÖŞIT²úÒµÅ·¢Õ¹µÄÏÖʵ±³ºóÓĞÒ»°Ñ¡°Ë«Èн£¡±¡ª¡ªÔÚĿǰÇé¿öÏ£¬¾ø´ó¶àÊı²úƷʵ¼ÊÉÏÊǰ´ÕÕÎ÷·½¹ú¼ÒÌØ±ğÊÇÃÀ¹úµÄ¼¼Êõ±ê×¼½øĞĞÉú²ú£¬¶ÌÆÚ¿´£¬ÊǽÚÔ¼ÁË¿ª·¢³É±¾£¬Ñ¸ËÙÀ©´óÊг¡·İ¶î£¬µ«´Ó³¤Ô¶µÄ½Ç¶È£¬ÕâÖÖ¡°¸ú½ø¡±»áÈÃÆóÒµÂÙΪ±ğ¹úµÄ¡°´ò¹¤×Ğ¡±£¬ÉõÖÁÍşĞ²¹ú¼Ò°²È«ºÍÀûÒæ¡£ ¡¡¡¡¡°ÈıÖØ°şÏ÷¡± ¡¡¡¡Ê®¼¸Äêǰ»¹ÊÇÒ»¼ÒĞ¡¹«Ë¾µÄÃÀ¹ú¸ßͨ£¬Èç½ñƾ½èÔÚCDMAÊÀ½çÖеľø¶Ô»°ÓïȨ£¬ ¡°×øÔÚ¼ÒÀï¾Í¿ÉÒÔÎÈÏí¾Ş¶î¹©·î¡±¡ª¡ªÆäÖĞÏ൱һ²¿·ÖÊÇÀ´×ÔÑÇÖŞµÄÖйúºÍº«¹ú£¡ÈÕǰ£¬¸ßͨԭ´óÖĞ»ªÇø×ܲÃÀ×Ãù¶Ô¡¶ITʱ´úÖÜ¿¯¡·µÄ¼ÇÕß˵£º¡°ÔÚ֪ʶ²úȨתÈÃÉÏ£¬¸ßͨ¹«Ë¾ÖÁÉÙ¶ÔÊÖ»ú¿ª·¢ÉÌ´æÔÚ¡®ÈıÖØ°şÏ÷¡¯¡£¡± ¡¡¡¡¸ßͨĿǰֻ¿ª·¢CDMAÒÆ¶¯Í¨ĞÅϵͳ¼¼Êõ£¬²¢²»Ö±½ÓÉú²ú³ÉÆ·£¬µ«È´ÓµÓĞ1400¶àÏîCDMA·½ÃæµÄרÀû¡£°´ÕÕ¸ßͨ¹«Ë¾µÄ¹æ¶¨£¬È«ÊÀ½ç²»¹ÜÊÇÉú²úCDMAϵͳÉ豸»¹ÊÇÊÖ»úµÄ¹«Ë¾£¬¶¼Òª½»ÄÉ´óÔ¼1ÒÚÔªÈËÃñ±ÒµÄ¡°ÈëÃÅ·Ñ¡±£¬²ÅÄܽøÈëÕâÒ»ĞĞÒµ¡£Õ⻹²»ËãÍ꣺Éú²ú³§¼Ò»¹±ØĞ빺Âò¸ßͨ¹«Ë¾µÄоƬ£¬²¢ÇÒ°´ÏúÊÛ¶î¸ø¸ßͨÌá³É£¨Ô¼5%ÖÁ8%£©¡£´ËÍ⣬ΪÁËÉı¼¶Ö§³ÖоƬµÄÈí¼ş£¬CDMAÊÖ»úÉú²úÉÌÿһ´Î¶¼ÒªÖ§¸¶¼¸Ê®ÍòÃÀÔªµÄÊÚȨ·Ñ¡£ ¡¡¡¡¸ßͨµÄ¹ÊÊ»¹Ëã²»ÉÏ×î¾­µä£¬ÆäʵÃÀ¹úÄܳưÔÊÀ½çIT²úÒµ£¬½ö¿¿Î¢ÈíºÍÓ¢ÌØ¶ûµÄ¼¼Êõ±ê×¼£¬¾ÍÒѾ­¿ØÖÆÁËÊÀ½çÈíÓ²¼şÊг¡60%µ½80%µÄ·İ¶î¡£ ¡¡¡¡ÃÀ¹úÁª°î´¢±¸Î¯Ô±»áÖ÷ϯ¸ñÁÖ˹ÅË˵£º¡°ÔÚ¹ıÈ¥µÄ100ÄêÀÃÀ¹úµÄ¹úÃñÉú²ú×ÜÖµÔö³¤ÁË20±¶£¬µ«ÃÀ¹úµÄÉú²úÁ¿²¢²»±È100Äêǰ¶à£¬¾ø´ó¶àÊıµÄÔö³¤À´×ÔÈÚÈë²úÆ·ºÍ·şÎñÖеÄ֪ʶ¡£¡± ¡¡¡¡¡°ÖªÊ¶¡±ÊÇʲô£¿Ò»¸ö×îʵ¼ÊµÄ´ğ°¸¾ÍÊÇĞÎĞÎɫɫµÄ¡°±ê×¼¡±£¡ÈıÁ÷ÆóÒµÂô¿àÁ¦£¬¶şÁ÷ÆóÒµÂô²úÆ·£¬Ò»Á÷ÆóÒµÂô±ê×¼¡ª¡ª¡ª¹«Àí¾ÍÊÇ¡°µÃ±ê×¼ÕßµÃÌìÏ¡±£¡ ¡¡¡¡±ÚÀİ£¡»¹ÊDZÚÀİ£¡ ¡¡¡¡ÈëÊÀÒÔºó£¬ÖйúÈËÌıµÃ×î¶àµÄÒ»¸ö´ÊÊÇ¡°±ÚÀİ¡±£¬¾İ˵ÕâÊǹú¼Ê¾­¼Ã×î³£¼ûµÄÓÎÏ·¹æÔò¡£ÓëÖ®Ïà¹ØµÄÊÇ£¬¾ø´ó¶àÊıµÄÑÇÖŞ·¢Õ¹Öйú¼Ò£¬ÔÚ¸ûÔÅ×Ô¼ºµÄIT²úҵʱ£¬ÔâÓö×î¶àµÄ£¬»¹ÊDZÚÀİ¡ª¡ª¡ª¼¼Êõ±ê×¼ĞγɵıÚÀİ¡£ ¡¡¡¡ÏÖʵÈç´Ë£ºÔÚĞÅÏ¢¼¼Êõ±ê×¼ÁìÓò£¬»ù±¾ÉÏÊÇ·¢´ï¹ú¼ÒһͳÌìÏ£¬ËûÃÇÆ¾½èÆäĞÅÏ¢¼¼ÊõÓÅÊÆ£¬²»¶ÏÉèÖúÍÀûÓÃĞÅÏ¢¼¼Êõ±ÚÀݶԱğ¹úĞÅÏ¢²úÆ·³ö¿Ú½øĞĞÏŞÖÆ£¬²¢ÇÒÀûÓÃÆäÔÚ¹ú¼Ê±ê×¼»¯»ú¹¹ÖеÄÁ쵼Ȩ£¬¾¡¿ÉÄܵؽ«ÓĞÀûÓÚ±¾¹úµÄĞÅÏ¢¼¼Êõ·¨¹æ¡¢±ê×¼¼°¼ì²â·½·¨ÄÉÈë¹ú¼Ê±ê×¼¡£ ¡¡¡¡Öйúµç×ÓĞÅÏ¢²úÒµ·¢Õ¹Ñо¿ÔºÍ¯ÓкÃÏÈÉúÈÏΪ£¬ĞÅÏ¢¼¼Êõ±ê×¼µÄʵÖʺͺËĞľÍÊÇĞÅÏ¢¼¼ÊõÌåϵÖжÔÓÚĞÅÏ¢¼¼ÊõµÄ֪ʶ²úȨ£¬ĞÅÏ¢¼¼Êõ¢¶ÏÊÇͨ¹ı֪ʶ²úȨ±£»¤À´ÊµÏֵġ£ÓÉÓÚ֪ʶ²úȨ¾ßÓеØÓòĞÔºÍÅÅËüĞÔ£¬Ò»µ©ÕâÖÖ±ê×¼µÃµ½ÆÕ¼°£¬»áĞγÉÒ»¶¨³Ì¶ÈµÄ¢¶Ï£¬Ö»½«·ûºÏ×Ô¼º±ê×¼µÄ²úÆ··îΪÕı×ڵĵմ«£¬´Ó¶ø´ïµ½ÅųâÒ켺µÄÄ¿µÄ¡£ÁíÒ»·½Ã棬¼¼Êõ±ê×¼Ò²³ÉΪ·Ç¹ØË°±ÚÀݵÄÖ÷ÒªĞÎʽ£¬Ğí¶à·¢´ï¹ú¼Ò½«Ä¿¹âתÏò±ê×¼£¬½¨Á¢ÁË×Ô¼ºµÄóÒ×¼¼Êõ±ÚÀİÌåϵ¡£¾İͳ¼Æ£¬·¢Õ¹Öйú¼ÒÊÜóÒ×¼¼Êõ±ÚÀİÏŞÖÆµÄ°¸Àı£¬´óÔ¼ÊÇ·¢´ï¹ú¼ÒµÄ3.5±¶¡£ ¡¡¡¡³åÆÆ¼¼Êõ±ê×¼±ÚÀݲ¢·ÇÒ»¼şÒ×Ê£¬ÒòΪĿǰµÄĞÎÊÆÊÇ·¢´ï¹ú¼Ò¼¸ºõÕ¼ÁËĞÅϢͨĞźÍĞÅÏ¢´¦ÀíÁìÓò±ê×¼»¯ÂÛ̳½ü97%µÄÁìÓò£¬ÆäÖĞÃÀ¹úÕ¼58%£¬¶øÑÇÖŞµØÇø·¢Õ¹Öйú¼ÒÖ»ÊÇÔÚ¿ÉÁ¯µÄ3%ÀïÃæÔÙ·ÖÒ»±­¸ş¡£ ¡¡¡¡¡°ĞÄÔࡱµÄÔ¤¾¯ ¡¡¡¡ĞÅϢʱ´úÇø±ğ´«Í³¹¤ÒµÊ±´úÒ»¸öÃ÷ÏԵıêÖ¾ÊÇ£º¸÷¹úµÄ¹ú¼ÒÖ÷ȨÒÔ¼°ĞÅÏ¢×ÊÔ´ÊDz»¿ÉÄÜÓô«Í³µÄ¹ú¼Ò±ß½çÀ´±£»¤µÄ¡£ÔÚĞÅϢʱ´ú£¬Ò»µ©È«ÇòĞÅÏ¢µÄ¿ØÖÆÈ¨ÕÆÎÕÔÚÉÙÊı¹ú¼ÒÊÖÖĞ£¬ÕâĞ©¹ú¼Ò¾Í¿ÉÒÔËæÊ±ËæµØ·Ç³£·½±ãµØÇÖÕ¼ÆäËû¹ú¼ÒµÄĞÅÏ¢×ÊÔ´£¬°Ñ±ğ¹úµÄĞÅÏ¢×ÊÔ´¾İΪ¼ºÓĞ¡£ ¡¡¡¡ÓĞÈËÔø¾­×ö¹ıÕâÑùÒ»¸ö±ÈÓ÷£¬ÔÚĞÅÏ¢²úÒµ¸ßËÙ·¢Õ¹µÄ½ñÌ죬ӵÓоø¶ÔĞÅÏ¢¼¼Êõ±ê×¼×ÊÔ´µÄ·¢´ï¹ú¼Ò¾ÍÏñÊÇ´«ÆæÀïµÄ¡°¿Ö²ÀÒ½Éú¡±£¬¸ø±ğÈË»»ÉÏËûÑĞÖÆµÄ¡°ĞÄÔࡱ£¬ÉÔ²»ÈçÒ⣬Ëû¾ÍÈÃÆäÍ£Ö¹Ìø¶¯¡£ ¡¡¡¡Õâ²¢·ÇËÊÈËÌıÎÅ£¬ÎÒ¹úĞÅÏ¢°²È«ÁìÓò×ÊÉî¿ÆÑ§¼Ò¡¢Öйú¿ÆÑ§ÔºÑо¿ÉúÔºĞÅÏ¢°²È«¹ú¼ÒÖØµãʵÑéÊÒÑо¿Ô±ÇØÎÄÁÁ½ÌÊÚ˵£¬¡°Ä¿Ç°£¬ÎÒ¹úʹÓõļÆËã»ú£¬ºËĞIJ¿¼ş¡®Ğ¾Æ¬¡¯£¬¼¸ºõ¶¼ÊÇ´Ó¹úÍâ´ó¹«Ë¾½ø¿ÚµÄ¡±£¬¡°ÃÀ¹úºÜÔç¾ÍÈÏʶµ½ÁËĞÅÏ¢°²È«Óë¹ú¼ÒÕûÌåÀûÒæºÍ¹ú·ÀµÄ½ôÃÜÁªÏµ£¬²ÉÈ¡ÁËһϵÁĞ´ëÊ©À´¼ÓÇ¿ÆäĞÅÏ¢²úÒµÔÚÈ«ÇòµÄ¢¶ÏµØÎ»£¬Í¬Ê±£¬Õş¸®²¿ÃÅÖ÷ÒªÊÇͨ¹ıNSA£¬¼´¹ú¼Ò°²È«¾Ö¶ÔĞÅÏ¢²úҵʵĞĞÑϸñµÄ¿ØÖÆ£¬NSAÅɳö¼È¶®ÃÜÂë¡¢µç×ÓÕì²ìÒµÎñ£¬ÓÖ¶®°ëµ¼Ìå¼¼ÊõµÄר¼ÒפÔÚ¸÷´ó¹«Ë¾£¬ÆäÈÎÎñ¾ÍÊǶÔÏúÍùÈ«ÇòµÄĞÅÏ¢²úÆ·£¬ÌرğÊÇ´ó¹æÄ£¼¯³Éµç·оƬµÈ¹Ø¼ü²¿¼ş£¬°²×°ÁËNSAĞèÒªµÄºóÃÅ¡±¡£¡°ÕâĞ©ºóÃŵÄ×÷Óã¬Ò»µ«NSA¸Ğµ½ĞèÒªËѼ¯Ãô¸Ğ»ò»úÃÜĞÅϢʱ£¬Í¨¹ıÌØÊâÊÖ¶ÎÆô¶¯ºóÃÅ·¢»ØĞ¾Æ¬Ëù´¦ÀíµÄ¸÷ÖÖÊı¾İ£¬»òÕߣ¬Ò»µ«´òÆğÕÌÀ´£¬Æô¶¯ºóÃÅʹ¸ÃоƬʧȥ¹¤×÷ÄÜÁ¦¡±¡£ ¡¡¡¡ÕâÊÇÒ»ÖÖ²»ÈݼÙÉèµÄÑϾşÏÖʵ£¬ÊÔÏ룬˭ԸÒâÈÃ×Ô¼ºµÄĞÄÔàÊÜÖÆÓÚÈËÄØ£¿µ«ÎÊÌâÊÇ£¬Òª¸Ä±äÏÖʵ£¬Äã¾Í±ØĞ뾡×î´óŬÁ¦ÕùÈ¡×Ô¼ºÔÚĞÅÏ¢²úÒµ¼¼Êõ±ê×¼ÉϵÄÖÆ¶¨È¨£¬·ñÔò£¬ÌìÆ½ÓÀÔ¶»áÇãÏòÓÚÇ¿Õߣ¡ ¡¡¡¡ÑÇÖŞÉùÒô ¡¡¡¡ĞÅÏ¢¼¼Êõ±ê×¼µÄ¾ºÕù£¬¾ÍÏñÊÇÒ»³öûÍêûÁ˵ÄÀ­¾âÕ½£¡ÈõÊÆÕß²»Ï£ÍûÇ¿ÕߺâÇ¿£¬¼ÈµÃÀûÒæÕßµ±È»Ï£ÍûÓÀÔ¶Õ¼¾İ±ê×¼µÄ»°Óï°ÔȨ¡£ÕıÊÇÔÚÕâÒ»¾ºÕùÌ¬ÊÆÏ£¬ÖйúÀúÊ·Éϵġ°ºÏ×İÁ¬ºá¡±¹ÊÊÂͬÑùÑİÒåÔÚÏÖ´úIT²úÒµÖĞ¡£ ¡¡¡¡Æ²¿ªÑÇÖŞ¹ú¼Ò¸÷×ÔÔÚĞÅÏ¢¼¼Êõ±ê×¼ÉϵĽøÈ¡²»Ì¸£¬Ò»ÖÖ»ùÓÚ¹²Í¬ÀûÒæÉϵĿ¼ÂÇ£¬Ò²Ê¹µÃÑÇÖŞÒ»Ğ©¹ú¼ÒÔÚĞÅÏ¢¼¼Êõ±ê×¼¾ºÕù·½Ãæ×ßµ½Ò»Æğ¡£ ¡¡¡¡2003Äê11ÔÂÊÇ΢Èí£Ã£Å£ÏÊ·µÙ·ò¡¤±«¶ûĬ±¸¸ĞÆ£¾ëµÄÒ»¸öÔ£¬ÔÚ11ÔÂ20ÈÕµÖ´ï±±¾©Ö®Ç°£¬±«¶ûĬ¸Õ¸ÕÔÚÈÕ±¾Í£ÁôÁ˼¸Ìì¡£¶øÕâÁ½¸ö¹ú¼ÒµÄ¸ß¼¶¹ÙÔ±¸ÕÔÚÁ½¸ö°ëÔÂ֮ǰ£¬ÁªºÏº«¹úÕş¸®ÉÌÌÖÁËÈı¹ú¹²½¨LinuxµÄ¿ÉÄÜĞÔ¡£ ¡¡¡¡ÊÂʵÉÏ£¬ÔçÔÚ2003Äê2Ô£¬ÖĞÈÕº«¾ÍÒѾ­½á³ÉÁËLinux²úҵͬÃË¡£ÕâÊÇÒ»¸ö¼«¾ßÏóÕ÷ÒâÒåµÄ²úҵͬÃË£¬Ëü×î»ı¼«µÄÒâÒåÊÇÌôÕ½ÃÀ¹ú΢ÈíµÄ±ê×¼°ÔȨ¡£´Ëǰ£¬º«¹úÂÊÏÈÌá³ö¡°¿ª·ÅÔ´ÂëÈı¹úͬÃË¡±£¬¶øÈı¹úÕş¸®£¬ÔòÔÚ±³ºóÌá¹©Õş²ßºÍ×ʽğ·½ÃæµÄÖ§³Ö¡£ ¡¡¡¡ÀàËÆ¡°¿ª·ÅÔ´ÂëÈı¹úͬÃË¡±ÕâÑùµÄĞÎʽֻÊÇÑÇÖŞ¹ú¼ÒÔÚĞÅÏ¢²úÒµ¼¼Êõ±ê×¼¾ºÕùÖĞ·¢³öµÄÄź°Ö®Ò»¡£°üÀ¨Ó¡¶È¡¢ĞÂ¼ÓÆÂÉõÖÁÓ¡¶ÈÄáÎ÷ÑÇ¡¢ÂíÀ´Î÷ÑǵÈÔÚÄÚµÄÑÇÖŞ¹ú¼ÒÈç½ñ¶¼½ôÂàÃܹļӽôÇÀÕ¼ÊôÓÚ×Ô¼ºµÄĞÅÏ¢²úÒµ±ê×¼ÖÆ¶¨È¨¡£ ¡¡¡¡±ê×¼¾ÍÊÇÊг¡£¡±ê×¼¾ÍÊÇÁ¦Á¿£¡ÔÚÕâÒ»µãÉÏ£¬ÑÇÖŞ¹ú¼Ò²»»á´æÔÚÒìÒ飬ÑÇÖŞ¼ÈÈ»±»¿´×÷ÊÀ½çÉÏIT²úÒµ×î¾ßÊг¡Ç±Á¦µÄµØÇø£¬ÓÖÕı·ê¸÷ÖÖĞÅÏ¢¼¼Êõ²»¶ÏÍÆ³Â³öĞ£¬ĞÂÒµÎñ²»¶ÏÓ¿ÏÖÖ®¼Ê£¬¸÷¹úÔÚĞÅÏ¢¼¼Êõ±ê×¼ÖÆ¶©·½Ãæ¼ÓÇ¿½»Á÷ÎŞÒÉÊÇ×îÃ÷ÖǵÄÑ¡Ôñ£¬Ò²Ö»ÓĞÕâÑù£¬²ÅÄÜÈü¼Êõ±ê×¼ÔÚ´Ù½øÑÇÖŞµØÇøÃ³Ò×·¢Õ¹¡¢¹æ·¶Êг¡ĞĞΪ¡¢Ìá¸ß²úÒµ¾ºÕùÁ¦¡¢Íƶ¯¼¼Êõ½ø²½ÉõÖÁº´ÎÀ¹ú¼ÒÖ÷ȨµÈ·½Ãæ·¢»Ó¸üÖØÒªµÄ×÷Óã¡£¨°Ø±ò£© ¡¡ º£ÄÏÈÕ±¨ À´Ô´£º ¡¤Öйú²Æ¾­ĞÅÏ¢Íø¡¤ CHINA FINANCE INFORMATION NETWO

lixuefeng @ 12:38 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-04-22 ¿çƽ̨µÄÔÚÏßWYSIWYGÍøÒ³±à¼­Æ÷----HTMLArea http://www.interactivetools.com/products/htmlarea/ htmlArea is a WYSIWYG editor replacement for any field. Ãâ·ÑµÄ(»ùÓÚBSDĞ­Òé),×îа汾3.0betaÖ§³ÖIE 5.5+ (Windows)/Mozilla 1.3 (all OS) ¿çƽ̨¹¦ÄÜ¡£ ÔÚMozilla1.6ÉϵÄʹÓÃЧ¹û: 1¡¢´ø±í¸ñ±à¼­¹¦ÄÜ 2¡¢´øÓÒ¼ü²Ëµ¥ºÍ±í¸ñ±à¼­ ÔÚinteractivetools.comÖĞ¿ÉÒÔÕÒµ½¹ØÓÚhtmlareaµÄ¸ü¶àÄÚÈݼ°ÔÚÏßÑİʾ.

lixuefeng @ 15:39 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-04-22 GooOS, the Google Operating System http://blog.topix.net/archives/000016.html GoogleµÄ¹¤³ÌʦÔÚÑо¿Ê²Ã´£¿ GoogleµÄ¹¤³Ìʦ·¢±íµÄ²¿·ÖÂÛÎļ¯.

lixuefeng @ 10:24 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-04-17 Movable Type ÍêÈ«ÊÖƒÔ http://mtbook.net/

lixuefeng @ 14:30 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) 2004-04-17 һƪ"ÈçºÎ°²×°BLOG·şÎñÆ÷" http://www.jeast.net/garden/archives/000704.html http://www.jeast.net/garden/

lixuefeng @ 13:44 | ±¾ÆªÁ´½Ó | ±à¼­ | ÆÀÂÛ(0) | ÒıÓÃ(Trackback0) ÈÕÀú 2004 Äê 9 Ô Sun Mon Tue Wen Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ËÑË÷ ×î½ü¸üĞ Gmail·¢ËÍÓʼşÊ±µÄĞ¡¼¼ÇÉ blogspot.com¿ÉÒÔ·ÃÎÊÁË Gmail Ïà¹Ø¹¤¾ß ûÏëµ½½ñÌì¾ÍÓĞGmailÑûÇëȨÁË ½ñÌìÎÒÓĞGmailÓÊÏäÓÃÁË GoogleË͸øÑŵä°ÂÔË»áµÄÀñÎï ͼƬ·ÅÄÄ photoshop7.0ÖеIJʵ° ÆÙ²¼ Ï£ÍûÃ÷Ìì²»ÒªÏÂÓê ×îĞÂÆÀÂÛ lixuefeng : ÎÒµÄÑûÇëÔçÒÑËÍÍê. schaulyn : ÄúºÃ£º Äã. lixuefeng : ×îеÄÎÒûÓĞ£¬ºÇ. ysb : ÄÜ·ñ°Ñ×î½ü¸üеÄ. lixuefeng : Äãµ±°æÖ÷ÁË,×£ºØ!. morinson : ÏĞÀ´ÎŞÊ£¬µ½´ËĞ¡. lixuefeng : To ryana: lixuefeng : ллryanaµÄ¹Ûµã£. ryana : ^_^ ºÃÏë°ïÄãŶ£¬. ryana : ллÄãĞÀÉÍÎÒµÄbl. ´æµµ ÎÒµÄÁ´½Ó SourceForge.net OSNews Slashdot IBM¿ª·¢ÕßÖĞÎÄ×ÊÔ´ CNBlog.orgµÄĞĵü¯ leylop UIÖ®ÂÃ Íø»ÔµÄBLOG ³µ¶« ÖñËñ³´Èâ ·çÓïÕß Real-Time Rendering HUMUS(Èıά±à³Ì½ø½×) ÉãÓ°ÍøĞ£ <¹ÜÀí½çÃæ> © lixuefeng.blogbus.com Powered by Blogbus.com