แก้ไข จริงๆแล้วในขณะที่สิ่งที่ฉันพูดในคำตอบแรกของฉันถูกต้องนี่คือเหตุผลที่แท้จริง:
ในการเริ่มต้นมี C C ไม่ใช่เชิงวัตถุ (คุณสามารถใช้วิธีการ OO แต่มันไม่ได้ช่วยคุณหรือบังคับใช้อะไร)
จากนั้นก็มี C With Classes ซึ่งต่อมาถูกเปลี่ยนชื่อเป็น C ++ C ++ นั้นเป็น object-oriented ดังนั้นจึงส่งเสริมให้มีการห่อหุ้มและทำให้มั่นใจว่าวัตถุไม่เปลี่ยนแปลง - ในระหว่างการก่อสร้างและที่จุดเริ่มต้นและจุดสิ้นสุดของวิธีการใด ๆ วัตถุนั้นอยู่ในสถานะที่ถูกต้อง
สิ่งที่เป็นธรรมชาติในการทำสิ่งนี้คือการบังคับให้คลาสต้องมีตัวสร้างเพื่อให้แน่ใจว่ามันจะเริ่มในสถานะที่ถูกต้อง - หากตัวสร้างไม่ต้องทำอะไรเพื่อให้แน่ใจว่าสิ่งนี้ .
แต่เป้าหมายที่มี C ++ นั้นจะเข้ากันได้กับ C จนถึงจุดที่มากที่สุดเท่าที่จะเป็นไปได้โปรแกรม C ที่ถูกต้องทั้งหมดยังเป็นโปรแกรม C ++ ที่ถูกต้อง (ไม่เป็นเป้าหมายที่ใช้งานได้อีกต่อไปและวิวัฒนาการของ C แยกเป็น C ++) )
หนึ่งผลของสิ่งนี้คือการทำซ้ำในการทำงานระหว่างstruct
และclass
และอดีตทำสิ่ง C วิธี (ทุกสิ่งสาธารณะโดยค่าเริ่มต้น) และหลังทำสิ่งในทางที่ดี OO (ทุกอย่างส่วนตัวโดยค่าเริ่มต้นนักพัฒนาอย่างแข็งขันทำให้สาธารณะสิ่งที่พวกเขาต้องการสาธารณะ)
อีกอย่างคือในการสั่งซื้อ C struct
ซึ่งไม่มีคอนสตรัคเตอร์เนื่องจาก C ไม่มีคอนสตรัคเตอร์ให้ใช้งานได้ใน C ++ ดังนั้นจึงต้องมีความหมายสำหรับวิธีนี้ในการดู C ++ ดังนั้นในขณะที่ไม่มีคอนสตรัคเตอร์จะต่อต้านการฝึกฝน OO ของการรับรองค่าคงที่ C ++ ใช้สิ่งนี้เพื่อหมายความว่ามีคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์เริ่มต้นที่ทำหน้าที่เหมือนมีร่างกายที่ว่างเปล่า
structs
ตอนนี้C ทั้งหมดใช้ได้แล้ว C ++ structs
(ซึ่งหมายความว่าพวกมันเหมือนกับ C ++ classes
กับทุกอย่าง - สมาชิกและการสืบทอด - สาธารณะ) ได้รับการปฏิบัติจากภายนอกราวกับว่ามันมีคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์เดียว
อย่างไรก็ตามถ้าคุณใส่ Constructor ไว้ในclass
หรือstruct
คุณก็ทำสิ่งต่าง ๆ ด้วยวิธี C ++ / OO แทนวิธี C และไม่จำเป็นต้องใช้ Constructor เริ่มต้น
ผู้คนยังคงใช้มันแม้ว่าจะไม่สามารถใช้งานร่วมกันได้เป็นอย่างอื่น (มันใช้คุณสมบัติ C ++ อื่น ๆ ที่ไม่ได้อยู่ใน C)
ดังนั้นเมื่อ Java มาพร้อม (ขึ้นอยู่กับ C ++ ในหลาย ๆ ด้าน) และต่อมา C # (ขึ้นอยู่กับ C ++ และ Java ในรูปแบบที่แตกต่างกัน) พวกเขายังคงใช้วิธีนี้เป็นสิ่งที่ coders อาจถูกใช้แล้ว
Stroustrup เขียนเกี่ยวกับเรื่องนี้ของเขาในc ++ เขียนโปรแกรมภาษาและมากขึ้นดังนั้นที่มีความสำคัญมากขึ้นกับ "whys" ของภาษาในการออกแบบและวิวัฒนาการของภาษา C ++
=== คำตอบเดิม ===
สมมติว่าสิ่งนี้ไม่ได้เกิดขึ้น
สมมติว่าฉันไม่ต้องการคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์เพราะฉันไม่สามารถทำให้คลาสของฉันเข้าสู่สถานะที่มีความหมายได้หากไม่มี อันที่จริงนี่คือสิ่งที่สามารถเกิดขึ้นได้struct
ใน C # (แต่ถ้าคุณไม่สามารถใช้ all-zeros-and-nulls อย่างมีความหมายstruct
ใน C # ได้คุณจะใช้การปรับให้เหมาะสมแบบไม่เปิดเผยต่อสาธารณะ ข้อบกพร่องการออกแบบในการใช้งานstruct
)
เพื่อให้ชั้นเรียนของฉันสามารถปกป้องค่าคงที่ได้ฉันต้องมีพิเศษ removeDefaultConstructor
คำหลักอย่างน้อยที่สุดฉันต้องสร้างคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์เพื่อให้แน่ใจว่าไม่มีการเรียกรหัสการโทรเริ่มต้น
ซึ่งทำให้ภาษาซับซ้อนยิ่งขึ้น ดีกว่าที่จะไม่ทำมัน
โดยรวมแล้วไม่ควรคิดที่จะเพิ่มตัวสร้างเป็นการลบค่าเริ่มต้นดีกว่าที่จะคิดว่าไม่มีตัวสร้างใด ๆ เป็นน้ำตาลเชิงซ้อนสำหรับการเพิ่มตัวสร้างพารามิเตอร์แบบไม่มีพารามิเตอร์ที่ไม่ทำอะไรเลย