ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

MoreEffectiveC++£º·ÀÖ¹×ÊԴй©(Ò»)
2014-11-15 18:00:27 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:48´Î
Tags£ºMoreEffectiveC ·ÀÖ¹ ×ÊÔ´ й©

¡¡Èç¹ûÄãÕýÔÚ¿ª·¢Ò»¸ö¾ßÓжàýÌ幦ÄܵÄͨѶ¼³ÌÐò¡£Õâ¸öͨѶ¼³ýÁËÄܴ洢ͨ³£µÄÎÄ×ÖÐÅÏ¢ÈçÐÕÃû¡¢µØÖ·¡¢µç»°ºÅÂëÍ⣬»¹ÄÜ´æ´¢ÕÕÆ¬ºÍÉùÒô(¿ÉÒÔ¸ø³öËûÃÇÃû×ÖµÄÕýÈ··¢Òô)¡£


¡¡¡¡ÎªÁËʵÏÖÕâ¸öͨÐż£¬Äã¿ÉÒÔÕâÑùÉè¼Æ:


class Image { // ÓÃÓÚͼÏñÊý¾Ý
¡¡public:
¡¡¡¡Image(const string& imageDataFileName);
¡¡¡¡...
};


class AudioClip { // ÓÃÓÚÉùÒôÊý¾Ý
¡¡public:
¡¡¡¡AudioClip(const string& audioDataFileName);
¡¡¡¡...
};


class PhoneNumber { ... }; // ÓÃÓÚ´æ´¢µç»°ºÅÂë
class BookEntry { // ͨѶ¼ÖеÄÌõÄ¿
¡¡public:
¡¡¡¡BookEntry(const string& name,
¡¡¡¡const string& address = "",
¡¡¡¡const string& imageFileName = "",
¡¡¡¡const string& audioClipFileName = "");
¡¡¡¡~BookEntry();
¡¡¡¡// ͨ¹ýÕâ¸öº¯Êý¼ÓÈëµç»°ºÅÂë
¡¡¡¡void addPhoneNumber(const PhoneNumber& number);
¡¡¡¡...
¡¡private:
¡¡¡¡string theName; // È˵ÄÐÕÃû
¡¡¡¡string theAddress; // ËûÃǵĵØÖ·
¡¡¡¡list thePhones; // ËûµÄµç»°ºÅÂë
¡¡¡¡Image *theImage; // ËûÃǵÄͼÏñ
¡¡¡¡AudioClip *theAudioClip; // ËûÃǵÄÒ»¶ÎÉùÒôƬ¶Î
};


¡¡¡¡Í¨Ñ¶Â¼µÄÿ¸öÌõÄ¿¶¼ÓÐÐÕÃûÊý¾Ý£¬ËùÒÔÄãÐèÒª´øÓвÎÊýµÄ¹¹Ô캯Êý(²Î¼ûÌõ¿î3)£¬²»¹ýÆäËüÄÚÈÝ(µØÖ·¡¢Í¼ÏñºÍÉùÒôµÄÎļþÃû)¶¼ÊÇ¿ÉÑ¡µÄ¡£×¢ÒâÓ¦¸ÃʹÓÃÁ´±íÀà(list)´æ´¢µç»°ºÅÂ룬Õâ¸öÀàÊDZê×¼C++Àà¿â(STL)ÖеÄÒ»¸öÈÝÆ÷Àà(container classes)¡£(²Î¼ûEffective C++Ìõ¿î49 ºÍ±¾ÊéÌõ¿î35)


¡¡¡¡±àдBookEntry ¹¹Ô캯ÊýºÍÎö¹¹º¯Êý£¬ÓÐÒ»¸ö¼òµ¥µÄ·½·¨ÊÇ:


BookEntry::BookEntry(const string& name,const string& address,
¡¡const string& imageFileName,
¡¡Const string& audioClipFileName)
¡¡: theName(name), theAddress(address),
¡¡theImage(0), theAudioClip(0)
¡¡{
¡¡¡¡if (imageFileName != "") {
¡¡¡¡¡¡theImage = new Image(imageFileName);
¡¡¡¡}
¡¡¡¡if (audioClipFileName != "") {
¡¡¡¡¡¡theAudioClip = new AudioClip(audioClipFileName);
¡¡¡¡}
¡¡}
¡¡BookEntry::~BookEntry()
¡¡{
¡¡¡¡delete theImage;
¡¡¡¡delete theAudioClip;
¡¡}


¡¡¡¡¹¹Ô캯Êý°ÑÖ¸ÕëtheImageºÍtheAudioClip³õʼ»¯Îª¿Õ£¬È»ºóÈç¹ûÆä¶ÔÓ¦µÄ¹¹Ô캯Êý²ÎÊý²»Êǿգ¬¾ÍÈÃÕâЩָÕëÖ¸ÏòÕæÊµµÄ¶ÔÏó¡£Îö¹¹º¯Êý¸ºÔðɾ³ýÕâЩָÕ룬ȷ±£BookEntry¶ÔÏ󲻻ᷢÉú×ÊԴй©¡£ÒòΪC++È·±£É¾³ý¿ÕÖ¸ÕëÊǰ²È«µÄ£¬ËùÒÔBookEntryµÄÎö¹¹º¯ÊýÔÚɾ³ýÖ¸Õëǰ²»ÐèÒª¼ì²âÕâЩָÕëÊÇ·ñÖ¸ÏòÁËijЩ¶ÔÏó¡£


¡¡¡¡¿´ÉÏÈ¥ºÃÏñÒ»ÇÐÁ¼ºÃ£¬ÔÚÕý³£Çé¿öÏÂȷʵ²»´í£¬µ«ÊÇÔÚ·ÇÕý³£Çé¿öÏÂ(ÀýÈçÔÚÓÐÒì³£·¢ÉúµÄÇé¿öÏÂ)ËüÃǿ֞Ͳ»»áÁ¼ºÃÁË¡£


¡¡¡¡ÇëÏëÒ»ÏÂÈç¹ûBookEntryµÄ¹¹Ô캯ÊýÕýÔÚÖ´ÐÐÖУ¬Ò»¸öÒì³£±»Å׳ö£¬»á·¢ÉúʲôÇé¿öÄØ :


if (audioClipFileName != "") {
¡¡theAudioClip = new AudioClip(audioClipFileName);
}


¡¡¡¡Ò»¸öÒì³£±»Å׳ö£¬¿ÉÒÔÊÇÒòΪoperator new(²Î¼ûÌõ¿î8)²»ÄܸøAudioClip·ÖÅä×ã¹»µÄÄڴ棬Ҳ¿ÉÒÔÒòΪAudioClipµÄ¹¹Ô캯Êý×Ô¼ºÅ׳öÒ»¸öÒì³£¡£²»ÂÛʲôԭÒò£¬Èç¹ûÔÚBookEntry¹¹Ô캯ÊýÄÚÅ׳öÒì³££¬Õâ¸öÒì³£½«´«µÝµ½½¨Á¢BookEntry¶ÔÏóµÄµØ·½(ÔÚ¹¹Ô캯ÊýÌåµÄÍâÃæ¡£ ÒëÕß×¢)¡£


¡¡¡¡ÏÖÔÚ¼ÙÉ轨Á¢theAudioClip¶ÔÏó½¨Á¢Ê±£¬Ò»¸öÒì³£±»Å׳ö(¶øÇÒ´«µÝ³ÌÐò¿ØÖÆÈ¨µ½BookEntry¹¹Ô캯ÊýµÄÍâÃæ)£¬ÄÇô˭À´¸ºÔðɾ³ýtheImageÒѾ­Ö¸ÏòµÄ¶ÔÏóÄØ ´ð°¸ÏÔȻӦ¸ÃÊÇÓÉBookEntryÀ´×ö£¬µ«ÊÇÕâ¸öÏ뵱ȻµÄ´ð°¸ÊÇ´íµÄ¡£BookEntry¸ù±¾²»»á±»µ÷Óã¬ÓÀÔ¶²»»á¡£


¡¡¡¡C++½ö½öÄÜɾ³ý±»ÍêÈ«¹¹ÔìµÄ¶ÔÏó(fully contructed objects), Ö»ÓÐÒ»¸ö¶ÔÏóµÄ¹¹Ô캯ÊýÍêÈ«ÔËÐÐÍê±Ï£¬Õâ¸ö¶ÔÏó²ÅÄܱ»ÍêÈ«µØ¹¹Ôì¡£ËùÒÔÈç¹ûÒ»¸öBookEntry¶ÔÏób×öΪ¾Ö²¿¶ÔÏó½¨Á¢£¬ÈçÏÂ:


void testBookEntryClass()
{
¡¡BookEntry b("Addison-Wesley Publishing Company","One Jacob Way, Reading, MA 01867");
¡¡...
}


¡¡¡¡²¢ÇÒÔÚ¹¹ÔìbµÄ¹ý³ÌÖУ¬Ò»¸öÒì³£±»Å׳ö£¬bµÄÎö¹¹º¯Êý²»»á±»µ÷Ó᣶øÇÒÈç¹ûÄãÊÔͼ²ÉÈ¡Ö÷¶¯Êֶδ¦ÀíÒì³£Çé¿ö£¬¼´µ±Òì³£·¢Éúʱµ÷ÓÃdelete£¬ÈçÏÂËùʾ:


void testBookEntryClass()
{
¡¡BookEntry *PB = 0;
¡¡try {
¡¡¡¡pb = new BookEntry("Addison-Wesley Publishing Company","One Jacob Way, Reading, MA 01867");
¡¡¡¡...
¡¡}
¡¡catch (...) { // ²¶»ñËùÓÐÒì³£
¡¡¡¡delete pb; // ɾ³ýpb,µ±Å׳öÒ쳣ʱ
¡¡throw; // ´«µÝÒì³£¸øµ÷ÓÃÕß
}


delete pb; // Õý³£É¾³ýpb
}


¡¡¡¡Äã»á·¢ÏÖÔÚBookEntry¹¹Ô캯ÊýÀïΪImage·ÖÅäµÄÄÚ´æÈԾɱ»¶ªÊ§ÁË£¬ÕâÊÇÒòΪÈç¹ûnew²Ù×÷ûÓгɹ¦Íê³É£¬³ÌÐò²»»á¶Ôpb½øÐи³Öµ²Ù×÷¡£Èç¹ûBookEntryµÄ¹¹Ô캯ÊýÅ׳öÒ»¸öÒì³££¬pb½«ÊÇÒ»¸ö¿ÕÖµ£¬ËùÒÔÔÚcatch¿éÖÐɾ³ýËü³ýÁËÈÃÄã×Ô¼º¸Ð¾õÁ¼ºÃÒÔÍâûÓÐÈκÎ×÷Óá£ÓÃÁéÇÉÖ¸Õë(smart pointer)Ààauto_ptr(²Î¼ûÌõ¿î9)´úÌæraw BookEntry*Ò²²»»áҲʲô×÷Óã¬ÒòΪnew²Ù×÷³É¹¦Íê³Éǰ£¬Ò²Ã»ÓжÔpb½øÐи³Öµ²Ù×÷¡£
C++¾Ü¾øÎªÃ»ÓÐÍê³É¹¹Ôì²Ù×÷µÄ¶ÔÏóµ÷ÓÃÎö¹¹º¯ÊýÊÇÓÐһЩԭÒòµÄ£¬¶ø²»ÊǹÊÒâΪÄãÖÆÔìÀ§ÄÑ¡£Ô­ÒòÊÇ:ÔںܶàÇé¿öÏÂÕâô×öÊÇûÓÐÒâÒåµÄ£¬ÉõÖÁÊÇÓк¦µÄ¡£Èç¹ûΪûÓÐÍê³É¹¹Ôì²Ù×÷µÄ¶ÔÏóµ÷ÓÃÎö¹¹º¯Êý£¬Îö¹¹º¯ÊýÈçºÎÈ¥×öÄØ ½öÓеİ취ÊÇÔÚÿ¸ö¶ÔÏóÀï¼ÓÈëһЩ×Ö½ÚÀ´Ö¸Ê¾¹¹Ô캯ÊýÖ´ÐÐÁ˶àÉÙ²½ È»ºóÈÃÎö¹¹º¯Êý¼ì²âÕâЩ×Ö½Ú²¢ÅжϸÃÖ´ÐÐÄÄЩ²Ù×÷¡£ÕâÑùµÄ¼Ç¼»á¼õÂýÎö¹¹º¯ÊýµÄÔËÐÐËÙ¶È£¬²¢Ê¹µÃ¶ÔÏóµÄ³ß´ç±ä´ó¡£C++±ÜÃâÁËÕâÖÖ¿ªÏú£¬µ«ÊÇ´ú¼ÛÊDz»ÄÜ×Ô¶¯µØÉ¾³ý±»²¿·Ö¹¹ÔìµÄ¶ÔÏó¡£(ÀàËÆÕâÖÖÔÚ³ÌÐòÐÐΪÓëЧÂÊÕâ¼ä½øÐÐÕÛÖÔ´¦ÀíµÄÀý×Ó»¹¿ÉÒԲμûEffective C++Ìõ¿î13)


¡¡¡¡ÒòΪµ±¶ÔÏóÔÚ¹¹ÔìÖÐÅ׳öÒì³£ºóC++²»¸ºÔðÇå³ý¶ÔÏó£¬ËùÒÔÄã±ØÐëÖØÐÂÉè¼ÆÄãµÄ¹¹Ô캯ÊýÒÔÈÃËüÃÇ×Ô¼ºÇå³ý¡£¾­³£Óõķ½·¨ÊDz¶»ñËùÓеÄÒì³££¬È»ºóÖ´ÐÐһЩÇå³ý´úÂ룬×îºóÔÙÖØÐÂÅ׳öÒì³£ÈÃËü¼ÌÐø×ªµÝ¡£ÈçÏÂËùʾ£¬ÔÚBookEntry¹¹Ô캯ÊýÖÐʹÓÃÕâ¸ö·½·¨:


BookEntry::BookEntry(const string& name,
¡¡const string& address,
¡¡const string& imageFileName,
¡¡const string& audioClipFileName)
¡¡: theName(na

Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºÐÂÊÖÈëÃÅ£ºc++¾­µä ÏÂһƪ£ºC++ÖпØÖÆWindows¹Ø»úµÄʵÓü¼ÇÉ

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤HTTP Åc HTTPS µÄ²î„ (2025-12-25 21:19:45)
¡¤ÍøÕ¾°²È«±ØÐ޿ΣºÍ¼ (2025-12-25 21:19:42)
¡¤HTTPºÍHTTPS²î±ðÓжà (2025-12-25 21:19:39)
¡¤ÀûÓÃpython½øÐÐÊý¾Ý (2025-12-25 20:49:22)
¡¤ÈçºÎʹÓà python ÖÐ (2025-12-25 20:49:19)