-- ·|­û / µù¥U -- ¡@
¡@±b¸¹¡G
¡@±K½X¡G
¡@ | µù¥U | §Ñ°O±K½X
3/26 ·s®Ñ¨ì¡I 3/19 ·s®Ñ¨ì¡I 3/14 ·s®Ñ¨ì¡I 12/12 ·s®Ñ¨ì¡I
ÁʮѬyµ{¡EQ & A¡E¯¸°È¯d¨¥ª©¡E«ÈªA«H½c
¢x 3ds Max¢x Maya¢x Rhino¢x After Effects¢x SketchUp¢x ZBrush¢x Painter¢x Unity¢x
¢x PhotoShop¢x AutoCad¢x MasterCam¢x SolidWorks¢x Creo¢x UG¢x Revit¢x Nuke¢x
¢x C#¢x C¢x C++¢x Java¢x ¹CÀ¸µ{¦¡¢x Linux¢x ´O¤J¦¡¢x PLC¢x FPGA¢x Matlab¢x
¢x Àb«È¢x ¸ê®Æ®w¢x ·j¯Á¤ÞÀº¢x ¼v¹³³B²z¢x Fluent¢x VR+AR¢x ANSYS¢x ²`«×¾Ç²ß¢x
¢x ³æ´¹¤ù¢x AVR¢x OpenGL¢x Arduino¢x Raspberry Pi¢x ¹q¸ô³]­p¢x Cadence¢x Protel¢x
¢x Hadoop¢x Python¢x Stm32¢x Cortex¢x Labview¢x ¤â¾÷µ{¦¡¢x Android¢x iPhone¢x
¥i¬d®Ñ¦W,§@ªÌ,ISBN,3dwoo®Ñ¸¹
¸Ô²Ó®ÑÄy¤ÀÃþ

²`«×±´¯ÁC++14

( ²Åé ¦r)
§@ªÌ¡G§d³¥Ãþ§O¡G1. -> µ{¦¡³]­p -> C++ -> C++
ĶªÌ¡G
¥Xª©ªÀ¡G¹q¤l¤u·~¥Xª©ªÀ²`«×±´¯ÁC++14 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­Ì¾Ç²ßªº½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¥D­n¨Ï¥Î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ªG­pºâ±K¶°«¬ªº¥N½X¡A­n¤\¥ÎSIMD«ü¥O°µ¦V¶q¤Æ¡A­n¤\©ñ¨ì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¥D­n¬Ý§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
? ¸¹ºÙ·ç¤h­x¤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¥D­n±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³W­S¡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­Ó³W­S³£©ú½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©Ê´y­z¡A³o¼Ë¥i¥H«Üª½Æ[¦aÅý¤j®aª¾¹D¬Y­Ó¯S©Ê¹ê»Ú¬O­n«ç¤\¨Ï¥Îªº¡C¦ý¬O¡A¥»®Ñªº¤£¨¬¤§³B¦b¤_¦³ÂIµo´²¡A«Ü¦h·§©À¤@µ§±a¹L¡CÁ`Åé¦Ó¨¥¡A·å¤£±»·ì¡A¥»®Ñ¹ï¤_¤w¦³C++98/03°ò¦¡A¥B·Q­n§Ö³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©Ò¦³ªº¥D­n³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¤W­z¤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¥Ü¨Ò©M­I´ºª¾ÃÑ¥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¥¦ªº¥D­n®Ø¬[¡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¨º¤\¤W­z³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©Ò­±Á{ªº¥D­n¬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
? ·íÀ³¥Îµ{§Ç³Ì¥D­nªº³¡¤À¬OWeb©M¹Ï§Î¬É­±¦}¥B­pºâ¸û¤Ö®É¡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¦Óµh­Wªº¡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