ซี++
| บทความนี้เป็นส่วนหนึ่งของชุดบทความเกี่ยวกับ ภาษาโปรแกรม C++ |
|
C++ [ b ]เป็น ภาษาโปรแกรม ระดับสูงอเนกประสงค์ที่สร้างขึ้นโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวเดนมาร์กBjarne Stroustrupเปิดตัวครั้งแรกในปี 1985 ในฐานะส่วนขยายของภาษาโปรแกรม Cโดยเพิ่ม คุณสมบัติ เชิงวัตถุ (OOP) และต่อมาได้ขยายตัวอย่างมากเมื่อเวลาผ่านไป โดยเพิ่มคุณสมบัติ OOP และคุณสมบัติอื่นๆ เพิ่มเติมณ ปี 1997/การกำหนดมาตรฐาน C++98 ทำให้ C++ เพิ่ม คุณสมบัติ เชิงฟังก์ชันนอกเหนือจากสิ่งอำนวยความสะดวกสำหรับ การจัดการ หน่วยความจำระดับต่ำ สำหรับระบบต่างๆ เช่นไมโครคอมพิวเตอร์หรือเพื่อสร้างระบบปฏิบัติการ เช่นLinuxหรือWindowsและต่อมาก็มีคุณสมบัติเช่นการเขียนโปรแกรมแบบเจเนริก (ผ่านการใช้เทมเพลต ) C++ มักถูกนำไปใช้เป็นภาษาคอมไพล์และผู้จำหน่ายหลายรายให้ บริการคอมไพ เลอร์ C++รวมถึงFree Software Foundation , LLVM , Microsoft , Intel , Embarcadero , OracleและIBM [ 16 ]
C++ ได้รับการออกแบบโดยคำนึงถึงการเขียนโปรแกรมระบบและซอฟต์แวร์ฝังตัวที่ มีทรัพยากรจำกัดและระบบขนาดใหญ่ โดยเน้น ประสิทธิภาพประสิทธิผล และความยืดหยุ่นในการใช้งานเป็นจุดเด่นในการออกแบบ[ 17 ]นอกจากนี้ C++ ยังพบว่ามีประโยชน์ในบริบทอื่นๆ อีกมากมาย โดยมีจุดแข็งที่สำคัญคือโครงสร้างพื้นฐานซอฟต์แวร์และแอปพลิเคชันที่มีทรัพยากรจำกัด[ 17 ]รวมถึงแอปพลิเคชันเดสก์ท็อป วิดีโอเกมเซิร์ฟเวอร์(เช่นอีคอมเมิร์ซการค้นหาเว็บหรือฐานข้อมูล ) และแอปพลิเคชันที่สำคัญต่อประสิทธิภาพ (เช่นสวิตช์โทรศัพท์หรือยานสำรวจอวกาศ ) [ 18 ]
C++ ได้รับการกำหนดมาตรฐานโดยองค์การมาตรฐานสากล (ISO) โดยมาตรฐานเวอร์ชันล่าสุดได้รับการรับรองและเผยแพร่โดย ISO ในเดือนตุลาคม 2024 ในชื่อISO/IEC 14882:2024 (เรียกอย่างไม่เป็นทางการว่าC++23 ) [ 19 ]ภาษาโปรแกรม C++ ได้รับการกำหนดมาตรฐานครั้งแรกในปี 1998 ในชื่อISO/IEC 14882:1998ซึ่งต่อมาได้รับการแก้ไขโดย มาตรฐาน C++03 , C++11 , C++14 , C++17และC++20 มาตรฐาน C++23ต่อมาได้เข้ามาแทนที่มาตรฐานเหล่านี้ด้วยคุณสมบัติใหม่และไลบรารีมาตรฐาน ที่ขยายใหญ่ขึ้น ก่อนการกำหนดมาตรฐานครั้งแรกในปี 1998 C++ ได้รับการพัฒนาโดย Stroustrup ที่Bell Labsตั้งแต่ปี 1979 ในฐานะส่วนขยายของภาษา C เขาต้องการภาษาที่มีประสิทธิภาพและยืดหยุ่นคล้ายกับ C ที่มีคุณสมบัติระดับสูงสำหรับการจัดระเบียบโปรแกรม ด้วย [ 20 ]ตั้งแต่ปี 2012 C++ มีกำหนดการออกเวอร์ชันใหม่ทุกสามปี[ 21 ]โดยมีC++29เป็นมาตรฐานถัดไปที่วางแผนไว้[ 22 ]
ประวัติศาสตร์

ในปี 1979 บียาร์เน สโตรสตรุปนักวิทยาศาสตร์คอมพิวเตอร์ชาวเดนมาร์กเริ่มทำงานเกี่ยวกับ "C ที่มีคลาสซึ่งเป็นภาษาต้นแบบของ C++ [ 23 ]แรงจูงใจในการสร้างภาษาใหม่นี้มาจากประสบการณ์การเขียนโปรแกรมของ Stroustrup สำหรับวิทยานิพนธ์ปริญญาเอกของเขา Stroustrup พบว่า Simulaมีคุณสมบัติที่เป็นประโยชน์อย่างมากสำหรับการพัฒนาซอฟต์แวร์ขนาดใหญ่ แต่ภาษานี้ช้าเกินไปสำหรับการใช้งานจริง ในขณะที่ BCPLนั้นเร็วแต่ระดับต่ำเกินไปที่จะเหมาะสำหรับการพัฒนาซอฟต์แวร์ขนาดใหญ่ เมื่อ Stroustrup เริ่มทำงานที่ AT&T Bell Labsเขาประสบปัญหาในการวิเคราะห์เคอร์เนลUNIX ที่เกี่ยวข้องกับการประมวลผลแบบกระจายเมื่อนึกถึงประสบการณ์ปริญญาเอกของเขา Stroustrup จึงเริ่มพัฒนา ภาษา Cด้วยคุณสมบัติที่คล้ายกับ Simula [ 24 ]เลือก C เพราะเป็นภาษาอเนกประสงค์ รวดเร็ว พกพาได้ และใช้งานกันอย่างแพร่หลาย นอกจากอิทธิพลของ C และ Simula แล้ว ภาษาอื่นๆ ก็มีอิทธิพลต่อภาษาใหม่นี้ด้วย ได้แก่ ALGOL 68 , Ada , CLUและ ML [ 25 ]
ในขั้นต้น "C with Classes" ของ Stroustrup ได้เพิ่มคุณสมบัติให้กับคอมไพเลอร์ Cpre รวมถึงคลาสคลาสที่สืบทอด การกำหนดประเภท ที่เข้มงวดการอินไลน์และอาร์กิวเมนต์เริ่มต้น[ 26 ]

ในปี พ.ศ. 2525 Stroustrup เริ่มออกแบบภาษา C เวอร์ชันปรับปรุงและขยายเพิ่มเติมโดยใช้คลาส โดยใช้เทคโนโลยีคอมไพเลอร์แบบดั้งเดิม[ 27 ]ภาษานี้ถูกเรียกว่า C84 ชั่วคราวก่อนที่จะใช้ชื่อ C++ ซึ่งชื่อนี้ได้รับการแนะนำโดย Rick Mascitti และหมายถึง++ตัวดำเนินการเพิ่มค่า ของ ภาษา C [ 27 ] [ 28 ]ภาษาที่ได้นั้นประกอบด้วยฟังก์ชันเสมือนการโอเวอร์โหลดฟังก์ชันและ ตัวดำเนินการ การอ้างอิงการตรวจสอบประเภทconstที่ดีขึ้นการจัดสรรหน่วยความจำแบบฟรีสโตร์ที่ผู้ใช้ควบคุมได้ ( / ) และความคิดเห็น แบบบรรทัดเดียวสไตล์ BCPL [ 27 ] Stroustrup ยังออกแบบและใช้งานCfront ซึ่งเป็นส่วนหน้าของคอมไพเลอร์ C++ ระหว่างฤดูใบไม้ผลิปี พ.ศ. 2525 ถึงฤดูร้อนปี พ.ศ. 2526 [ 27 ]newdelete//
ในปี พ.ศ. 2527 Stroustrup ได้นำไลบรารีอินพุต/เอาต์พุตสตรีมตัวแรกมาใช้ แนวคิดในการจัดเตรียมตัวดำเนินการเอาต์พุตแทนที่จะเป็นฟังก์ชันเอาต์พุตที่มีชื่อนั้นได้รับการเสนอแนะโดยDoug McIlroy [ 4 ] (ซึ่งก่อนหน้านี้ได้เสนอแนะท่อ Unix )
ในปี พ.ศ. 2528 หนังสือThe C++ Programming Language ฉบับพิมพ์ครั้งแรก ได้รับการเผยแพร่ ซึ่งกลายเป็นหนังสืออ้างอิงที่สำคัญสำหรับภาษานี้ เนื่องจากยังไม่มีมาตรฐานอย่างเป็นทางการ[ 29 ]การใช้งานเชิงพาณิชย์ครั้งแรกของ C++ ได้รับการเผยแพร่ในเดือนตุลาคมของปีเดียวกัน[ 23 ]
ในปี พ.ศ. 2532 C++ 2.0 ได้ถูกเผยแพร่ ตามมาด้วยฉบับปรับปรุงครั้งที่สองของThe C++ Programming Languageในปี พ.ศ. 2534 [ 30 ]คุณสมบัติใหม่ในเวอร์ชัน 2.0 ได้แก่ การสืบทอดแบบหลายทาง คลาสแบบนามธรรม ฟังก์ชันสมาชิกแบบคงที่ ฟังก์ชันสมาชิกแบบคงที่และสมาชิกแบบป้องกัน ในปี พ.ศ. 2533 ได้มีการตีพิมพ์ The Annotated C++ Reference Manual ซึ่งงานนี้ได้กลายเป็นพื้นฐานสำหรับมาตรฐานในอนาคต คุณสมบัติเพิ่มเติมในภายหลัง ได้แก่เทมเพลตข้อยกเว้นเนมสเปซการแปลงประเภทใหม่และประเภทบูลีน
ในปี 1998 C++98 ได้ถูกปล่อยออกมา ซึ่งเป็นการกำหนดมาตรฐานของภาษา และมีการอัปเดตเล็กน้อย ( C++03 ) ในปี 2003
หลังจาก C++98 แล้ว C++ พัฒนาไปอย่างค่อนข้างช้า จนกระทั่งในปี 2011 มาตรฐาน C++11ได้ถูกเผยแพร่ ซึ่งเพิ่มคุณสมบัติใหม่มากมาย ขยายไลบรารีมาตรฐานให้กว้างขึ้น และมอบสิ่งอำนวยความสะดวกเพิ่มเติมให้กับโปรแกรมเมอร์ C++ หลังจากมี การอัปเดต C++14 เล็กน้อย ในเดือนธันวาคม 2014 ก็มีการแนะนำส่วนเพิ่มเติมใหม่ต่างๆ ในC++17 [ 31 ] หลังจากได้รับการสรุปในเดือนกุมภาพันธ์ 2020 [ 32 ]ร่างมาตรฐาน C++20 ได้รับการอนุมัติเมื่อวันที่ 4 กันยายน 2020 และเผยแพร่อย่างเป็นทางการเมื่อวันที่ 15 ธันวาคม 2020 [ 33 ] [ 34 ]
เมื่อวันที่ 3 มกราคม 2018 Stroustrup ได้รับการประกาศให้เป็นผู้ชนะรางวัลCharles Stark Draper Prize for Engineering ประจำปี 2018 "สำหรับการคิดค้นและพัฒนาภาษาการเขียนโปรแกรม C++" [ 35 ]
ในเดือนธันวาคม 2022 ภาษา C++ อยู่ในอันดับที่สามของดัชนี TIOBEแซงหน้าภาษาJavaเป็นครั้งแรกในประวัติศาสตร์ของดัชนีนี้ณ เดือนพฤศจิกายน2024 ภาษานี้อยู่ในอันดับที่สองรองจากPythonโดยมี Java อยู่ในอันดับที่สาม[ 36 ]
ในเดือนมีนาคม พ.ศ. 2568 Stroustrup ได้ออกคำเรียกร้องให้ชุมชนภาษาปกป้องภาษาดังกล่าว เนื่องจากภาษานี้อนุญาตให้จัดการหน่วยความจำด้วยตนเอง บั๊กที่ก่อให้เกิดความเสี่ยงด้านความปลอดภัย เช่นบัฟเฟอร์โอเวอร์โฟลว์อาจเกิดขึ้นในโปรแกรมเมื่อโปรแกรมเมอร์ใช้งานผิดวิธีโดยไม่ได้ตั้งใจ[ 37 ]
นิรุกติศาสตร์
ตามที่ Stroustrup กล่าวไว้ว่า "ชื่อนี้บ่งบอกถึงลักษณะวิวัฒนาการของการเปลี่ยนแปลงจาก C" [ 38 ]ชื่อนี้ได้รับการยกเครดิตให้กับ Rick Mascitti (กลางปี 1983) [ 26 ]และถูกใช้ครั้งแรกในเดือนธันวาคม 1983 เมื่อ Mascitti ถูกถามอย่างไม่เป็นทางการในปี 1992 เกี่ยวกับการตั้งชื่อ เขาชี้ว่ามันถูกตั้งขึ้นด้วยอารมณ์ขัน ชื่อนี้มาจากตัวดำเนินการของ C (ซึ่งเพิ่มค่าของตัวแปร++)และธรรมเนียมการตั้งชื่อทั่วไปที่ใช้ "+" เพื่อบ่งชี้ถึงโปรแกรมคอมพิวเตอร์ที่ได้รับการปรับปรุง
ในระหว่างช่วงการพัฒนา C++ ภาษาดังกล่าวถูกเรียกว่า "C ใหม่" และ "C ที่มีคลาส" [ 26 ] [ 39 ]ก่อนที่จะได้รับชื่อสุดท้าย
ปรัชญา
ตลอดช่วงชีวิตของ C++ การพัฒนาและวิวัฒนาการของมันได้รับการชี้นำโดยหลักการชุดหนึ่ง: [ 24 ]
- มันต้องเกิดจากปัญหาที่เกิดขึ้นจริง และคุณสมบัติของมันควรมีประโยชน์โดยตรงในโปรแกรมต่างๆ ในโลกแห่งความเป็นจริง
- ทุกฟีเจอร์ควรสามารถนำไปใช้งานได้จริง (โดยมีวิธีการที่ค่อนข้างชัดเจน)
- โปรแกรมเมอร์ควรมีอิสระในการเลือกรูปแบบการเขียนโปรแกรมของตนเอง และรูปแบบนั้นควรได้รับการสนับสนุนอย่างเต็มที่จากภาษา C++
- การอนุญาตให้ใช้งานฟีเจอร์ที่มีประโยชน์นั้นสำคัญกว่าการป้องกันการใช้งาน C++ ในทางที่ผิดทุกรูปแบบ
- ควรจัดให้มีสิ่งอำนวยความสะดวกสำหรับการจัดโปรแกรมออกเป็นส่วนๆ ที่แยกจากกันอย่างชัดเจน และจัดให้มีสิ่งอำนวยความสะดวกสำหรับการรวมส่วนต่างๆ ที่พัฒนาแยกจากกันเข้าด้วยกัน
- ห้ามมีการละเมิด ระบบประเภทข้อมูลโดยปริยาย(แต่ยอมให้มีการละเมิดโดยชัดแจ้งได้ กล่าวคือ การละเมิดที่โปรแกรมเมอร์ร้องขอโดยตรง)
- ประเภทข้อมูลที่ผู้ใช้สร้างขึ้นจะต้องได้รับการสนับสนุนและประสิทธิภาพการทำงานเช่นเดียวกับประเภทข้อมูลพื้นฐานที่มีอยู่แล้ว
- ฟังก์ชันที่ไม่ได้ใช้งานไม่ควรส่งผลเสียต่อไฟล์ปฏิบัติการที่สร้างขึ้น (เช่น ทำให้ประสิทธิภาพลดลง)
- ไม่ควรมีภาษาโปรแกรมใด ๆ ที่อยู่ต่ำกว่า C++ (ยกเว้นภาษาแอสเซมบลี )
- ภาษาC++ ควรทำงานร่วมกับภาษาโปรแกรม อื่นๆ ที่มีอยู่แล้ว แทนที่จะสร้างสภาพแวดล้อมการเขียนโปรแกรม ที่แยกต่างหากและเข้ากันไม่ได้ของตัวเอง
- หากไม่ทราบเจตนาของโปรแกรมเมอร์ ให้โปรแกรมเมอร์ระบุเจตนานั้นโดยการให้ควบคุมด้วยตนเอง
การกำหนดมาตรฐาน
| ปี | มาตรฐาน ISO/IEC | ชื่อเรียกอย่างไม่เป็นทางการ |
|---|---|---|
| 1998 | 14882:1998 [ 40 ] | ซี++98 |
| 2003 | 14882:2003 [ 41 ] | ซี++03 |
| 2011 | 14882:2011 [ 42 ] | C++11 , C++0x |
| 2014 | 14882:2014 [ 43 ] | C++14 , C++1y |
| 2017 | 14882:2017 [ 44 ] | C++17 , C++1z |
| 2020 | 14882:2020 [ 45 ] | C++20 , C++2a |
| 2024 | 14882:2024 [ 19 ] | C++23 , C++2b |
| รอประกาศ | C++26 , C++2c |
C++ ได้รับการกำหนดมาตรฐานโดยกลุ่มทำงานISO ที่รู้จักกันในชื่อ JTC1/SC22/WG21กลุ่มทำงานนี้จัดการประชุมเป็นเวลาหนึ่งสัปดาห์สามครั้งในแต่ละปี[ 46 ]จนถึงปัจจุบัน ได้มีการเผยแพร่มาตรฐาน C++ ฉบับแก้ไขเจ็ดฉบับ และกำลังดำเนินการแก้ไขฉบับต่อไปคือC++ 26

ในปี 1998 คณะทำงานของ ISO ได้กำหนดมาตรฐาน C++ เป็นครั้งแรกในชื่อISO/IEC 14882:1998ซึ่งเรียกกันอย่างไม่เป็นทางการว่าC++98ต่อมาในปี 2003 ได้มีการเผยแพร่มาตรฐาน C++ เวอร์ชันใหม่ในชื่อISO/IEC 14882:2003ซึ่งแก้ไขปัญหาที่พบใน C++98
การแก้ไขมาตรฐานครั้งสำคัญถัดไปได้รับการเรียกอย่างไม่เป็นทางการว่า "C++0x" แต่ไม่ได้เผยแพร่จนกระทั่งปี 2011 [ 47 ] C++11 (14882:2011) มีส่วนเพิ่มเติมมากมายทั้งในภาษาหลักและไลบรารีมาตรฐาน[ 42 ]
ในปี 2014 C++14 (หรือที่รู้จักกันในชื่อ C++1y) ได้รับการเผยแพร่เป็นส่วนขยายเล็กๆ ของ C++11 โดยส่วนใหญ่เป็นการแก้ไขข้อบกพร่องและการปรับปรุงเล็กน้อย[ 48 ] ขั้นตอนการลงคะแนนเสียงร่างมาตรฐานสากลเสร็จสิ้นในช่วงกลางเดือนสิงหาคม 2014 [ 49 ]
หลังจาก C++14 การแก้ไขครั้งใหญ่C++17ซึ่งเรียกกันอย่างไม่เป็นทางการว่า C++1z เสร็จสมบูรณ์โดยคณะกรรมการ ISO C++ ในช่วงกลางเดือนกรกฎาคม 2017 และได้รับการอนุมัติและเผยแพร่ในเดือนธันวาคม 2017 [ 50 ]
ในส่วนหนึ่งของกระบวนการกำหนดมาตรฐาน ISO ยังได้เผยแพร่รายงานทางเทคนิคและข้อกำหนดต่างๆ ด้วย :
- ISO/IEC TR 18015:2006 [ 51 ]เกี่ยวกับการใช้ C++ ในระบบฝังตัวและผลกระทบด้านประสิทธิภาพของภาษา C++ และคุณลักษณะของไลบรารี
- ISO/IEC TR 19768:2007 [ 52 ] (หรือที่รู้จักกันในชื่อC++ Technical Report 1 ) เกี่ยวกับส่วนขยายไลบรารีส่วนใหญ่ที่รวมอยู่ในC++ 11
- ISO/IEC TR 29124:2010 [ 53 ]เกี่ยวกับฟังก์ชันทางคณิตศาสตร์พิเศษที่รวมเข้ากับC++ 17
- ISO/IEC TR 24733:2011 [ 54 ]เกี่ยวกับเลขคณิตจุดลอยตัวทศนิยม
- ISO/IEC TS 18822:2015 [ 55 ]เกี่ยวกับไลบรารีระบบไฟล์มาตรฐานที่รวมเข้ากับC++ 17
- ISO/IEC TS 19570:2015 [ 56 ]เกี่ยวกับ เวอร์ชัน คู่ขนานของอัลกอริธึมไลบรารีมาตรฐานที่รวมเข้ากับC++ 17
- ISO/IEC TS 19841:2015 [ 57 ]เกี่ยวกับหน่วยความจำธุรกรรมซอฟต์แวร์
- ISO/IEC TS 19568:2015 [ 58 ]เกี่ยวกับชุดส่วนขยายไลบรารีใหม่ ซึ่งบางส่วนได้ถูกรวมเข้าไว้ในC++17แล้ว
- ISO/IEC TS 19217:2015 [ 59 ] เกี่ยวกับ แนวคิด C++ ซึ่งรวมเข้ากับC++ 20
- ISO/IEC TS 19571:2016 [ 60 ]เกี่ยวกับส่วนขยายไลบรารีสำหรับการทำงานพร้อมกัน ซึ่งบางส่วนได้ถูกรวมเข้าไว้ในC++20แล้ว
- ISO/IEC TS 19568:2017 [ 61 ]เกี่ยวกับชุดส่วนขยายไลบรารีอเนกประสงค์ชุดใหม่
- ISO/IEC TS 21425:2017 [ 62 ]เกี่ยวกับส่วนขยายไลบรารีสำหรับช่วงที่รวมเข้ากับC++ 20
- ISO/IEC TS 22277:2017 [ 63 ]เกี่ยวกับ coroutines ที่รวมเข้ากับC++ 20
- ISO/IEC TS 19216:2018 [ 64 ]เกี่ยวกับไลบรารีเครือข่าย
- ISO/IEC TS 21544:2018 [ 65 ]เกี่ยวกับโมดูลที่รวมเข้ากับC++ 20
- ISO/IEC TS 19570:2018 [ 66 ]เกี่ยวกับชุดส่วนขยายไลบรารีใหม่สำหรับการทำงานแบบขนาน
- ISO/IEC TS 23619:2021 [ 67 ]เกี่ยวกับส่วนขยายใหม่สำหรับการเขียนโปรแกรมแบบสะท้อน (การสะท้อน)
- ISO/IEC TS 9922:2024 [ 68 ]เกี่ยวกับชุดส่วนขยายการทำงานพร้อมกันชุดใหม่ และ
- ISO/IEC TS 19568:2024 [ 69 ]เกี่ยวกับชุดส่วนขยายไลบรารีชุดใหม่อีกชุดหนึ่ง
ข้อกำหนดทางเทคนิคเพิ่มเติมอยู่ระหว่างการพัฒนาและรอการอนุมัติ
ภาษา
ภาษา C++ มีส่วนประกอบหลักสองส่วน ได้แก่ การแมปโดยตรงของคุณสมบัติฮาร์ดแวร์ที่จัดเตรียมโดยส่วนย่อย C เป็นหลัก และนามธรรมที่ไม่มีค่าใช้จ่ายเพิ่มเติมโดยอิงจากการแมปเหล่านั้น Stroustrup อธิบาย C++ ว่าเป็น "ภาษาการเขียนโปรแกรมนามธรรมที่มีน้ำหนักเบา [ออกแบบ] สำหรับการสร้างและใช้งานนามธรรมที่มีประสิทธิภาพและสง่างาม" [ 17 ] และ "การนำเสนอทั้งการเข้าถึงฮาร์ดแวร์และนามธรรมเป็นพื้นฐานของ C++ การทำเช่นนั้นอย่างมีประสิทธิภาพคือสิ่งที่ทำให้มันแตกต่างจากภาษาอื่นๆ" [ 70 ]
C++ สืบทอดไวยากรณ์ส่วนใหญ่ของ Cโปรแกรมhello world ที่สอดคล้องกับมาตรฐาน Cก็เป็นโปรแกรม hello world ที่ถูกต้องใน C++ เช่นกัน ต่อไปนี้ดัดแปลงมาจากโปรแกรมHello world เวอร์ชันของ Bjarne Stroustrup ที่ใช้ ฟังก์ชัน stream ของไลบรารีมาตรฐาน C++เพื่อเขียนข้อความไปยังเอาต์พุตมาตรฐาน : [ 71 ] [ 72 ] [ c ]
#include <iostream>int main () {std :: cout << "Hello, world! \n " ;}ตั้งแต่C++23 เป็นต้น มา ด้วยการแนะนำ ฟังก์ชัน std::printและโมดูลstdทำให้สามารถแสดงข้อความนี้ได้กระชับยิ่งขึ้นดังนี้:
import std ;int main () {std :: println ( "Hello, world!" );}ไลบรารีมาตรฐาน

มาตรฐาน C++ ระบุทั้งภาษาหลักและไลบรารีมาตรฐานข้อกำหนดเกี่ยวกับไลบรารีอธิบายเนื้อหาของไลบรารี วิธีที่โปรแกรม C++ ที่ถูกต้องใช้ไลบรารี และข้อกำหนดที่กำหนดไว้สำหรับการใช้งานที่สอดคล้อง[ 73 ]
ไลบรารีมาตรฐานถูกจัดระเบียบเป็นพื้นที่ต่างๆ เช่น การสนับสนุนภาษา การวินิจฉัยการจัดการหน่วยความจำเมตาโปรแกรมมิ่งยูทิลิตี้ทั่วไปคอนเทนเนอร์ตัววนซ้ำช่วงอัลกอริทึม สตริงการ ประมวล ผลข้อความตัวเลขเวลาอินพุต/เอาต์พุตและการสนับสนุนการทำงานพร้อมกัน[ 73 ]นอกจากนี้ยังจัดเตรียมสิ่งอำนวยความสะดวกของไลบรารีมาตรฐาน C ผ่าน ส่วนหัว C++ เช่น<cstdio>และ<cstdlib>ยกเว้นชื่อที่กำหนดเป็นมาโครใน C การประกาศเหล่านี้จะถูกวางไว้ในเนมสเปstdซ[ 74 ]
สิ่งอำนวยความสะดวกของไลบรารีมักจะพร้อมใช้งานโดยการรวมส่วนหัวมาตรฐาน เช่นตั้งแต่ C++20 เป็นต้นมา ส่วนหัวไลบรารีมาตรฐานที่สามารถนำเข้าได้ยังสามารถนำเข้าเป็นหน่วยส่วนหัวได้อีกด้วย C++23 ได้เพิ่มโมดูลไลบรารีมาตรฐานที่มีชื่อและ: ส่งออกการประกาศในเนมสเปซในขณะเดียวกันก็ส่งออกการประกาศเนมสเปซส่วนกลางที่สอดคล้องกันสำหรับสิ่งอำนวยความสะดวกของไลบรารี C ด้วย[ 75 ]#include<vector>stdstd.compatstdstdstd.compat
อิทธิพลสำคัญต่อไลบรารีมาตรฐานคือStandard Template Library (STL) ซึ่งเป็นไลบรารีการเขียนโปรแกรมทั่วไปที่เสนอต่อคณะกรรมการมาตรฐาน C++ โดย Alexander Stepanov และ Meng Lee ในปี 1994 รูปแบบของคอนเทนเนอร์ ตัววนซ้ำ และอัลกอริทึมทั่วไปได้กลายเป็นส่วนหนึ่งของ Standard C++ Library แม้ว่าไลบรารีมาตรฐานจะมีสิ่งอำนวยความสะดวกอื่นๆ อีกมากมาย เช่น การรับ/ส่งข้อมูล การแปล การวินิจฉัย และชุดย่อยของไลบรารี C [ 76 ] [ 77 ]
หลักเกณฑ์หลักของ C++
แนวทางหลักของ C++ [ 78 ]เป็นโครงการริเริ่มที่นำโดย Stroustrup และ Herb Sutter ผู้ประสานงานและประธานกลุ่มทำงาน C++ ISO เพื่อช่วยให้โปรแกรมเมอร์เขียน 'Modern C++' โดยใช้แนวทางปฏิบัติที่ดีที่สุดสำหรับมาตรฐานภาษา C++11 และเวอร์ชันใหม่กว่า และเพื่อช่วยให้นักพัฒนาคอมไพเลอร์และเครื่องมือตรวจสอบแบบคงที่สร้างกฎสำหรับการตรวจจับแนวทางการเขียนโปรแกรมที่ไม่ดี จุดมุ่งหมายหลักคือการเขียน C++ ที่ปลอดภัยทั้งประเภทและทรัพยากรอย่างมีประสิทธิภาพและสม่ำเสมอ อย่างไรก็ตาม แนวทางเหล่านี้ไม่ได้รับการรับรองจากคณะกรรมการมาตรฐาน ISO C++ และไม่ได้แสดงถึงฉันทามติของคณะกรรมการ[ 79 ]
แนวทางหลักได้รับการประกาศ[ 80 ]ในการกล่าวเปิดงาน CPPCon 2015
แนวทางดังกล่าวมาพร้อมกับไลบรารีสนับสนุนแนวทาง (GSL) ซึ่งเป็นไลบรารีส่วนหัวเท่านั้นของประเภทและฟังก์ชันเพื่อนำแนวทางหลักไปใช้ และเครื่องมือตรวจสอบแบบคงที่สำหรับการบังคับใช้กฎของแนวทาง[ 81 ]หนึ่งในการใช้งานที่ใหญ่ที่สุดคือการใช้งานของ Microsoft [ 82 ]คุณสมบัติที่มีอยู่มากมายใน GSL ได้ถูกรวมเข้ากับภาษาในภายหลัง เช่นตัวstd::byteชี้อัจฉริยะ และ[ 82std::span ]
ความเข้ากันได้
เพื่อให้ผู้ผลิตคอมไพเลอร์มีอิสระมากขึ้น คณะกรรมการมาตรฐาน C++ จึงตัดสินใจที่จะไม่กำหนดการใช้งานการแปลงชื่อการจัดการข้อยกเว้นและคุณสมบัติเฉพาะการใช้งานอื่นๆ ข้อเสียของการตัดสินใจนี้คือ คาดว่าโค้ดออบเจ็กต์ ที่สร้างโดย คอมไพเลอร์ต่างๆจะไม่เข้ากัน อย่างไรก็ตาม มีความพยายามที่จะกำหนดมาตรฐานคอมไพเลอร์สำหรับเครื่องหรือระบบปฏิบัติการ เฉพาะ ตัวอย่างเช่น Itanium C++ ABI เป็นอิสระจากโปรเซสเซอร์ (แม้จะมีชื่อเช่นนั้น) และถูกนำไปใช้โดย GCC และ Clang [ 83 ]
ด้วยซี
C++ มักถูกมองว่าเป็นซูเปอร์เซ็ตของCแต่ความจริงแล้วไม่ใช่เช่นนั้นเสมอไป[ 84 ]โค้ด C ส่วนใหญ่สามารถคอมไพล์ได้อย่างถูกต้องใน C++ แต่มีความแตกต่างเล็กน้อยที่ทำให้โค้ด C ที่ถูกต้องบางส่วนไม่ถูกต้องหรือทำงานแตกต่างกันใน C++ ตัวอย่างเช่น C อนุญาตให้แปลงโดยปริยายจากประเภทพอยเตอร์หนึ่งไปยังอีกประเภทหนึ่ง แต่ C++ ไม่อนุญาต (ด้วยเหตุผลด้านความปลอดภัยของประเภท) นอกจากนี้ C++ ยังกำหนดคำหลักใหม่หลายคำ เช่นและซึ่งอาจใช้เป็นตัวระบุ (เช่น ชื่อตัวแปร) ในโปรแกรม Cvoid*newclass
ความไม่เข้ากันบางประการได้รับการแก้ไขโดยมาตรฐาน C ฉบับปรับปรุงปี 1999 ( C99 ) ซึ่งขณะนี้รองรับคุณสมบัติของ C++ เช่น ความคิดเห็นบรรทัด ( //) และการประกาศที่ผสมกับโค้ด ในทางกลับกัน C99 ได้แนะนำคุณสมบัติใหม่จำนวนหนึ่งที่ C++ ไม่รองรับ ซึ่งไม่เข้ากันหรือซ้ำซ้อนใน C++ เช่นอาร์เรย์ที่มีความยาวแปรผันประเภทจำนวนเชิงซ้อนดั้งเดิม (อย่างไรก็ตามคลาสในไลบรารีมาตรฐาน C++ ให้ฟังก์ชันการทำงานที่คล้ายกัน แม้ว่าจะไม่เข้ากันกับโค้ดก็ตาม) ตัวเริ่มต้นที่กำหนดตัวอักษรประกอบและคำหลัก[ 85 ]คุณสมบัติบางอย่างที่ C99 แนะนำได้ถูกรวมไว้ในมาตรฐาน C++ เวอร์ชันถัดไปC++11 (จากคุณสมบัติที่ไม่ซ้ำซ้อน) [ 86 ] [ 87 ] [ 88 ]อย่างไรก็ตาม มาตรฐาน C++11 ได้แนะนำความไม่เข้ากันใหม่ เช่น การไม่อนุญาตให้กำหนดค่าตัวอักษรสตริงให้กับตัวชี้อักขระ ซึ่งยังคงเป็น C ที่ถูกต้องstd::complexrestrict
ในการผสมผสานโค้ด C และ C++ เข้าด้วยกัน การประกาศหรือนิยามฟังก์ชันใดๆ ที่จะถูกเรียกใช้/ใช้งานทั้งในภาษา C และ C++ จะต้องประกาศโดยใช้การเชื่อมโยงแบบ C โดยการวางไว้ภายในบล็อก ฟังก์ชันดังกล่าวจะต้องไม่พึ่งพาคุณสมบัติที่ขึ้นอยู่กับการแปลงชื่อ (เช่น การโอเวอร์โหลดฟังก์ชัน)extern"C"{/*...*/}
การประกอบแบบอินไลน์
โปรแกรมที่พัฒนาด้วยภาษา C หรือ C++ มักใช้ภาษาแอสเซมบลีแบบอินไลน์เพื่อใช้ประโยชน์จากฟังก์ชันระดับต่ำ ความเร็วที่มากขึ้น และการควบคุมที่ดียิ่งขึ้นเมื่อเทียบกับภาษาโปรแกรมระดับสูง[ 89 ] [ 90 ]เมื่อการเพิ่มประสิทธิภาพเป็นสิ่งสำคัญ ภาษา C++ ให้การสนับสนุนการฝัง ภาษา แอสเซมบลีโดยใช้การประกาศ asm [ 91 ]แต่ความเข้ากันได้ของ ภาษา แอสเซมบลีแบบอินไลน์จะแตกต่างกันอย่างมากระหว่างคอมไพเลอร์และสถาปัตยกรรม ต่างจากคุณสมบัติของภาษาโปรแกรมระดับสูง เช่นPythonหรือJavaโค้ดแอสเซมบลีขึ้นอยู่กับโปรเซสเซอร์และการใช้งานคอมไพเลอร์พื้นฐานเป็นอย่างมาก
ความแตกต่างระหว่างคอมไพเลอร์ต่างๆ
คอมไพเลอร์ C++ แต่ละตัวมีวิธีการใช้งานแอสเซมบลีแบบอินไลน์ที่แตกต่างกัน
- GCC ( GNU Compiler Collection ) และClang : [ 92 ]คอมไพเลอร์ทั้งสองใช้ไวยากรณ์แอสเซมบลีแบบอินไลน์ที่ขยายของ GCC โดยใช้
__asm__คำหลักแทนasmเมื่อเขียนโค้ดที่สามารถคอมไพล์ได้ด้วยตัวเลือก ซึ่งช่วยให้สามารถระบุตัวดำเนินการอินพุต/เอาต์พุตและรีจิสเตอร์ที่ถูกเปลี่ยนแปลงได้ แนวทางนี้ยังถูกนำไปใช้ในที่อื่น ๆ ด้วย รวมถึงคอมไพเลอร์ ของ Intel [ 93 ]และ IBM [ 94 ]-ansi-std - MSVC ( Microsoft Visual C++ ): ตัวประกอบแอสเซมบลีแบบอินไลน์ถูกสร้างขึ้นในคอมไพเลอร์ ก่อนหน้านี้รองรับการประกอบแอสเซมบลีแบบอินไลน์ผ่าน
__asmคีย์เวิร์ด แต่การสนับสนุนนี้ถูกลบออกในโหมด 64 บิต ทำให้ต้องใช้โมดูล .asm แยกต่างหากแทน[ 95 ] - TI ARM Clang และคอมไพเลอร์ฝังตัว: [ 96 ]คอมไพเลอร์ระบบฝังตัวบางตัว เช่น TI Arm Clang ของ Texas Instruments อนุญาตให้ใช้แอสเซมบลีแบบอินไลน์ แต่กำหนดกฎที่เข้มงวดกว่าเพื่อหลีกเลี่ยงความขัดแย้งกับข้อกำหนดการลงทะเบียนและข้อกำหนดการเรียก
ความสามารถในการทำงานร่วมกันระหว่างภาษา C++ และภาษา Assembly
C++ มีวิธีการหลักสองวิธีในการผสานรวมโค้ด ASM ได้แก่ ไฟล์แอสเซมบลีแบบสแตนด์อะโลน ซึ่งโค้ดแอสเซมบลีจะถูกเขียนแยกต่างหากและเชื่อมโยงกับโค้ด C++ [ 97 ]และแอสเซมบลีแบบอินไลน์ซึ่งโค้ดแอสเซมบลีจะถูกฝังอยู่ภายในโค้ด C++ โดยใช้ส่วนขยายเฉพาะของคอมไพเลอร์
ดูเพิ่มเติม
- Carbon (ภาษาโปรแกรม) — กำลังได้รับการพัฒนาโดย Google เพื่อเป็นตัวเลือกทดแทน C++
- การเปรียบเทียบภาษาโปรแกรม
- รายชื่อคอมไพเลอร์ C++
- รายชื่อซอฟต์แวร์และเครื่องมือ C++
- รายชื่อหนังสือเกี่ยวกับการเขียนโปรแกรมภาษา C++
- โครงร่างของภาษา C++
- หมวดหมู่: ไลบรารี C++
หมายเหตุ
- ↑สำหรับแนวคิดของ coroutines แบบไร้ stack ใน C++20
- ↑ออกเสียงว่า / ˈ s iː p l ʌ s p l ʌ s / ดูPLUSS PLUSS และบางครั้ง ย่อเป็น CPPหรือ CXX
- ↑โค้ดนี้ดัดแปลงมาจากหน้าแก้ไขข้อผิดพลาดของ Bjarne Stroustrup (หน้า 633) เขาได้กล่าวถึงการใช้
'\n'แทนที่จะใช้ นอกจากนี้std::endlโปรดดูที่ฉันสามารถเขียน "void main()" ได้หรือไม่? เก็บถาวรเมื่อวันที่ 2 กรกฎาคม 2020 ที่ Wayback Machineสำหรับคำอธิบายเกี่ยวกับค่าส่งคืนโดยปริยายreturn 0;ในmainฟังก์ชัน ค่าส่งคืนโดยปริยายนี้ไม่มีในฟังก์ชันอื่นๆ
อ่านเพิ่มเติม
- Abrahams, David ; Gurtovoy, Aleksey (2005). C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond . Addison-Wesley. ISBN 0-321-22725-5.
- Alexandrescu, Andrei (2001). การออกแบบ C++ สมัยใหม่: การเขียนโปรแกรมแบบทั่วไปและรูปแบบการออกแบบที่นำไปใช้ . Addison-Wesley. ISBN 0-201-70431-5.
- Alexandrescu, Andrei ; Sutter, Herb (2004). มาตรฐานการออกแบบและการเขียนโค้ด C++: กฎและแนวทางสำหรับการเขียนโปรแกรม Addison-Wesley. ISBN 0-321-11358-6.
- Becker, Pete (2006). ส่วนขยายไลบรารีมาตรฐาน C++ : คู่มือและเอกสารอ้างอิง Addison-Wesley. ISBN 0-321-41299-0.
- บร็อกเคน, แฟรงค์ (2026) [ปีที่ตีพิมพ์ครั้งแรก: 1994]. คำอธิบายประกอบ C++ . ISBN 978-90-367-0470-0.
- Coplien, James O. (1994) [พิมพ์ซ้ำพร้อมแก้ไข ปีที่พิมพ์เดิม 1992]. Advanced C++: Programming Styles and Idioms . Addison-Wesley. ISBN 0-201-54855-0.
- Dewhurst, Stephen C. (2005). ความรู้ทั่วไปเกี่ยวกับ C++: การเขียนโปรแกรมระดับกลางที่จำเป็น . Addison-Wesley. ISBN 0-321-32192-8.
- สภาอุตสาหกรรมเทคโนโลยีสารสนเทศ (15 ตุลาคม 2546). ภาษาโปรแกรม – C++ ( ฉบับที่สอง). เจนีวา: ISO/IEC. 14882:2003(E).
- Josuttis, Nicolai M. (2012). ไลบรารีมาตรฐาน C++, คู่มือและเอกสารอ้างอิง ( ฉบับที่สอง). Addison-Wesley. ISBN 978-0-321-62321-8.
- Koenig, Andrew ; Moo, Barbara E. (2000). Accelerated C++ – Practical Programming by Example . Addison-Wesley. ISBN 0-201-70353-X.
- ลิปป์แมน, สแตนลีย์ บี. ; ลาฌอย, โฮเซ่; หมู่, บาร์บาร่า อี. (2011) C++ Primer ( ฉบับที่ห้า) แอดดิสัน-เวสลีย์. ไอเอสบีเอ็น 978-0-321-71411-4.
- Lippman, Stanley B. (1996). Inside the C++ Object Model . Addison-Wesley. ISBN 0-201-83454-5.
- Meyers, Scott (2005). Effective C++ ( ฉบับที่สาม). Addison-Wesley. ISBN 0-321-33487-6.
- Stroustrup, Bjarne (2013). ภาษาการเขียนโปรแกรม C++ ( ฉบับที่สี่). Addison-Wesley. ISBN 978-0-321-56384-2.
- Stroustrup, Bjarne (1994). การออกแบบและวิวัฒนาการของ C++ Addison-Wesley. ISBN 0-201-54330-3.
- Stroustrup, Bjarne (2014). การเขียนโปรแกรม: หลักการและการปฏิบัติโดยใช้ C++ ( ฉบับที่สอง). Addison-Wesley. ISBN 978-0-321-99278-9.
- Sutter, Herb (2001). More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions . Addison-Wesley. ISBN 0-201-70434-X.
- Sutter, Herb (2004). สไตล์ C++ ที่ยอดเยี่ยม . Addison-Wesley. ISBN 0-201-76042-8.
- แวนเดวอร์เด, เดวิด; โจสุตติส, นิโคไล เอ็ม. (2003) เทมเพลต C++: คู่มือฉบับสมบูรณ์ แอดดิสัน-เวสลีย์. ไอเอสบีเอ็น 0-201-73484-2.
ลิงก์ภายนอก
- JTC1/SC22/WG21 – กลุ่มงานมาตรฐาน C++ ของ ISO/IEC
- มูลนิธิ Standard C++ Foundation – องค์กรไม่แสวงหาผลกำไรที่ส่งเสริมการใช้งานและความเข้าใจในมาตรฐาน C++ โดยBjarne Stroustrupเป็นกรรมการขององค์กรนี้
- คำหลัก C++
- นิพจน์ C++
- ลำดับความสำคัญของตัวดำเนินการใน C++