สิ่งที่เกี่ยวกับ C ++ ที่ทำให้โปรแกรมเมอร์ C เป็นกังวล
มีสิ่งมหัศจรรย์เกิดขึ้นมากมายภายใต้ประทุน คอนสตรัคเตอร์, destructors, เมธอดเสมือน, เท็มเพลต ฯลฯ สามารถสร้างรหัส C ++ ได้ง่ายและรวดเร็วกว่าการเขียนมากกว่ารหัส C เทียบเท่า แต่ยากที่จะเข้าใจและให้เหตุผลผ่าน สิ่งที่ง่ายเป็นFoo newFoo;
อาจเรียกจำนวนมากของรหัสที่ขึ้นอยู่กับวิธีการสร้างการเรียนFoo
(และชั้นเรียนใดก็ขึ้นอยู่กับ) ได้มีการกำหนด นี่คือเหตุผลที่การประชุมคือการเขียน++it
แทนที่จะit++
ทำซ้ำเมื่อผ่านตู้คอนเทนเนอร์เนื่องจาก postfix ++
มักจะเกี่ยวข้องกับการดำเนินการคัดลอกที่มีราคาแพง
ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณทำมีสามารถเป็นบางส่วนค่าใช้จ่ายที่ไม่น่ารำคาญโดยเฉพาะอย่างยิ่งสำหรับงานที่เรียบง่าย ใช้สองโปรแกรมต่อไปนี้โปรแกรมแรกใน C โปรแกรมที่สองใน C ++:
/* C version */
#include <stdio.h>
int main(void)
{
char greeting[] = "Hello, world";
printf("%s\n", greeting);
return 0;
}
/* end C version */
/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
std::string greeting("Hello, world");
std::cout << greeting << std::endl;
return 0;
}
/* end C++ version */
พฤติกรรมเหมือนกันไม่แตกต่างกันมากทั้งในแง่ของแหล่งที่มา แต่ในกล่อง SLES 10 ฉันทำงานกับ gcc 4.1.2, อดีตสร้างปฏิบัติการของขนาด ~ 9kb ในขณะที่สองใช้เวลามากกว่า 12.5kb (ไม่มีการเพิ่มประสิทธิภาพ ) ใหญ่ขึ้นเกือบ 28% string
ชนิดC ++ นั้นง่ายต่อการทำงานกับ IMO มากกว่า C string library และ C ++ ลำธารมีความยืดหยุ่นและปรับแต่งได้มากกว่า C stream แต่สำหรับโค้ดที่ใช้สมองเช่นนี้พวกเขาอาจไม่คุ้มกับค่าใช้จ่าย
C ++ เป็นภาษาที่มีขนาดใหญ่เมื่อเทียบกับ C โดยมีความหมายที่ซับซ้อนมาก ใช้เวลานานกว่าจะได้รับความเชี่ยวชาญกับ C ++ มากกว่า C ซึ่งหมายความว่าผู้คนจำนวนมากที่อ้างว่ารู้ C ++ ไม่รู้จักเช่นเดียวกับที่พวกเขาคิด
สิ่งที่เกี่ยวกับ C ที่ทำให้โปรแกรมเมอร์ C ++ เป็นกังวล
C ไม่ใช่ภาษาโปรแกรมที่ปลอดภัยด้วยจินตนาการ ไม่มีการตรวจสอบขอบเขตในอาร์เรย์ที่นำไปสู่พฤติกรรมที่เป็นประโยชน์มากมาย (ไม่ว่าจะเป็นผ่านgets
ฟังก์ชั่นที่ตายแล้วหรือผ่านscanf
กับตัวระบุ%s
และ%[
การแปลง) อย่างน้อย C ++ ให้คอนเทนเนอร์ที่คุณโยนข้อยกเว้นถ้าคุณพยายามเข้าถึงนอกช่วงที่กำหนดไว้ในปัจจุบัน C ทั้งหมดให้คุณคือ (หากคุณโชคดี) ละเมิดการแบ่งกลุ่ม
การจัดการหน่วยความจำใน C นั้นใช้แรงงานมากและเกิดข้อผิดพลาดได้ง่ายเมื่อเปรียบเทียบกับเครื่องมือ C ++ ที่ให้คุณ หากคุณกำลังสร้างที่เก็บของคุณเองคุณจะต้องรับผิดชอบการจับคู่malloc
และการfree
โทรทั้งหมดเพื่อให้แน่ใจว่าการจัดสรรสำเร็จแล้วสำรองการจัดสรรบางส่วนในกรณีที่เกิดข้อผิดพลาด ฯลฯ ใน C ++ คุณเพียงแค่เพิ่มรายการลงในหรือ ลบไอเท็มออกจากคอนเทนเนอร์ หากมีปัญหาจะมีข้อผิดพลาดเกิดขึ้น
ในทำนองเดียวกันการจัดการข้อผิดพลาดใน C เป็นความเจ็บปวดในตูดเมื่อเทียบกับเครื่องมือ C ++ ให้ (กล่าวคือข้อยกเว้น) สิ่งที่สนุกจริงๆคือเมื่อคุณจัดสรรหน่วยความจำจำนวนมากแล้วเข้าสู่การประมวลผลของคุณ เมื่อคุณต้องถอยออกมาคุณจะต้องปล่อยหน่วยความจำนั้นตามลำดับที่ถูกต้อง ด้วยหลักการ C ++ และ RAII หลักการนี้ง่ายมากที่จะทำ
ดังนั้นเมื่อไหร่ฉันจะใช้อันหนึ่งมากกว่าอีกอัน?
หากสิ่งที่คุณเขียนนั้นเรียบง่ายอ่านได้ / ลบล้างมัน / กำจัดแอปพลิเคชันซึ่งพฤติกรรมที่สามารถอธิบายได้อย่างหมดจดในแง่ของอินพุตและเอาต์พุตและประสิทธิภาพการทำงานนั้นต้องการ C มากกว่า C ++ มิเช่นนั้นให้เลือก C ++