คลาสกับโครงสร้าง


12

ใน C ++ และภาษาอิทธิพลอื่น ๆ ที่มีการสร้างโครงสร้างที่เรียกว่า ( struct) classและอื่นที่เรียกว่า ทั้งสองมีความสามารถในการเก็บฟังก์ชั่นและตัวแปร ความแตกต่างบางประการคือ:

  1. คลาสจะได้รับหน่วยความจำในฮีปและstructได้รับหน่วยความจำในสแต็ก (หมายเหตุ: นี่คือสิ่งที่ผิดสำหรับ C ++ แต่อาจถูกต้องในสิ่งที่ OP เรียกว่า "ภาษาที่มีอิทธิพล")
  2. ตัวแปรคลาสเป็นค่าเริ่มต้นและstructเป็นแบบสาธารณะ

คำถามของฉันคือ: ถูกstructยกเลิกอย่างใดสำหรับชั้นเรียน? ถ้าเป็นเช่นนั้นทำไม นอกเหนือจากความแตกต่างข้างต้น a structสามารถทำสิ่งเดียวกับที่ชั้นเรียนทำได้ เหตุใดจึงต้องละทิ้งมัน


โดยการละทิ้งฉันหมายความว่าทำไมจึงมีการใช้อย่างอื่น
prometheuspk

คำถามของคุณตอบคำถามนี้เองฉันคิดว่า
Umair A.

3
ความแตกต่างระหว่างคลาสและ structs ขึ้นกับภาษา บทเรียนบางส่วนจาก C ++ ไม่ได้ใช้กับ C # จริงๆ
งาน

6
uhhhh ใน C ++ คุณสามารถจัดสรรวัตถุบนกองซ้อนหรือกอง ที่ไหนก็ได้ที่คุณต้องการ.
jojo

8
ผิด, ผิด, ผิด กองซ้อนกับกองไม่มีอะไรเกี่ยวข้องกับความแตกต่าง
Aaronaught

คำตอบ:


11

มันไม่ได้ถูกทอดทิ้งเลย ในความเป็นจริงแม้กระทั่งภาษาสมัยใหม่เช่น C # ซึ่งทำให้การใช้งานหนักของยังคงให้คุณclass structสำหรับเมื่อมีประโยชน์ในการเลือกอย่างใดอย่างหนึ่งฉันแนะนำคุณไปยังบทความนี้:

การเลือกระหว่างคลาสและโครงสร้าง

อ้างอิงจากบทความ MSDN:

พิจารณาการกำหนดโครงสร้างแทนคลาสถ้าอินสแตนซ์ของชนิดมีขนาดเล็กและอายุสั้นทั่วไปหรือฝังอยู่ในวัตถุอื่น

อย่ากำหนดโครงสร้างเว้นแต่ประเภทจะมีคุณสมบัติดังต่อไปนี้ทั้งหมด:

  • มันมีเหตุผลแสดงค่าเดียวคล้ายกับประเภทดั้งเดิม (จำนวนเต็มคู่และอื่น ๆ )
  • มันมีขนาดอินสแตนซ์ที่มีขนาดเล็กกว่า 16 ไบต์
  • มันไม่เปลี่ยนรูป
  • มันจะไม่ต้องมีกล่องบ่อย

4
คำตอบนี้เข้าใจผิดจริงๆว่า. Net / C # struct / class ความหมายแตกต่างจาก C ++ หนึ่ง: พวกเขาใช้ชื่อเดียวกัน แต่มีความหมายที่แตกต่างกันขึ้นอยู่กับภาษา !!! ใน C ++ แทบจะไม่มีความแตกต่างระหว่าง struct และคลาสและคำถามนั้นผิดทั้งหมดในจุดแรกซึ่งอยู่ใน c # และ D แต่ไม่ใช่ c ++ ดังนั้นลิงก์ไปยังบทความนี้ซึ่งเกี่ยวกับ. Net จึงผิดจริงๆ ไม่ใช่ C ++!
Klaim

@Klaim ในทางเทคนิคมันไม่ถูกต้องสำหรับ C # ทั้ง (structs สามารถในกอง) ความแตกต่างที่สำคัญใน C # อยู่ระหว่างความหมายคุณค่าและความหมายอ้างอิงแตกต่างที่ C ++ ไม่จำเป็นต้องเป็นมันสามารถมีค่าหรือการอ้างอิงสำหรับอะไร
JK

17

คุณเข้าใจผิดเกี่ยวกับ C ++: ความแตกต่างที่สำคัญระหว่างคลาสและโครงสร้างคือความแตกต่างของตัวระบุการเข้าถึงเริ่มต้น โครงสร้างและคลาสใช้สำหรับคำพ้องความหมายและวัตถุประสงค์ทั้งหมดฉันเชื่อว่าโครงสร้างถูกเก็บรักษาไว้เพื่อความเข้ากันได้ย้อนหลังกับ C


7
ไม่เพียงแค่. Struct เป็นตัวเลือกที่ดีเมื่อคุณต้องการถ่ายโอนข้อมูลจำนวนมากในวัตถุเดียวและไม่เพิ่มพฤติกรรมใด ๆ
quant_dev

2
@quant: นั่นเป็นเหตุผลที่แย่มากที่จะใช้ struct ฉันหวังเป็นอย่างยิ่งว่าความคิดเห็นนั้นจะเป็นแบบปากต่อปาก
Aaronaught

1
@Aaraught ทำไม? มุมมองของฉันเกี่ยวกับการใช้งานของ struct เป็นมาตรฐานค่อนข้างดูคำตอบนี้เช่น: stackoverflow.com/questions/54585/…
quant_dev

1
@Aaraught คุณจะคืนค่าหลายวิธีได้อย่างไร สมมติว่ารูปแบบการประมวลผลส่งคืนราคาที่สะอาดราคาที่สกปรกและผลรวมของการชำระเงินคงค้าง
quant_dev

1
@quant_dev - คุณสามารถตัดสินใจที่จะแนบ meta-meaning บางอย่างเข้ากับ struct สำหรับจุดประสงค์ของคุณ (และสำหรับโปรแกรมเมอร์ C คนหนึ่งที่ใช้งานได้จริง) แต่นั่นไม่ได้เปลี่ยนความจริงที่ว่าความแตกต่างระหว่าง struct และ คำหลักคลาสใน C ++ เป็นการเข้าถึงเริ่มต้น
Joris Timmermans

2

ภาษา D ได้สร้างความแตกต่างมากขึ้นระหว่างชั้นเรียนและโครงสร้าง

struct ใน d ไม่มีค่าอะไรนอกจากสแต็กข้อมูลที่จัดสรรไว้พร้อมกับฟังก์ชั่นบางอย่างที่คุณสามารถเรียกใช้มันได้ ( ไม่มีตัวเลือกสำหรับการสืบทอดเว้นแต่คุณจะใช้การตั้งค่า enum + union เช่นใช้ polymorfism ด้วยตัวคุณเอง)

คลาสเป็นเหมือนที่เราคุ้นเคยกับ: ฟังก์ชันเสมือน, การจัดสรรฮีป, การสืบทอด (เดี่ยว), ส่งผ่านโดยการอ้างอิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.