ตั้งแต่แรกเห็นมันดูเหมือนว่าจะเป็นน้ำตาล syntactic ง่าย ๆ
แต่เมื่อมองลึกลงไปเราจะเห็นว่ามันเป็นเรื่องของน้ำตาลมากกว่าวากยสัมพันธ์เพราะมันขยายตัวเลือกผู้ใช้ C ++ เพื่อสร้างประเภทที่ผู้ใช้กำหนดเองซึ่งมีลักษณะเหมือนกับชนิดในตัวที่แตกต่างกัน ในเรื่องนี้ "โบนัส" เล็กน้อยนี้เป็นสิ่งที่น่าสนใจมากใน C ++ 11 นอกเหนือจาก C ++
เราต้องการมันจริงๆใน C ++ หรือไม่?
ผมเห็นการใช้งานไม่กี่คนในรหัสฉันเขียนไว้ในปีที่ผ่านมา แต่เพียงเพราะผมไม่ได้ใช้มันใน C ++ ไม่ได้หมายความว่ามันไม่ได้เป็นที่น่าสนใจสำหรับอีก c ++ นักพัฒนา
เราใช้ใน C ++ (และใน C, ฉันเดา), ตัวอักษรที่กำหนดโดยคอมไพเลอร์, เพื่อพิมพ์ตัวเลขจำนวนเต็มเป็นจำนวนเต็มสั้นหรือยาว, จำนวนจริงเป็น float หรือ double (หรือยาวเป็นสองเท่า), และอักขระสตริงเป็นตัวอักษรธรรมดาหรือกว้าง .
ใน C ++ เรามีความเป็นไปได้ในการสร้างประเภทของเราเอง (เช่นคลาส) โดยไม่มีค่าใช้จ่าย (inline) เรามีความเป็นไปได้ที่จะเพิ่มโอเปอเรเตอร์ให้กับประเภทของพวกเขาเพื่อให้พวกมันมีพฤติกรรมคล้ายกับชนิดในตัวซึ่งช่วยให้นักพัฒนา C ++ สามารถใช้เมทริกซ์และจำนวนเชิงซ้อนตามธรรมชาติอย่างที่ควรจะเป็น เราสามารถเพิ่มผู้ดำเนินการส่ง (ซึ่งโดยปกติจะเป็นความคิดที่ไม่ดี แต่บางครั้งมันเป็นเพียงทางออกที่ถูกต้อง)
เรายังคงพลาดสิ่งหนึ่งที่มีประเภทผู้ใช้เป็นแบบในตัว: ตัวอักษรที่ผู้ใช้กำหนด
ดังนั้นฉันคิดว่ามันเป็นวิวัฒนาการตามธรรมชาติของภาษา แต่ต้องทำให้สมบูรณ์ที่สุดเท่าที่จะเป็นไปได้: " ถ้าคุณต้องการสร้างประเภทและคุณต้องการให้มันมีพฤติกรรมที่เป็นไปได้มากที่สุดเท่าที่มีในตัวนี่คือเครื่องมือ .. "
ฉันเดาว่ามันคล้ายกับการตัดสินใจของ. NET ที่จะทำให้โครงสร้างดั้งเดิมทุกตัวรวมถึงบูลีน, จำนวนเต็ม, ฯลฯ และมีโครงสร้างทั้งหมดมาจากวัตถุ การตัดสินใจนี้เพียงอย่างเดียวทำให้. NET อยู่ไกลเกินเอื้อมของ Java เมื่อทำงานกับ primitives ไม่ว่า Java / Boxing box ที่ไม่มีแฮ็กจะเพิ่มจำนวนมากเท่าใด
คุณต้องการมันจริงๆใน C ++ หรือไม่?
คำถามนี้สำหรับคุณที่จะตอบ ไม่ใช่ Bjarne Stroustrup ไม่ใช่สมุนไพรซัทเทอร์ ไม่ใช่สมาชิกของคณะกรรมการมาตรฐาน C ++ นี่คือเหตุผลที่คุณมีตัวเลือกใน C ++และพวกเขาจะไม่ จำกัด สัญลักษณ์ที่มีประโยชน์สำหรับประเภทในตัวเพียงอย่างเดียว
หากคุณต้องการมันก็เป็นการต้อนรับที่เพิ่มเข้ามา ถ้าคุณทำไม่ดี ... อย่าใช้มัน มันจะเสียค่าใช้จ่ายอะไร
ยินดีต้อนรับสู่ C ++ ภาษาที่คุณสมบัติเป็นตัวเลือก
ป่อง??? แสดงคอมเพล็กซ์ของคุณให้ฉันดู !!!
มีความแตกต่างระหว่างป่องและซับซ้อน (ปุนตั้งใจ)
เช่นเดียวกับที่แสดงโดย Niels ที่ตัวอักษรที่ผู้ใช้กำหนดเองเพิ่มความสามารถใหม่ให้กับ C ++? การสามารถเขียนจำนวนเชิงซ้อนเป็นหนึ่งในสองคุณสมบัติที่เพิ่ม "เร็ว ๆ นี้" ใน C และ C ++:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
ในตอนนี้ทั้ง C99 "double complex" type และ C ++ "std :: complex" สามารถที่จะทำการคูณบวกบวกลบ ฯลฯ โดยใช้ตัวดำเนินการโอเวอร์โหลดได้
แต่ใน C99 พวกเขาเพิ่งเพิ่มประเภทอื่นเป็นชนิดในตัวและรองรับการใช้งานมากเกินไปในตัว และพวกเขาก็เพิ่มฟีเจอร์ตามตัวอักษรอีกแบบหนึ่ง
ใน C ++ พวกเขาใช้คุณลักษณะภาษาที่มีอยู่แล้วเห็นว่าคุณสมบัติตามตัวอักษรเป็นวิวัฒนาการตามธรรมชาติของภาษาและเพิ่มเข้ามา
ใน C หากคุณต้องการการปรับปรุงสัญกรณ์เดียวกันสำหรับประเภทอื่นคุณไม่มีโชคจนกว่าคุณจะวิ่งเต้นเพื่อเพิ่มฟังก์ชั่นคลื่นควอนตัมของคุณ (หรือจุด 3 มิติหรือประเภทพื้นฐานที่คุณใช้ในสาขาการทำงาน) ไปยัง มาตรฐาน C เป็นชนิดในตัวสำเร็จ
ใน C ++ 11 คุณสามารถทำเองได้:
Point p = 25_x + 13_y + 3_z ; // 3D point
มันป่องหรือไม่ ไม่จำเป็นต้องมีดังที่แสดงโดยทั้งคอมเพล็กซ์ C และ C ++ ต้องการวิธีแสดงค่าเชิงซ้อนที่แท้จริงของมัน
มันถูกออกแบบมาอย่างผิด ๆ หรือไม่? ไม่มันถูกออกแบบมาให้เป็นคุณสมบัติ C ++ อื่น ๆ โดยคำนึงถึงความสามารถในการขยายเพิ่มเติม
มันมีวัตถุประสงค์เพื่อเป็นเครื่องหมายเท่านั้น ไม่มันสามารถเพิ่มความปลอดภัยให้กับรหัสของคุณได้
ตัวอย่างเช่นลองจินตนาการถึงโค้ดเชิง CSS:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
จากนั้นง่ายมากในการบังคับใช้การพิมพ์ที่มีประสิทธิภาพให้กับการกำหนดค่า
เป็นอันตรายหรือไม่?
คำถามที่ดี. สามารถตั้งชื่อฟังก์ชั่นเหล่านี้ได้หรือไม่? ถ้าใช่แจ็คพอต!
อย่างไรก็ตามทุกอย่างคุณสามารถฆ่าตัวเองถ้าเครื่องมือที่ถูกนำมาใช้อย่างไม่ถูกต้อง C นั้นทรงพลังและคุณสามารถยิงหัวของคุณถ้าคุณใช้ปืน C ในทางที่ผิด C ++ มีปืน C แต่ยังมีดผ่าตัด, เนชันและเครื่องมืออื่น ๆ ที่คุณจะพบในชุดเครื่องมือ คุณสามารถใช้มีดผ่าตัดในทางที่ผิดและทำให้ตัวเองมีเลือดออกจนตาย หรือคุณสามารถสร้างรหัสที่สง่างามและแข็งแกร่ง
เช่นเดียวกับคุณสมบัติ C ++ ทุกอย่างคุณต้องการมันจริงหรือ เป็นคำถามที่คุณต้องตอบก่อนใช้ใน C ++ ถ้าคุณทำไม่ได้มันจะไม่เสียค่าใช้จ่ายใด ๆ แต่ถ้าคุณต้องการจริงๆอย่างน้อยภาษาจะไม่ทำให้คุณผิดหวัง
ตัวอย่างวันที่?
ข้อผิดพลาดของคุณดูเหมือนว่าสำหรับฉันคือคุณกำลังผสมตัวดำเนินการ:
1974/01/06AD
^ ^ ^
ไม่สามารถหลีกเลี่ยงได้เนื่องจาก / เป็นผู้ดำเนินการคอมไพเลอร์ต้องตีความมัน และ AFAIK มันเป็นสิ่งที่ดี
เพื่อหาวิธีแก้ปัญหาของคุณฉันจะเขียนตัวอักษรในวิธีอื่น ตัวอย่างเช่น:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
โดยส่วนตัวฉันจะเลือกจำนวนเต็มและวันที่ ISO แต่ขึ้นอยู่กับความต้องการของคุณ ซึ่งเป็นจุดรวมของการให้ผู้ใช้กำหนดชื่อตามตัวอักษรของมันเอง