²`«×±´¯ÁC++14 ( ²Åé ¦r) |
§@ªÌ¡G§d³¥ | Ãþ§O¡G1. -> µ{¦¡³]p -> C++ -> C++ |
ĶªÌ¡G |
¥Xª©ªÀ¡G¹q¤l¤u·~¥Xª©ªÀ | 3dWoo®Ñ¸¹¡G 53016 ¸ß°Ý®ÑÄy½Ð»¡¥X¦¹®Ñ¸¹¡I¡i¯Ê®Ñ¡j NT°â»ù¡G 640 ¤¸ |
¥Xª©¤é¡G7/1/2020 |
¶¼Æ¡G500 |
¥úºÐ¼Æ¡G0 |
|
¯¸ªø±ÀÂË¡G |
¦L¨ê¡G¶Â¥Õ¦L¨ê | »y¨t¡G ( ²Åé ª© ) |
|
¥[¤JÁʪ«¨® ¢x¥[¨ì§Úªº³Ì·R (½Ð¥ýµn¤J·|û) |
ISBN¡G9787121354984 |
§@ªÌ§Ç¡@|¡@ĶªÌ§Ç¡@|¡@«e¨¥¡@|¡@¤º®e²¤¶¡@|¡@¥Ø¿ý¡@|¡@§Ç |
(²Åé®Ñ¤W©Òz¤§¤U¸ü³sµ²¯Ó®É¶O¥\, ®¤¤£¾A¥Î¦b¥xÆW, YŪªÌ»Ýn½Ð¦Û¦æ¹Á¸Õ, ®¤¤£«OÃÒ) |
§@ªÌ§Ç¡G |
ĶªÌ§Ç¡G |
«e¨¥¡G±ÀÂ˧Ç1¡G¤@¨ÇÃö¤_C++ªº¤j¹ê¸Ü
§Ú¦b¥_¬ü³o´X¦~±¸Õ¤F¤W¦Ê¦ìÀ³¸uªÌ¡A³oÃ䪺¤½¥q¤j¦h·|ÅýÀ³¸uªÌ¦Û¿ï½sµ{»y¨¥¡C§Úª`·N¨ì¤@Ó²{¶H¡A§Y¨Ï¥ÎC++§@¬°±¸Õ»y¨¥ªºÀ³¸uªÌ¤ñ¨Ò«Ü§C¡A¤j¬ù¤£¨ì1/10¡A¦bÀ³©¡¥Í¤¤³oÓ¤ñ¨Ò§ó§C¡A»·»·¤£¦p§Ú¦«e¦b¤W®ü©M»´ä¨º´X¦~±¸Õªº±¡ªp¡C¦b±¸Õ¤¤¡A§Ú¤]¤£¦A¦Ò¹îC++»yªk©M¼Ð·Ç®wªºª¾ÃÑÂI¤F¡C¦]¬°¾Ú§Ú¤F¸Ñ¡A§Y«K¬O¥_¬üpºâ¾÷¬ì¯Z¥X¨ªºÀ³©¡¥Í¤]¤£¤@©w¦b¾Ç®Õ¾Ç¹LC++¡A¥L̾Dzߪº½sµ{»y¨¥¤@¯ë¥HJava©ÎPython¬°¥D¡AµM¦Z¦]¬°¾Þ§@¨t²Î©ÎÅé¨tµ²ºc½Òµ{»Ýn¡A·|¾Ç¤@ÂIC»y¨¥¡C³o¨Ç·s¤H°Ñ¥[¤u§@¤§¦Z¡A¦pªG¶µ¥Ø»Ýn¡A·|¥Î¨â¤T©Pªº®É¶¡¡A¦b즳ªº½sµ{»y¨¥°ò¦¤W§Ö³t¤JªùC++¡AµM¦Z¥é·Ó¶µ¥Ø²{¦³¥N½Xªº·®æ©M²ßºD¡A¶}©l¤W¤âC++½sµ{¡C³oºØ¾Ç²ß¤è¦¡ªºÀuÂI¬O¥D¦¸¤À©ú¡B«ÂI¬ð¥X¡B¦³ªº©ñ¥Ú¡C¬Û¤ñ¤§¤U¡A¨ä¥L±M·~ªº²¦·~¥Í´x´¤C++ªº¤ñ¨Ò´N§ó§C¤F¡A§Ú¨£¹L¤@¨Ç²Îp©ÎªÌ«H¸¹³B²z¤è¦Vªº³Õ¤h̲¦·~¤§¦Z¶i¤J¤u·~¬É¡A»Ýn§â¦Û¤vì¨Ó¥ÎR»y¨¥©ÎªÌMATLAB¹ê²{ªº¼Ò«¬©Îºâªk¥ÎC++«¼g¡A¨Ï¤§¿Ä¤J¤½¥qªº²£«~¡C¥¿¬O¦]¬°¦³³o¼Ëªº¶}µoªÌ¨Ï¥ÎC++¨Ó§¹¦¨¤u§@¤¤ªº¶}µo¥ô°È¡A¤~½á¤©¤F³oªù»y¨¥½´«kªº¥Í©R¤O¡A§_«h¥¦´N¥u¯à²_¬°C++»y¨¥·R¦nªÌªºª±ª«¤F¡C
´«¥y¸Ü»¡¡A¦«e§Úè°Ñ¥[¤u§@¨º·|¨àªº¦æ±¡¬O¡G¦b¾Ç®Õ¾Ç¦nC++¡Aɦ¹§ä¨ì¦n¤u§@¡C²{¦bªº±¡ªpÅܦ¨¤F¥ý¾Ç·|½sµ{¡A§ä¥÷¦n¤u§@¡A¦pªG¤u§@»Ýn¡A¦A¥h¾ÇC++¡C¥»®Ñ¥¿¬O¾AÀ³³oºØ¡§·s»Ý¨D¡¨ªº²£ª«¡A§@ªÌPeter Gottschling¦b¬ì¾Çpºâ»â°ì»á¦³«Ø¾ð¡A¤]¦³Â×´Iªº±Ð¾Ç¸gÅç¡A¥Lªº®Ñ§ì¦í¤F«ÂI¡A¯à°÷§âC++±`¥Î¥\¯àªº¨Ï¥Î¤èªk§Ö³t¶Ç±Âµ¹ÅªªÌ¡C
¨ä¹ê¡A¤j¦h¼Æ´¶³qµ{§Çû¡A¥]¬A§Ú¦Û¤v¡A¦b¤u§@¤¤«Ü¤Ö¦³¦Û¥Ñ¿ï¾Ü»y¨¥ªºÅv§Q¡C§Ú¦bMorgan Stanley§Q¥ÎC++¼g¤F´X¦~ªº¹ê®É¥~¶×¥æ©ö¨t²Î¡A¦Z¨Ó¦bGoogle¥ÎC++¼g¤F´X¦~ªº¼s§i¦Z»OªA°È¡C¦}¤£¬O¦]¬°§Ú¾ÕªøC++¤~¨M©w¦b¤u§@¤¤ªö¥ÎC++¡A¦Ó¬O¦]¬°³o¨Ç¨t²Î¥»¨Ó´N¬O¥HC++¬°¥Dªº¡A§Ú°Ñ»P¨ì¨ä¤¤¡A¦ÛµM¤]±o¥ÎC++¨Ó¶}µo¡C¸Ü»¡¦^¨Ó¡A¹ï¤_¥Ø«e«Ü¦h§Þ³N¼öÂI¡]Web©M²¾°Ê¶}µo¡B¾÷¾¹¾Ç²ß¡^¨Ó»¡¡AC++¦}¤£¬O¤@ªù¥²¶·n¾Ç²ß©M´x´¤ªº»y¨¥¡A«Ü¦h¤£À´C++ªºµ{§Çû¤]¯à¾Ö¦³¬Û·í½÷·×ªºÂ¾·~¥Í²P¡C¦]¦¹¡A¹ï¤_C++ªì¾ÇªÌ¡A»P¨ä°ÝC++¯à°µ¤°¤\¡A¤£¦p¦h·Q·Q§A»Ýn¥ÎC++°µ¤°¤\¡C§A·Q¥[¤Jªº¤½¥q©Î¶}µo²Õ¬O¤£¬O¥Dn¨Ï¥ÎC++¨Ó¶}µo¶µ¥Ø¡H¦pªG¬O¡A§A´x´¤ªºC++ª¾ÃѬO§_¨¬¥H³Ó¥ô¦¹¶µ¤u§@¡H
¨º¤\¡AC++n¾Ç¨ì¤°¤\µ{«×¡H¨ä¹ê¶µ¥Ø¶V¤j¡A°Ñ»Pªº¤H¶V¦h¡A¨Ï¥Îªº§Þ³N´N·|¶VÁͤ_¡§¥¤Z¡¨¡A²¦³ºn·ÓÅU¤j®aªº¥§¡¤ô¥¡A¤£©y¼C¨«°¾¾W¡C¹ï¤_¦h¤H¶}µoªº¤j¤¤«¬¶µ¥Ø¡A§Ú»{¬°¤j¦h¼Æ²Õû§âC++¾Ç¨ì¯àŪÀ´¦}¥é¼gLevelDB·½½Xªºµ{«×¡A´N¨¬¥HÀ³¥I¤é±`ªº¶}µo¡C¥u¦³¨º¨Ç¼gC++¼ÒªO®wµ¹§O¤H¥Îªº¤Ö¼Æ¤H¡A¤~»Ýn๬ã¤ñ¸û°ª²`ªº¼ÒªO¡]¤¸¡^½sµ{§Þ³N¡CÁ|Ó¨Ò¤l¡A¥Î³r¸¹¤À¹j¦r²Å¦ê¤j®a³£·|¼g¡A¦ý¬O¹ê²{absl::StrSplit()¥Î¨ìªº»yªk´N¤£¬O¨CÓC++µ{§Çû³£»Ýn´x´¤ªº¡C
°Ó·~¤½¥q¨Ï¥ÎC++¶}µo°Ó·~¶µ¥Ø¡A¤@©w¦³¨ä¥R¤À²z¥Ñ¡C±`¨£ªº²z¥Ñ¦³¨âÓ¡G¸`¬ù¦¨¥»¡B¼W¥[¦¬¤J¡C¸`¬ù¦¨¥»¡A¤@¯ë»{¬°¬O¸`¬ù¾÷¾¹¡]ªA°È¾¹¡^ªº¦¨¥»¡CÁöµM¤j®a³£ª¾¹D¤H¤ñ¾÷¾¹¶Q¡A¦ý¬O·í¨t²Îªº³W¼Ò¤j¨ì¤@©wµ{«×¡]5¸U»O¥H¤W¥iºÙ¬°Warehouse-Scale Computers ¡^®É¡A¸`¬ù10%ªº¾÷¾¹¸ê·½©Ò¯àÀò±oªº¦¬¯q´N¤£®e©¿µø¤F¡C ¦bÄvª§Àô¹Ò¤U¡A¤@Ó°ª®Äªº¨t²Î¦³¥i¯à¼W¥[¦¬¤J¡C¨Ò¦p¡A¦b¹ê®É¦b½u¼s§iÄv»ù»â°ì¡A¥ÎC++¯à¦b³W©wªº´Á¡]¤ñ¦p100ms¡^¤º¹ïÔ¿ï¼s§i°µ§ó²ÓPªºµû¤À¡A±q¤¤¬D¿ï¥X§ó¦³¾÷·|³Q¥Î¤áÂIÀ»ªº¼s§i¡C¹ï¤_¦b½u¼s§i¤½¥q¨Ó»¡¡A´£¤É¼s§iªºÂIÀ»²v¬O¯àª½±µ¼vÅT¥ø·~§Q¼íªº®Ö¤ß»Ý¨D¡A¨º¤\¥ÎC++¨Ó¹ê²{¼s§i¨t²Î¦ü¥G¬O¤@ӫܦ۵Mªº¿ï¾Ü¡C
¤j®a´¶¹M»{¬°¡AC++¬O¤@ªù°ª®Äªº¡]efficient¡^»y¨¥¡A°ª®Ä³q±`«üªº¬O¸`¬Ù¾÷¾¹¸ê·½¡A¦ý°ª®Ä¤£µ¥¤_°ª©Ê¯à¡]high performance¡^¡CÀHµÛ¼¯º¸©w«ßªº²×µ²¡A¥Ø«e°ª©Ê¯à»â°ì©¹©¹·|¨Ï¥Î¯S©wµw¥ó¥[³t¡]Domain-Specific Architecture¡ADSA¡^¡C¦pªGpºâ±K¶°«¬ªº¥N½X¡An¤\¥ÎSIMD«ü¥O°µ¦V¶q¤Æ¡An¤\©ñ¨ìGPU¤W¥h°µ¦}¦æpºâ¡A³o¼ËÀò±oªº©Ê¯à´£¤É³q±`·|»·¶W§ó´«½sµ{»y¨¥ªº®ÄªG¡C¥ÎC/C++¹ê²{ªºAES¥[±Kºâªk¦A«ç¤\Àu¤Æ¡A¤]¤ñ¤£¹L¦bCPU¨½¥[´X±ø¬ÛÃöªº«ü¥O¡CGoogle¬°¤F´£°ª¾÷¾¹¾Ç²ßªº®Ä²v¡AÁÙ±Mªù¬ãµo¤FTPU¥[³tªä¤ù¡C ¡§¥ÎC++¼g¥X¨Óªºµ{§Ç¤@©w¬O°ª©Ê¯àªº¡¨³oºØÆ[ÂI¦p¤µ¬Ý¨Ó¤£§K¦³¨Ç¤Ó¤Ñ¯u¤F¡C
C++¦n¥Î¤£¦n¥Î¡A¥Dn¬Ý§Aªº¤u¨ã©M®w¦n¤£¦n¡C§Ú¨S¨£¹LþÓ¤½¥q¥u¥ÎC++¼Ð·Ç®w°µ¶}µo¡A¦]¬°¼Ð·Ç®w´£¨Ñªº¥\¯à¹ê¦b¬O¤Ó¤Ö¤F¡A¦Ó¥B¼Ð·Ç®w´£¨Ñªº¤£¤@©w¬O³Ì¦nªº¿ï¾Ü¡CGoogle«e¤£¤[¶}·½¤F¦Û¤v¥ÎªºC++°ò¦®wAbseil¡A§Ú¤×¨ä±ÀÂ˨䤤ªº¨âÓ¡G
? ¸¹ºÙ·ç¤hx¤Mªº´²¦Cªí¡A¥Î¤_´À´«¼Ð·Ç®w¤¤ªºunordered_set/unordered_map¡C±o¯q¤_memory locality¡Aabsl::flat_hash_mapªº©Ê¯àÅãµÛ°ª¤_std::unordered_map¡C
? ®É¶¡®w¡A¥Î¤_´À´«¼Ð·Ç®w¤¤ªºstd::chrono¡C
»P10¦~«e¬Û¤ñ¡AC++ªº¥N½X¤u¨ã¦³¤F¥¨¤jªº¶i¨B¡A³o¥Dn±o¯q¤_LLVM/Clang¬°½s¼gC++·½½X¤u¨ã´£¨Ñ¤F°í¹ê¦Ó«K§Qªº°ò¦¡AÅý¤u¨ã¹ïC++¥N½Xªº²z¸Ñ±q¥¿«hªí¹F¦¡¼h±´£¤É¨ì¤F©â¶H»yªk¾ð¼h±¡A±q¦Ó¯à¯u¥¿²z¸Ñ¤@¬qC++¥N½Xªº»y·N¡CClang-TidyÅýµy¨ã¤ô¥ªºµ{§Çû¤]¯à¤è«K¦a½s¼g¤u¨ã¨Ó§ï¶icodebaseªº½è¶q¡C ¦¹¥~¡A·sªº¹B¦æ®É¤u¨ã¤]¦³§U¤_¦b´ú¸Õ¶¥¬qµo²{¿ù»~¡C
«U¸Ü»¡¡A¨ì¤°¤\¤sÀY°Û¤°¤\ºq¡A¦b¤@Ó¤½¥q¤¤¦h¤H¦X§@½s¼g¥N½X®Én¿í´`²Î¤@ªº¬ù©w¡A¤£¯àÀH¤ß©Ò±ý¦a¦Û¥Ñµo´§¡C³o¨½¦C¥X´XÓ¤u·~¯ÅªºC++½s½X³WS¡A¥¦Ì¦U¦Û³£³Q¤W¦Ê¸U¦æªº®ü¶q¥N½X¿í´`µÛ¡A¥i¨Ñ¤j®aÉų¦}Åé·|þ¨Çª¾ÃÑÂI¬O¤Ï´_±j½Õ¡B»Ýn¤U¥\¤Ò¥h¦n¦n´x´¤ªº¡G
? Google C++ Style Guide/C++ Tips of the Week
? LLVM Coding Standards
? Qt Coding Conventions
ȱo¤@´£ªº¬O¡A¥Ø«e³o´XÓ³WS³£©ú½T¦a¸T¥Î²§±`¡A¦]¦¹§Ú»{¬°¤£¥²¬°C++²§±`§ë¤J¹L¦hªº¾Ç²ßºë¤O¡A±N¨Óªº¤u§@¤¤«Ü¥i¯à¥Î¤£¨ì¡C¦b¤u§@¤¤¡A¹ï¤_¥i¯àªð¦^¿ù»~ªº¨ç¼Æ¡A§Ṳ́@¯ëªº°µªk¬Oªð¦^Status©ÎªÌStatusOr¡ÕT¡Ö¡C
³Ì¦Z¡A´£¤@ÂI«Øij¡G¼g¤@Ó·sªºÃþ®É¡Aµ´¤j¦h¼Æ±¡ªp¤U¡A½Ð¥ý¸T¥Î´_¨îºc³y¨ç¼Æ©M½áȾާ@²Å¡A³o±N¦³®Ä¦a¨¾¤î²L´_¨î¾ÉPªº¤º¦s¿ù»~¡C
§Ú´Á«Ý±N¨Ó¦³¤@¤ÑC++¼Ð·Ç¯àªö¯Ç¤@Ó«Øij¡G§â´_¨îºc³y¨ç¼Æ©M½áȾާ@²ÅÀq»{§R°£¡]=delete¡^¡A°£«D¥Î¤áÅ㦡¦a©w¸q¥¦Ì¡C¯¬¤j®a¾Ç²ß´r§Ö¡I
³¯ ºÓ ¬ü°ê¡P¥[§QºÖ¥§¨È¦{ 2019¦~7¤ë
±ÀÂ˧Ç2
C++¬O¤@ªù±j¤jªº»y¨¥¡A¦ÓC++¥»¨¤]¦b¤£Â_ºt¶i¤¤¡A³Ì·sªº¼Ð·Ç¤w¸gºt¶i¨ìC++20¡A¦}¤Þ¤J¤F¬Û·í¦h¤Þ¤Hª`¥Øªº¯S©Ê¡A¦pConcept¡BModule©MCoroutine¡C¬Û¤ñC++20¡A¥»®ÑµÛ²´ªºC++11/14¬O¹ï½sĶ¾¹¤ä«ù¬Û¹ï¦¨¼ô¡A¦}¥B¤u·~¶µ¥Ø¤]º@·Nªö¥ÎªºC++·s¼Ð·Ç¡CC++11/14¬Û¤ñC++98/03¤]¨ã¦³«D±`¦hªº·s¯S©Ê¡A¦pauto¡B°Î¦W¨ç¼Æ¡Bconstexpr¡Bmove»y¸qµ¥¡C¥»®Ñ±qÂ×´Iªº¥N½X¨Ò¤l¥Xµo¡A¤Þ¥XC++11/14·s¯S©Ên¸Ñ¨Mªº°ÝÃD¡AÁקK¤F¹L¦hªº»y¨¥¯S©Ê´yz¡A³o¼Ë¥i¥H«Üª½Æ[¦aÅý¤j®aª¾¹D¬YÓ¯S©Ê¹ê»Ú¬On«ç¤\¨Ï¥Îªº¡C¦ý¬O¡A¥»®Ñªº¤£¨¬¤§³B¦b¤_¦³ÂIµo´²¡A«Ü¦h·§©À¤@µ§±a¹L¡CÁ`Åé¦Ó¨¥¡A·å¤£±»·ì¡A¥»®Ñ¹ï¤_¤w¦³C++98/03°ò¦¡A¥B·Qn§Ö³t¸É¨¬C++11/14ª¾ÃѪº¤H¸s¨Ó»¡¬O¤@¥»¦X¾Aªº¹Ï®Ñ¡C
§d °x¡]ÂŦâ¡^
«e¨¥
¥@¬É¬O«Ø¥ß¦bC++¡]¥H¤Î¥¦ªºC¤l¶°¡^¤Wªº¡C
¡X¡XHerb Sutter
Google¡BAmazon©MFacebookªº«Ü¦h°ò¦³]¬I³£ºc«Ø¤_C++¤§¤W¡CÁÙ¦³¬Û·í¤@³¡¤Àªº¨ä¥L©³¼h§Þ³N¤]¬O¨Ï¥ÎC++¹ê²{ªº¡C¦b¹q«H»â°ì¡A´X¥G©Ò¦³ªº©T©w¹q¸Ü©M¤â¾÷³£¥ÑC++¶}µoªº³n¥ó©ÒÅX°Ê¡C¦b¼w°ê¡A´X¥G©Ò¦³ªº¥Dn³q«H¸`ÂI³£¬O¥ÑC++³B²zªº¡A³o·N¨ýµÛ§@ªÌªº®a®x¤]¬OC++ªº¶¡±µ¨ü¯qªÌ¡C
§Y«K¬O¥Î¨ä¥L»y¨¥½s¼gªº³n¥ó¤]¥i¯à·|¨Ì¿à¤_C++¡A¦]¬°³Ì¬y¦æªº½sĶ¾¹³£¬O¥ÎC++¹ê²{ªº¡G¤ñ¦pVisual Studio¡BClang¡A¥H¤ÎGNU©MIntel½sĶ¾¹¤¤¸û·sªº²Õ¥ó¡C ¦bWindows¨t²Î¤W¹B¦æªº²Õ¥ó§ó¬O¦p¦¹¡A¦]¬°Windows¨t²Î¡]¥H¤ÎOffice¡^¥»¨´N¬O¥ÎC++¶}µoªº¡CC++µL©Ò¤£¦b¡A¬Æ¦Ü§Aªº¤â¾÷©M¨T¨®¡A³£¤@©w¥]§t¤F¥ÎC++¶}µoªº²Õ¥ó¡CC++ªºµo©úªÌBjarne Stroustrup¨î§@¤F¤@ӥܨҺô¶¡A¤Wz¤j³¡¤À¨Ò¤l³£·½¤_¸Óºô¶¡C
¬ì¾Ç©M¤uµ{»â°ìªº³\¦h°ª½è¶q³n¥ó¥]¤]³£¬O¥ÎC++¹ê²{ªº¡C·í¶µ¥Ø¶W¹L¤@©w³W¼Ò¡A¥B¼Æ¾Úµ²ºc¬Û·í´_Âø®É¡AC++ªºÀu¶Õ´N·|Åé²{¥X¨Ó¡C³o¤]¬O³\¦h¡X¡X¬Æ¦Ü¥i¥H»¡¤j¦h¼Æ¡X¡X¬ì¾Ç©M¤uµ{¤¤ªº¥é¯u³n¥óµ{§Ç¡]¤ñ¦p·~¤º»âÀYªºAbaqus¡Bdeal.II¡BFEniCS¡BOpenFOAM¡A¥H¤ÎCATIAµ¥¤@¨ÇCAD³n¥ó¡^³£¥ÎC++¨Ó¹ê²{ªºì¦]¡C±o¯q¤_³B²z¾¹©M½sĶ¾¹ªºµo®i¡AC++¤]¶V¨Ó¶V¦h¦aÀ³¥Î¨ì´O¤J¦¡¨t²Î¤¤¡]¤£¹L¥i¯à¤£¬O¥þ³¡ªº²{¥N»y¨¥¯S©Ê©M®w³£¥i¥H¨Ï¥Î¡^¡C¦¹¥~¡A§Ṳ́£½T©w¦³¦h¤Ö¶µ¥Ø¦pªG±ß¨Ç±Ò°Ê´N·|Âà¥ÎC++¡A¦Ó¤£·|¨Ï¥ÎC¡C¤ñ¦p¡AµÛ¦Wªº¬ì¾Ç®wPETScªº§@ªÌMatt Knepley¡]¤]¬O¥»®Ñ§@ªÌªº¦n¤Í¡^´N©Ó»{¡A¦pªG¦³¥i¯à¡A¥L§óº@·N¥ÎC++«¼g³oÓ®w¡C
¾Ç²ßC++ªº²z¥Ñ
©M¨ä¥L»y¨¥¤£¦P¡A±qµw¥ó½sµ{¨ì°ª¯Å©â¶H½sµ{¡AC++´X¥G³£¯à³Ó¥ô¡C©³¼h½sµ{¡X¡X¦p¥Î¤á¦Û©w¸qªº¤º¦sºÞ²z¡X¡X¥i¥HÅýµ{§Çû©ú½T´x´¤µ{§Ç¬O¦p¦ó³Q°õ¦æªº¡A¥¦¤]·|À°§U§A§ó¦n¦a¤F¸Ñ¨ä¥L»y¨¥¤¤µ{§Çªº¦æ¬°¡C¨Ï¥ÎC++¥i¥H½s¼g·¥°ª©Ê¯àªºµ{§Ç¡C³o¨Çµ{§Ç¶È¶È¤ñªá¤j¤O®ð¥Î¾÷¾¹»y¨¥ºë¤ß½s¼gªº¥N½X©Ê¯à²¤®t¤@¨Ç¡Cªp¥B¡Aµ{§ÇûÀ³¸ÓÀu¥ýÅý³n¥óªº¹ê²{²M´·©ú¤F¡A¡§µw®Ö¡¨ªº©Ê¯à½ÕÀu¥u¬O¨ä¦¸¡C
¦Ó³o¥¿¬OC++°ª¯Å¯S©Êªº¥ÎªZ¤§¦a¡CC++ª½±µ¤ä«ù¦UºØ½sµ{S¦¡¡G±¦V¹ï¶H½sµ{¡]¨£²Ä6³¹¡^¡Bªx«¬½sµ{¡]¨£²Ä3³¹¡^¡B¤¸½sµ{¡]¨£²Ä5³¹¡^¡B¦}µo½sµ{¡]¨£4.6¸`¡^©M¹Lµ{¦¡½sµ{¡]¨£1.5¸`¡^¡Aµ¥µ¥¡C¦³¦n´XºØ½sµ{§Þ³N¡A¤ñ¦pRAII¡]¨£2.4.2.1¸`¡^©Mªí¹F¦¡¼ÒªO¡]¨£5.3¸`¡^³£¬O¦bC++¤¤µo©úªº¡C¥Ñ¤_C++ªº»y¨¥ªí¹F¯à¤O«D±`±j¡A©Ò¥H³q±`¥i¥H¦b«O«ù»y¨¥¤£Åܪº±ø¥ó¤U¶}µo¥X·sªº§Þ³N¡C¤]³\¦³¤@¤Ñ§A¤]·|¦¨¬°·s§Þ³Nªºµo©úªÌ¡C
¾\Ū¥»®Ñªºì¦]
³o¥»®Ñ¤¤ªº©Ò¦³¤º®e³£¸g¹L¤F¹ê½îÀËÅç¡C§@ªÌ±Ð±Â¤F¤T¦~¡]¨C¦~¨âӾǴÁ¡^C++ for Scientists½Òµ{¡C¤j³¡¤À¾Ç¥Í¨Ó¦Û¼Æ¾Ç¨t¡AÁÙ¦³¤@¨Ç¨Ó¦Ûª«²z©M¤uµ{¨t¡C¥L̦b½Ò«e³q±`¦}¤£¤F¸ÑC++¡A¦Ó¦b½Òµ{µ²§ô®É¡A¤w¸g¯à°÷¹ê²{ªí¹F¦¡¼ÒªO¡]5.3¸`¡^µ¥°ª¯Å§Þ³N¡C§A¥i¥H®Ú¾Ú¦Û¤vªº»Ýn¾\Ū¥»®Ñ¡Gª½±µ¸òÀH¥»®Ñ¥D³¹¸`¾Ç²ßnÂI¡A©ÎªÌ¾\Ūªþ¿ýA¤¤ªº¨ä¥L¥Ü¨Ò©MI´ºª¾ÃÑ¥HÀò±o§ó¦hªº«H®§¡C
¡§¬ü¤k»P³¥Ã~¡¨
C++¥i¥H¦³¦hºØ½s¼g¤è¦¡¡C¦b¥»®Ñ¤¤¡A§ÚÌ·|¤Þ¾É§A¥·Æ¹L´ç¨ì§ó¥[°ª¯Åªº·®æ¤W¡C³o»Ýn¥Î¨ìC++ªº°ª¯Å¯S©Ê¡C³o¨Ç¯S©Ê¦b³Ìªì¥i¯à·|¥O¤H«o¨B¡A¦ý¬O²ßºD¤§¦Z´N·|µo²{¡A°ª¼h ¤Wªº½sµ{¤£¶È¾A¥Î±§ó¼s¡A¦b®Ä²v©M¥iŪ©Ê¤W¤]·|§ó¦n¡C
§Ų́ϥÎùÚ©w¨Bªøªº±è«×¤U°ªk³oÓ²³æªº¨Ò¤l§@¬°C++ªº¤Jªù¥Î¨Ò¡C¥¦ªºì²z«D±`²³æ¡A§ÚÌ¥H¨ç¼Æf(x)ªº±è«×g(x)§@¬°¥¦³Ì°~ªº¤è¦V¶i¦æ¤U°¡AµM¦Z¥Î©T©w¤j¤pªº¨BªøªuµÛ³oÓ¤è¦V©è¹F§½³¡³Ì¤pÈ¡Cºâªkªº°°¥N½X¤]¦P¼Ë²³æ¡G
ºâªk1¡G±è«×¤U°ªk
¿é¤J¡Gªì©lÈx¡B¨Bªøs¡B²×¤î±ø¥ó£`¡B¨ç¼Æf¡B±è«×g
¿é¥X¡G§½³¡³Ì¤pÈx
¹ï¤_³oÓ²³æªººâªk¡A§ÚÌ´£¨Ñ¤F¨âÓ§¹¥þ¤£¦Pªº¹ê²{¡C³o¨½¥u»Ýª`·N¥¦ªº¥Dn®Ø¬[¡A¤£¥²¦Ò¼{§Þ³N²Ó¸`¡C
³o¨â¬q¥N½X¥E¬Ý¤§¤U«Ü¬Û¦ü¡A¥BÅý§Ų́ӥJ²Ó¤ÀªR¡C²Ä¤@Óª©¥»¥i¥Hºâ¬O¯ÂCªº¹ê²{¡A¥ÎC»y¨¥½sĶ¾¹¤]¥i¥H½sĶ¥¦¡C¥¦ªº¦n³B¬OÀu¤Æ¡]optimize¡^ªº¥Ø¼Ð¯S§Oª½Æ[¡G¤@ÓÂùºë«×¯BÂIªº¤Gºû¨ç¼Æ¡]¦b¥[²Ê³¡¤À¤¤¡^¡C²Ä¤GÓª©¥»¬O§Ú̧ó³ßÅwªºª©¥»¡A¦]¬°¥¦§ó¥[ªx¤Æ¡G±q³Q¥[²ÊªºÃþ«¬©M¨ç¼Æ°Ñ¼Æ¤W¥i¥H¬Ý¨ì¡A¥¦¥i¥H¥Î¨ã¦³¥ô·NÈÃþ«¬¡B¥ô·Nºû«×ªº¨ç¼Æ¡C¥X¥G·N®Æªº¬O¡A¾Ö¦³§ó¦h¥\¯àªº¦ZªÌ¦b°õ¦æ®Ä²v¤W¦}¤£¸¨¦Z¤_«eªÌ¡C¬Û¤Ï¡A¥ÑF©MGµ¹¥Xªº¨ç¼Æ¥i¥H³Q¤ºÁp¡]¨£1.5.3¸`¡^¡A¥H¸`¬Ù¨ç¼Æ½Õ¥Îªº¶}¾P¡C¦Ó¥ª°¼Å㦡¨Ï¥Î¨ç¼Æ«ü°w¡]¤]§óÃø¬Ý¡^ªºª©¥»«h·|¥O¦¹ÃþÀu¤ÆÅܱo§ó¥[§xÃø¡C
¦pªGŪªÌ¦³@¤ßªº¸Ü¡A¥i¥H¦bªþ¿ýA¡]A.1¸`¡^¤¤§ä¨ì¤@Ó§óªøªº·s·®æ¹ï¤ñªº¨Ò¤l¡C¦b¹ê»Ú¤u§@¤¤¡A²{¥N·®æªº½sµ{©Ò±a¨Óªº¦n³B»·¤ñ³o¨½ªº¥Ü¨Ò§ó¥[©úÅã¡C¤£¹L¡A¦b¦¹§Ṳ́£·|Á|¥X§ó¬°´_Âøªº¨Ò¤l¡A¥H§K§A¯Ô¤_²Ó¸`¡C
¬ì¾Ç©M¤uµ{pºâ¤¤ªº½sµ{»y¨¥
¦pªG¨CºØ¼Æȳn¥ó³£¥i¥H¥ÎC++½s¼g¦}«O«ù°ª®Ä¡A¨º·íµM¬O¤@¥ó·¥¦nªº¨Æ±¡¡C¦ý«e´£¬O¥¦Ì¤@©w¤£¯à¥´¯}C++ªºÃþ«¬¨t²Î¡C§_«h§óÀ³¸Ó¨Ï¥ÎFortran¡B¶×½s»y¨¥©Î°w¹ï¯S©w¬[ºcªºÂX®i¨Ó¶i¦æ½s¼g¡C
¡X¡XBjarne Stroustrup
¬ì¾Ç©M¤uµ{pºâ³n¥ó¥i¥H¨Ï¥Î¤£¦Pªº»y¨¥½s¼g¡C¦ÓþºØ»y¨¥³Ì¾A¦X«h¨ú¨M¤_³Ì²×¥Ø¼Ð©M¥i¥Î¸ê·½¡G
? ¹ï¤_MATLAB¡BMathmatica©ÎªÌR³o¼Ëªº³n¥ó¡A·í§ÚÌ¥i¥H¨Ï¥Î¥¦Ì¤º«Øªººâªk®É¡A¥¦Ì·|«D±`¦n¥Î¡C¦ý¦pªG§Ú̦ۤv¹ê²{ªººâªk»Ýn²Ó²É«×ªº¹Bºâ¡]¨Ò¦p¼Ð¶q¡^¡A¨º¤\¤Wz³n¥óªº©Ê¯à·|ÅãµÛ°§C¡C¤£¹L¦pªG°ÝÃD³W¼Ò¸û¤p©ÎªÌ¥Î¤á¦³¨¬°÷ªº@¤ß¡A³o¤]¥i¯à¤£¬O°ÝÃD¡C§_«h¡A§ÚÌ´NÀ³¸Ó¦Ò¼{¨ä¥Lªº´À¥N»y¨¥¡C
? Python«D±`¾A¦X§Ö³t¶}µo¡A¦}¾Ö¦³Ãþ¦üSciPy©ÎªÌNumPy³o¼Ëªº¬ì¾Ç®w¡C°ò¤_³o¨Ç®w¡]®w¥»¨³q±`¥ÑC©ÎªÌC++¶}µo¡^ªºÀ³¥Îµ{§Çªº®Ä²vÁÙ¬O«Ü°ªªº¡C¦ý¬O¦P¼Ë¡A»Ýn²Ó²É«×¹Bºâªº¥Î¤á¦Û©w¸qºâªkªº©Ê¯à·|°§C¡C ¨Ï¥ÎPython¬O§Ö³t§¹¦¨¤¤¤p«¬¥ô°Èªºµ´¨Î¤è¦¡¡C¦ý¬O·í¶µ¥Ø¨ì¤@©w³W¼Ò¦Z¡A§ó¥[ÄY®æªº½sĶ¾¹´NÅܱo¶V¨Ó¶V«n¡]¤ñ¦p½áÈ·|¦b°Ñ¼Æ¤£¤Ç°t®É³Q©Úµ´¡^¡C
? ·í§ÚÌ¥i¥H¨Ì¿à²{¦³ªº¡B¸g¹L¨}¦nÀu¤Æªº¹Bºâ¡]¤ñ¦p±K¶°¯x°}pºâ¡^®É¡AFortran¤]¬O¤@ӫܤ£¿ùªº¿ï¾Ü¡C¥¦«D±`¾A¦X§¹¦¨¦Ñ±Ð±Âªº®a®x§@·~¡]¦]¬°¥LÌ¥u·|°Ý¤@¨Ç¦bFortran¤¤«Ü®e©ö¹ê²{ªº°ÝÃD¡^¡C®Ú¾Ú§@ªÌªº¸gÅç¡A·í¤Þ¤J·sªº¼Æ¾Úµ²ºc®É¡AFortran´N·|Åܱo·¥¬°³Â·Ð¡C¨Æ¹ê¤W¥ÎFortran½s¼g¤j«¬¼ÒÀÀµ{§Ç¬O¤@Ó¬Û·í¤jªº¬D¾Ô¡C¦p¤µº@·N³o¼Ë°µªº¤H¶V¨Ó¶V¤Ö¡C
? C»y¨¥ªº©Ê¯à«Ü¦n¡A¦Ó¥B¤w¦³¤j¶qªº³n¥ó¨Ï¥ÎC»y¨¥¶}µo¡C¥¦ªº»y¨¥®Ö¤ß¤º®e¸û¤Ö¡A¥B©ö¤_¾Ç²ß¡C¨Ï¥ÎC»y¨¥¶}µo©Ò±Á{ªº¥Dn¬D¾Ô¬O¡G¨Ï¥Î²®¦Ó¦MÀIªº»y¨¥¯S©Ê¡A¤×¨ä¬O«ü°w¡]¨£1.8.2¸`¡^©M§»¡]¨£1.9.2.1¸`¡^¡A¶}µo¤j«¬¡BµL¿ùªº³n¥ó¡C
? ·íÀ³¥Îµ{§Ç³Ì¥Dnªº³¡¤À¬OWeb©M¹Ï§Î¬É±¦}¥Bpºâ¸û¤Ö®É¡AJava¡BC#©MPHP³£¬O¤£¿ùªº¿ï¾Ü¡C
·í§ÚÌn¶}µo¨ã¦³¨}¦n©Ê¯àªº¤j«¬°ª½è¶q³n¥ó®É¡AC++¦b¦U¶µ»y¨¥¤¤¥i¿×¼·¡¡C³o¼Ëªº³n¥ó¶}µo¹Lµ{¦}¤£¤@©w¬O½wºC¦ÓµhWªº¡C³q¹L¥¿½Tªº©â¶H¡A§ÚÌ¥i¥H«D±`§Ö³t¦a½s¼gC++µ{§Ç¡C¤@©w·|¦³§ó¦hªº¬ì¾Çpºâ®w³Q¯Ç¤J¥¼¨ÓªºC++¼Ð·Ç¡A§Ú̹惡ªí¥Ü¼ÖÆ[¡C
Åé¨Ò
¥»®Ñ¤¤³N»y¥H¤¤¤å·¢Åé¡B^¤å±×Åé¡]italic¡^ªí¥Ü¡CC++·½½X¨Ï¥Îµ¥¼e¦rÅé¡]monospace¡^¡C«n²Ó¸`¥H²ÊÅé¡]boldface¡^¼Ðª`¡CÃþ¡B¨ç¼Æ¡BÅܶq©M±`¶q³£¬O¤p¼gªº¡A¦}¥i¯à§t¦³¤Uµe½u¡C¯x°}¨Ò¥~¡A³q±`¥Î³æÓ¤j¼g¦r¥À©R¦W¡C¼ÒªO°Ñ¼Æ©M·§©À¡]Concept¡^¥H¤j¼g¦r¥À¶}ÀY¡A¤]¥i¯à·|¦³¨ä¥Lªº¤j¼g¦r¥À¦b¦W¦r¤¤¡]CamelCase¡^¡Cµ{§Ç¿é¥X¡B©R¥O¦æ«h¥Î¥´¦r¾÷¦rÅé¡]typewriter font¡^ªí¥Ü¡C
·í»Ýn¨Ï¥ÎC++03¡BC++11©MC++14ªº¯S©Ê®É¡Aµ{§Ç·|¥H¬ÛÀ³ªºÃä®Ø¼Ðª`¡C¤@¨Ç»´«×¨Ï¥ÎC++11¯S©Ê¡A¥B©ö¤_³Q¹ïÀ³ªºC++03ªº¾÷¨î´À´«ªºµ{§Ç¡A´N¤£¦A¥t¦æ¼Ðª`¡C
°£¤F¯S§Oµuªº¥N½X¥Ü¨Ò¡A¥»®Ñ¤¤©Ò¦³ªºµ{§Ç¥Ü¨Ò³£¦b¦Ü¤Ö¤@Ó½sĶ¾¹¤W¶i¦æ¤F´ú¸Õ¡C§¹¾ãµ{§Çªº¸ô®|³q±`¦b¥]§t³o¬q¥N½Xªº¤p¸`¶}ÀY¥H½bÀY§Î¦¡¼Ð¥X¡C
¦bWindows¨t²Î¤WÁÙ¥i¥H¨Ï¥Î§ó¤è«Kªº¤u¨ãTortoiseGit¡]tortoisegit.org¡^¡C |
¤º®e²¤¶¡G¥»®Ñ±q¶Ç²ÎªºHello World¶}©l¡A¥ý¤¶²Ð¤F»y¨¥¤JªùC++©Ò¥²¶·ªº°ò¥»n¯À¡]¦pªí¹F¦¡¡B»y¥y¡BÁn©ú¡^¡F¦A¨ì©Mµ{§Ç²Õ´¦³Ãöªº¨ç¼Æ¡BÃþ¡FµM¦Z²`¤J±´°Q¤FC++©Ò¤ä«ùªºªx«¬½sµ{¡B¤¸½sµ{©M±¦V¹ï¶Hµ¥¤£¦P½sµ{S¦¡¡A¦}¥B´£¨Ñ¤F«Ü¦hªº¨Ò¤l¥i¥HÅýŪªÌ¥J²ÓÅé·|¥¦Ì¤§¶¡ªºÁp¨t¡B°Ï§O©M¾A¥Î³õ´º¡F³Ì¦Z¦A¥H¤@Ó¤¤«¬¶µ¥Ø¬°¨Ò¤¶²Ð¤F¤@¨Ç¤j«¬¤uµ{©Ò¥²³Æªº°ò¦ª¾ÃÑ¡C¥»®Ñ¾A¦XC++ªì¾ÇªÌ¡B¥¿¦b¶}µo©MºûÅ@¬ì¾Ç©M¤uµ{³n¥óªº³n¥ó¤uµ{®v¡A¥H¤Î§Æ±æ¾Ç²ß©M²z¸Ñ²{¥NC++¾÷¨î¦pªx«¬½sµ{©M¤¸½sµ{ªºÅªªÌ¡C |
¥Ø¿ý¡G²Ä1³¹ C++°ò¦¡]C++ Basics¡^ 1
1.1 ²Ä¤@Óµ{§Ç¡]Our First Program¡^ 1
1.2 Åܶq¡]Variables¡^ 4
1.2.1 ±`¶q¡]Constants¡^ 7
1.2.2 ¦r±¶q¡]Literals¡^ 7
1.2.3 «D¯¶¤Æªºªì©l¤Æ¡]non-narrowing initialization¡^ 9
1.2.4 §@¥Î°ì¡]Scopes¡^ 11
1.3 ¾Þ§@²Å¡]Operators¡^ 13
1.3.1 ºâ³N¾Þ§@²Å¡]Arithmetic Operators¡^ 14
1.3.2 ¥¬º¸¾Þ§@²Å¡]Boolean Operators¡^ 17
1.3.3 ¦ì¾Þ§@²Å¡]Bitwise Operators¡^ 18
1.3.4 ½áÈ¡]Assignment¡^ 19
1.3.5 µ{§Ç¬y¡]Program Flow¡^ 19
1.3.6 ¤º¦s³B²z¡]Memory Handling¡^ 20
1.3.7 ³X°Ý¾Þ§@²Å¡]Access Operators¡^ 21
1.3.8 Ãþ«¬³B²z¡]Type Handling¡^ 21
1.3.9 ¿ù»~³B²z¡]Error Handling¡^ 21
1.3.10 «¸ü¡]Overloading¡^ 22
1.3.11 ¾Þ§@²ÅÀu¥ý¯Å¡]Operator Precedence¡^ 22
1.3.12 ÁקK°Æ§@¥Î¡]Avoid Side Effects¡I¡^ 22
1.4 ªí¹F¦¡©M»y¥y¡]Expressions and Statements¡^ 25
1.4.1 ªí¹F¦¡¡]Expressions¡^ 25
1.4.2 »y¥y¡]Statements¡^ 26
1.4.3 ¤À¤ä¡]Branching¡^ 27
1.4.4 ´`Àô¡]Loops¡^ 29
1.4.5 goto 33
1.5 ¨ç¼Æ¡]Functions¡^ 33
1.5.1 °Ñ¼Æ¡]Arguments¡^ 34
1.5.2 ªð¦^µ²ªG¡]Returning Results¡^ 36
1.5.3 ¤ºÁp¡]Inlining¡^ 37
1.5.4 «¸ü¡]Overloading¡^ 38
1.5.5 main¨ç¼Æ¡]main Function¡^ 40
1.6 ¿ù»~³B²z¡]Error Handling¡^ 41
1.6.1 Â_¨¥¡]Assertions¡^ 41
1.6.2 ²§±`¡]Exceptions¡^ 43
1.6.3 ÀRºAÂ_¨¥¡]Static Assertions¡^ 48
1.7 I/O 48
1.7.1 ¼Ð·Ç¿é¥X¡]Standard Output¡^ 48
1.7.2 ¼Ð·Ç¿é¤J¡]Standard Input¡^ 49
1.7.3 ¤å¥óªº¿é¤J©M¿é¥X¡]Input/Output with Files¡^ 49
1.7.4 ªx¤Æªº¬y·§©À¡]Generic Stream Concept¡^ 50
1.7.5 ®æ¦¡¤Æ¡]Formatting¡^ 51
1.7.6 ³B²z¿é¤J¿é¥X¿ù»~¡]Dealing with I/O Errors¡^ 53
1.8 ¼Æ²Õ¡B«ü°w©M¤Þ¥Î¡]Arrays, Pointers, and References¡^ 56
1.8.1 ¼Æ²Õ¡]Arrays¡^ 56
1.8.2 «ü°w¡]Pointers¡^ 58
1.8.3 ´¼¯à«ü°w¡]Smart Pointers¡^ 62
1.8.4 ¤Þ¥Î¡]References¡^ 65
1.8.5 «ü°w©M¤Þ¥Îªº¤ñ¸û¡]Comparison between Pointers and References¡^ 66
1.8.6 ¤£n¤Þ¥Î¹L´Á¼Æ¾Ú¡]Do Not Refer to Outdated Data!¡^ 67
1.8.7 ¼Æ²Õªº®e¾¹¡]Containers for Arrays¡^ 67
1.9 ³n¥ó¶µ¥Øµ²ºc¤Æ¡]Structuring Software Projects¡^ 70
1.9.1 ª`ÄÀ¡]Comments¡^ 70
1.9.2 ¹w½sĶ«ü¥Ü¦r¡]Preprocessor Directives¡^ 71
1.10 ½m²ß¡]Exercises¡^ 75
1.10.1 ¦~ÄÖ¡]Age¡^ 75
1.10.2 ¼Æ²Õ©M«ü°w¡]Arrays and Pointers¡^ 76
1.10.3 Ū¨ú¤@Ó¯x°}¥«³õ¤å¥óªºÀY³¡¡]Read the Header of a Matrix
Market File¡^ 76
²Ä2³¹ Ãþ¡]Classes¡^ 77
2.1 ¬°´¶¹M·N¸q¦Ó¤£¬O§Þ³N²Ó¸`½sµ{¡]Program for Universal Meaning Not for
Technical Details¡^ 77
2.2 ¦¨û¡]Members¡^ 79
2.2.1 ¦¨ûÅܶq¡]Member Variables¡^ 80
2.2.2 ¥i³X°Ý©Ê¡]Accessibility¡^ 80
2.2.3 ³X°Ý¾Þ§@²Å¡]Access Operators¡^ 83
2.2.4 ÃþªºÀRºAÁn©ú²Å¡]The Static Declarator for Classes) 84
2.2.5 ¦¨û¨ç¼Æ¡]Member Functions¡^ 84
2.3 ³]¸mÈ¡Gºc³y¨ç¼Æ©M½áÈ¡]Setting Values: Constructors and Assignments¡^ 85
2.3.1 ºc³y¨ç¼Æ¡]Constructors¡^ 86
2.3.2 ½áÈ¡]Assignment¡^ 96
2.3.3 ªì©l¤Æ¾¹¦Cªí¡]Initializer Lists¡^ 97
2.3.4 ¤@P©Êªì©l¤Æ¡]Uniform Initialization¡^ 99
2.3.5 ²¾°Ê»y¸q¡]Move Semantic¡^ 101
2.4 ªRºc¨ç¼Æ¡]Destructors¡^ 105
2.4.1 ¹ê²{·Ç«h¡]Implementation Rules¡^ 105
2.4.2 ¾A·í³B²z¸ê·½¡]Dealing with Resources Properly¡^ 106
2.5 ¦Û°Ê¥Í¦¨¤èªk²M³æ¡]Method Generation Resume¡^ 112
2.6 ¦¨ûÅܶq³X°Ý¡]Accessing Member Variables¡^ 113
2.6.1 ³X°Ý¨ç¼Æ¡]Access Functions¡^ 113
2.6.2 ¤U¼Ð¾Þ§@²Å¡]Subscript Operator¡^ 115
2.6.3 ±`¶q¦¨û¨ç¼Æ¡]Constant Member Functions¡^ 116
2.6.4 ¤Þ¥Î©wªºÅܶq¡]Reference-Qualified Members¡^ 117
2.7 ¾Þ§@²Å«¸üªº³]p¡]Operator Overloading Design¡^ 118
2.7.1 «O«ù¤@P¡I¡]Be Consistent!¡^ 119
2.7.2 ª`·NÀu¥ý¯Å¡]Respect the Priority¡^ 120
2.7.3 ¦¨û¨ç¼Æ©M¦Û¥Ñ¨ç¼Æ¡]Member or Free Function¡^ 120
2.8 ½m²ß¡]Exercises¡^ 123
2.8.1 ¦h¶µ¦¡¡]Polynomial¡^ 123
2.8.2 ²¾°Ê½áÈ¡]Move Assignment¡^ 123
2.8.3 ªì©l¤Æ¾¹¦Cªí¡]Initializer List¡^ 123
2.8.4 ¸ê·½ºÞ²z¡]Resource Rescue¡^ 124
²Ä3³¹ ªx«¬½sµ{¡]Generic Programming¡^ 125
3.1 ¨ç¼Æ¼ÒªO¡]Function Templates¡^ 125
3.1.1 ¹ê¨Ò¤Æ¡]Instantiation¡^ 127
3.1.2 °Ñ¼ÆÃþ«¬ªº±À¾É¡]Parameter Type Deduction¡^ 128
3.1.3 ¦b¼ÒªO¤¤³B²z¿ù»~¡]Dealing with Errors in Templates¡^ 132
3.1.4 ²V¦XÃþ«¬¡]Mixing Types¡^ 133
3.1.5 ¤@P©Êªì©l¤Æ¡]Uniform Initialization¡^ 134
3.1.6 ¦Û°Êªð¦^ÈÃþ«¬¡]Automatic return Type¡^ 134
3.2 ©R¦WªÅ¶¡»P¨ç¼Æ¬d§ä¡]Namespaces and Function Lookup¡^ 135
3.2.1 ©R¦WªÅ¶¡¡]Namespaces¡^ 135
3.2.2 °Ñ¼Æ¬ÛÃö¬d§ä¡]Argument-Dependent Lookup¡^ 138
3.2.3 ©R¦WªÅ¶¡©wÁÙ¬OADL¡]Namespace Qualification or ADL¡^ 142
3.3 Ãþ¼ÒªO¡]Class Templates¡^ 144
3.3.1 ¤@Ó®e¾¹ªºS¨Ò¡]A Container Example¡^ 144
3.3.2 ¬°Ãþ©M¨ç¼Æ³]p²Î¤@ªº±µ¤f¡]Designing Uniform Class and
Function Interfaces¡^ 146
3.4 Ãþ«¬±À¾É»P©w¸q¡]Type Deduction and Definition¡^ 153
3.4.1 ¦Û°ÊÅܶqÃþ«¬¡]Automatic Variable Type¡^ 153
3.4.2 ªí¹F¦¡ªºÃþ«¬¡]Type of an Expression¡^ 154
3.4.3 decltype(auto) 155
3.4.4 ©w¸qÃþ«¬¡]Defining Types¡^ 156
3.5 Ãö¤_¼ÒªOªº¤@ÂIÂI²z½×¡G·§©À¡]A Bit of Theory on Templates: Concepts¡^ 158
3.6 ¼ÒªO¯S¤Æ¡]Template Specialization¡^ 159
3.6.1 ¬°³æÓÃþ«¬¯S¤ÆÃþ¡]Specializing a Class for One Type¡^ 159
3.6.2 ¨ç¼Æ¯S¤Æ©M«¸ü¡]Specializing and Overloading Functions¡^ 162
3.6.3 ³¡¤À¯S¤Æ¡]Partial Specialization¡^ 164
3.6.4 ¨ç¼Æªº³¡¤À¯S¤Æ¡]Partially Specializing Functions¡^ 165
3.7 ¼ÒªOªº«DÃþ«¬°Ñ¼Æ¡]Non-Type Parameters for Templates¡^ 168
3.8 ¥é¨ç¼Æ¡]Functors¡^ 170
3.8.1 Ãþ¦ü¨ç¼Æªº°Ñ¼Æ¡]Function-like Parameters¡^ 172
3.8.2 ²Õ¦X¥é¨ç¼Æ¡]Composing Functors¡^ 173
3.8.3 »¼Âk¡]Recursion¡^ 175
3.8.4 ªx«¬Âk¯Ç¨ç¼Æ¡]Generic Reduction¡^ 179
3.9 °Î¦W¨ç¼Æ¡]Lambda¡^ 180
3.9.1 ®·Àò¡]Capture¡^ 181
3.9.2 «öÈ®·Àò¡]Capture by Value¡^ 181
3.9.3 «ö¤Þ¥Î®·Àò¡]Capture by Reference¡^ 182
3.9.4 ¼s¸q®·Àò¡]Generalized Capture¡^ 184
3.9.5 ªx«¬°Î¦W¨ç¼Æ¡]Generic Lambdas¡^ 185
3.10 ÅܰѼҪO¡]Variadic Templates¡^ 186
3.11 ½m²ß¡]Exercises¡^ 188
3.11.1 ¦r²Å¦êªí¥Ü¡]String Representation¡^ 188
3.11.2 ¤¸²Õªº¦r²Å¦êªí¥Ü¡]String Representation of Tuples¡^ 188
3.11.3 ªx«¬´Ì¡]Generic Stack¡^ 188
3.11.4 ¦V¶qªº¡¥N¾¹¡]Iterator of a Vector¡^ 189
3.11.5 ©_¼Æ¡¥N¾¹¡]Odd Iterator¡^ 189
3.11.6 ©_¼ÆS³ò¡]Odd Range¡^ 189
3.11.7 boolÅܶqªº´Ì¡]Stack of bool¡^ 190
3.11.8 ¦Û©w¸q¤j¤pªº´Ì¡]Stack with Custom Size¡^ 190
3.11.9 «DÃþ«¬¼ÒªO°Ñ¼Æªº±À¾É¡]Deducing Non-type Template Arguments¡^ 190
3.11.10 ±è§Î¤½¦¡¡]Trapezoid Rule¡^ 190
3.11.11 ¥é¨ç¼Æ¡]Functor¡^ 191
3.11.12 °Î¦W¨ç¼Æ¡]Lambda¡^ 191
3.11.13 ¹ê²{make_unique¡]Implement make_unique¡^ 191
²Ä4³¹ ®w¡]Libraries¡^ 192
4.1 ¼Ð·Ç¼ÒªO®w¡]Standard Template Library¡^ 193
4.1.1 ¤Jªù¥Ü¨Ò¡]Introductory Example¡^ 193
4.1.2 ¡¥N¾¹¡]Iterators¡^ 194
4.1.3 ®e¾¹¡]Containers¡^ 199
4.1.4 ºâªk¡]Algorithms¡^ 208
4.1.5 ¶W¶V¡¥N¾¹¡]Beyond Iterators¡^ 215
4.2 ¼ÆÈ¡]Numerics¡^ 216
4.2.1 ´_¼Æ¡]Complex Numbers¡^ 217
4.2.2 ÀH¾÷¼Æµo¥Í¾¹¡]Random Number Generators¡^ 220
4.3 ¤¸½sµ{¡]Meta-programming¡^ 230
4.3.1 ·¥¡]Limits¡^ 230
4.3.2 Ãþ«¬¯S©º¡]Type Traits¡^ 232
4.4 ¤ä«ù®w¡]Utilities¡^ 234
4.4.1 ¤¸²Õ¡]Tuple¡^ 235
4.4.2 ¨ç¼Æ¡]function¡^ 238
4.4.3 ¤Þ¥Î¥]¸Ë¾¹¡]Reference Wrapper¡^ 240
4.5 ´N¬O²{¦b¡]The Time Is Now¡^ 242
4.6 ¦}µo¡]Concurrency¡^ 244
4.7 ¼Ð·Ç¤§¥~ªº¬ì¾Çpºâµ{§Ç®w¡]Scientific Libraries Beyond the Standard¡^ 248
4.7.1 ¨ä¥Lºâ³N¹Bºâ®w¡]Other Arithmetics¡^ 248
4.7.2 °Ï¶¡ºâ³N¡]Interval Arithmetic¡^ 248
4.7.3 ½u©Ê¥N¼Æ¡]Linear Algebra¡^ 249
4.7.4 ±`·L¤À¤èµ{¡]Ordinary Differential Equations¡^ 249
4.7.5 °¾·L¤À¤èµ{¡]Partial Differential Equations¡^ 249
4.7.6 ¹Ï½×ºâªk¡]Graph Algorithms¡^ 250
4.8 ½m²ß¡]Exercises¡^ 250
4.8.1 «ö¼Ò±Æ§Ç¡]Sorting by Magnitude¡^ 250
4.8.2 STL®e¾¹¡]STL Container¡^ 250
4.8.3 ´_¼Æ¡]Complex Numbers¡^ 250
²Ä5³¹ ¤¸½sµ{¡]Meta-Programming¡^ 252
5.1 Åý½sĶ¾¹¶i¦æpºâ¡]Let the Compiler Compute¡^ 252
5.1.1 ½sĶ´Á¨ç¼Æ¡]Compile-Time Functions¡^ 253
5.1.2 ÂX®iªº½sĶ´Á¨ç¼Æ¡]Extended Compile-Time Functions¡^ 255
5.1.3 ½è¼Æ¡]Primeness¡^ 257
5.1.4 ¦¹±`¼Æ¡H©¼±`¼Æ¡H¡]How Constant Are Our Constants?¡^ 259
5.2 ´£¨Ñ©M¨Ï¥ÎÃþ«¬«H®§¡]Providing and Using Type Information¡^ 260
5.2.1 Ãþ«¬¯S©º¡]Type Traits¡^ 261
5.2.2 ±ø¥ó²§±`³B²z¡]Conditional Exception Handling¡^ 264
5.2.3 ¤@Óconst¾ã¼äµø¹Ïªº¥Î¨Ò¡]A const-Clean View Example¡^ 265
5.2.4 ¼Ð·ÇÃþ«¬¯S©º¡]Standard Type Traits¡^ 272
5.2.5 »â°ì¯S©wªºÃþ«¬ÄÝ©Ê¡]Domain-Specific Type Properties¡^ 272
5.2.6 enable_if 274
5.2.7 ·sª©ÅܰѼҪO¡]Variadic Templates Revised¡^ 278
5.3 ªí¹F¦¡¼ÒªO¡]Expression Templates¡^ 281
5.3.1 ¤@Ó²³æªº¾Þ§@²Å¹ê²{¡]Simple Operator Implementation¡^ 281
5.3.2 ¤@Óªí¹F¦¡¼ÒªOÃþ¡]An Expression Template Class¡^ 285
5.3.3 ªx¤Æªºªí¹F¦¡¼ÒªO¡]Generic Expression Templates¡^ 288
5.4 ¤¸Àu¤Æ¡G½s¼g§A¦Û¤vªº½sĶ¾¹Àu¤Æ¡]Meta-Tuning: Write Your Own Compiler Optimization¡^ 290
5.4.1 ¸g¨åªº©T©w¤j¤pªº´`Àô®i¶}¡]Classical Fixed-Size Unrolling¡^ 292
5.4.2 ´O®M®i¶}¡]Nested Unrolling¡^ 295
5.4.3 °ÊºA´`Àô®i¶}¡X¡X¼ö¨¡]Dynamic Unrolling¡XWarm-up¡^ 301
5.4.4 ®i¶}¦V¶qªí¹F¦¡¡]Unrolling Vector Expressions¡^ 303
5.4.5 ½ÕÀuªí¹F¦¡¼ÒªO¡]Tuning an Expression Template¡^ 305
5.4.6 ½ÕÀuÁY´î¹Bºâ¡]Tuning Reduction Operations¡^ 308
5.4.7 ½ÕÀu´O®M´`Àô¡]Tuning Nested Loops¡^ 316
5.4.8 ½ÕÀu¤@Äý¡]Tuning Resume¡^ 322
5.5 ½m²ß¡]Exercises¡^ 323
5.5.1 Ãþ«¬¯S©º¡]Type Traits¡^ 323
5.5.2 Fibonacci¼Æ¦C¡]Fibonacci Sequence¡^ 323
5.5.3 ¤¸½sµ{ª©ªº³Ì¤j¤½¬ù¼Æ¡]Meta-Program for Greatest Common Divisor¡^ 323
5.5.4 ¦V¶qªí¹F¦¡¼ÒªO¡]Vector Expression Template¡^ 324
5.5.5 ¤¸¦Cªí¡]Meta-List¡^ 325
²Ä6³¹ ±¦V¹ï¶H½sµ{¡]Object-Oriented Programming¡^ 326
6.1 °ò¥»ì«h¡]Basic Principles¡^ 327
6.1.1 °òÃþ©M¬£¥ÍÃþ¡]Base and Derived Classes¡^ 327
6.1.2 Ä~©Óºc³y¡]Inheriting Constructors¡^ 331
6.1.3 µê¨ç¼Æ©M¦hºAÃþ¡]Virtual Functions and Polymorphic Classes¡^ 332
6.1.4 °ò¤_Ä~©Óªº¥é¨ç¼Æ¡]Functors via Inheritance¡^ 338
6.2 ®ø°£¤¾§E¡]Removing Redundancy¡^ 339
6.3 ¦h«Ä~©Ó¡]Multiple Inheritance¡^ 340
6.3.1 ¦hÓ¤÷Ãþ¡]Multiple Parents¡^ 340
6.3.2 ¤½¦@¯ª¤÷¡]Common Grandparents¡^ 342
6.4 ³q¹L¤lÃþ«¬¶i¦æ°ÊºA¿ï¾Ü¡]Dynamic Selection by Sub-typing¡^ 347
6.5 Âà´«¡]Conversion¡^ 350
6.5.1 ¦b°òÃþ©M¬£¥ÍÃþ¤§¶¡Âà´«¡]Casting between Base and Derived Classes¡^ 351
6.5.2 constÂà´«¡]const-Cast¡^ 356
6.5.3 «¸ÑÄÀÂ૬¡]Reinterpretation Cast¡^ 356
6.5.4 ¨ç¼Æ·®æªºÂ૬¡]Function-Style Conversion¡^ 357
6.5.5 Áô¦¡Âà´«¡]Implicit Conversions¡^ 359
6.6 CRTP 359
6.6.1 ¤@Ó²³æªº¨Ò¤l¡]A Simple Example¡^ 360
6.6.2 ¤@Ó¥i´_¥Îªº³X°Ý¾Þ§@²Å¡]A Reusable Access Operator¡^ 361
6.7 ½m²ß¡]Exercises) 364
6.7.1 µL¤¾§EªºµÙ§ÎÄ~©Ó¡]Non-redundant Diamond Shape¡^ 364
6.7.2 Ä~©Ó¦V¶qÃþ¡]Inheritance Vector Class¡^ 364
6.7.3 §J¶©¨ç¼Æ¡]Clone Function¡^ 364
²Ä7³¹ ¬ì¾Çpºâ¶µ¥Ø¡]Scientific Projects¡^ 365
7.1 ±`·L¤À¤èµ{¸Ñºâ¾¹ªº¹ê²{¡]Implementation of ODE Solvers¡^ 365
7.1.1 ±`·L¤À¤èµ{¡]Ordinary Differential Equations¡^ 366
7.1.2 Às®æ-®w¶ðªk¡]Runge-Kutta Algorithms¡^ 368
7.1.3 ªx«¬¹ê²{¡]Generic Implementation¡^ 369
7.1.4 ®i±æ¡]Outlook¡^ 376
7.2 ³Ð«Ø¤uµ{¡]Creating Projects¡^ 377
7.2.1 ºc«Ø¹Lµ{¡]Build Process¡^ 378
7.2.2 ºc«Ø¤u¨ã¡]Build Tools¡^ 382
7.2.3 ¤ÀÂ÷½sĶ¡]Separate Compilation¡^ 386
7.3 ³Ì²×ªº¸Ü¡]Some Final Words¡^ 391
ªþ¿ýA Âø½Í¡]Clumsy Stuff¡^ 393
A.1 §ó¦h¦nªº©ÎªÌ¤£¦nªº³n¥ó¡]More Good and Bad Scientific Software¡^ 393
A.2 ²Ó¸`¤¤ªº°ò¦¡]Basics in Detail¡^ 400
A.2.1 Ãö¤_¦r±¶q×¹¢ªº¨ä¥L¨Æ¶µ¡]More about Qualifying Literals¡^ 400
A.2.2 ÀRºAÅܶq¡]static Variables¡^ 401
A.2.3 Ãö¤_ifªº¨ä¥L¨Æ¶µ¡]More about if¡^ 402
A.2.4 ¹F¤Ò³]³Æ¡]Duff¡¦s Device¡^ 404
A.2.5 Ãö¤_mainªº¨ä¥L¨Æ¶µ¡]More about main¡^ 404
A.2.6 ²§±`ÁÙ¬OÂ_¨¥¡H¡]Assertion or Exception?¡^ 405
A.2.7 ¤G¶i¨îI/O¡]Binary I/O¡^ 406
A.2.8 C·®æªºI/O¡]C-Style I/O¡^ 407
A.2.9 ©U§£¦¬¶°¡]Garbage Collection¡^ 408
A.2.10 §»ªº³Â·Ð¡]Trouble with Macros¡^ 409
A.3 ²{¹ê¥@¬Éªº¥Î¨Ò¡G¯x°}¨D°f¡]Real-World Example: Matrix Inversion¡^ 411
A.4 Ãþªº¤@¨Ç²Ó¸`¡]Class Details¡^ 421
A.4.1 «ü¦V¦¨ûªº«ü°w¡]Pointer to Member¡^ 421
A.4.2 §ó¦hªºªì©l¤Æ¨Ò¤l¡]More Initialization Examples¡^ 422
A.4.3 ¦hºû¼Æ²Õªº¦s¨ú¡]Accessing Multi-dimensional Arrays¡^ 423
A.5 ¤èªkªº¥Í¦¨¡]Method Generation¡^ 426
A.5.1 ±±¨î¥Í¦¨ªº¥N½X¡]Controlling the Generation¡^ 428
A.5.2 ¥N½X¥Í¦¨ªº³W«h¡]Generation Rules¡^ 429
A.5.3 ³´¨À©M³]p«ü«n¡]Pitfalls and Design Guides¡^ 434
A.6 ¼ÒªO¬ÛÃöªº²Ó¸`¡]Template Details¡^ 438
A.6.1 ²Î¤@ªì©l¤Æ¡]Uniform Initialization¡^ 438
A.6.2 þÓ¨ç¼Æ³Q½Õ¥Î¤F¡H¡]Which Function Is Called?¡^ 439
A.6.3 °w¹ï¯S©wµw¥óªº¯S¤Æ¡]Specializing for Specific Hardware¡^ 442
A.6.4 ÅܰѤG¶i¨îI/O¡]Variadic Binary I/O¡^ 443
A.7 ¨Ï¥ÎC++03¤¤ªºstd::vector¡]Using std::vector in C++03¡^ 444
A.8 ´_¥j·®æªº°ÊºA¿ï¾Ü¡]Dynamic Selection in Old Style¡^ 445
A.9 ¤¸½sµ{ªº¤@¨Ç²Ó¸`¡]Meta-Programming Details¡^ 446
A.9.1 ¾ú¥v¤Wªº²Ä¤@Ó¤¸µ{§Ç¡]First Meta-Program in History¡^ 446
A.9.2 ¤¸¨ç¼Æ¡]Meta-Functions¡^ 448
A.9.3 ¦V¤UÝ®eªºÀRºAÂ_¨¥¡]Backward-Compatible Static Assertion¡^ 450
A.9.4 °Î¦WÃþ«¬°Ñ¼Æ¡]Anonymous Type Parameters¡^ 450
A.9.5 ¡§°ÊºA´`Àô®i¶}¡¨ªº©Ê¯à°ò·Ç´ú¸Õ·½½X¡]Benchmark Sources of
Dynamic Unrolling¡^ 454
A.9.6 ¯x°}¼ªkªº©Ê¯à°ò·Ç´ú¸Õ¡]Benchmark for Matrix Product¡^ 455
ªþ¿ýB ½sµ{¤u¨ã¡]Programming Tools¡^ 456
B.1 gcc 456
B.2 ½Õ¸Õ¡]Debugging¡^ 457
B.2.1 °ò¤_¤å¥»ªº½Õ¸Õ¾¹¡]Text-Based Debugger¡^ 458
B.2.2 ¨Ï¥Î¹Ï§Î¬É±DDD¶i¦æ½Õ¸Õ¡]Debugging with Graphical Interface: DDD¡^ 460
B.3 ¤º¦s¤ÀªR¡]Memory Analysis¡^ 462
B.4 gnuplot 463
B.5 UNIX¡BLinux©MmacOS¨t²Î¡]UNIX, Linux, and macOS¡^ 464
ªþ¿ýC »y¨¥©w¸q¡]Language Definitions¡^ 467
C.1 ÈÃþ§O¡]Value Categories¡^ 467
C.2 ¾Þ§@²Å·§Äý¡]Operator Overview¡^ 468
C.3 Ãþ«¬Âà´«³W«h¡]Conversion Rules¡^ 470
C.3.1 Ãþ«¬´£¤É¡]Promotion¡^ 471
C.3.2 ¨ä¥LÃþ«¬´£¤É¡]Other Conversions¡^ 471
C.3.3 ±`¥Îªº¼ÆÈÂà´«¡]Usual Arithmetic Conversions¡^ 472
C.3.4 ¯¶¤Æ¡]Narrowing¡^ |
§Ç¡G |