แนะนำ, 2024

ตัวเลือกของบรรณาธิการ

ความแตกต่างระหว่าง Constructor และ Destructor

บางครั้งจำเป็นต้องเริ่มต้นบางส่วนของวัตถุก่อนที่จะสามารถใช้งานได้ ตัวอย่างเช่นเรากำลังดำเนินการกับสแต็กก่อนที่เราจะดำเนินการใด ๆ ด้านบนของสแต็กจะต้องตั้งค่าเป็นศูนย์เสมอ คุณลักษณะของการเริ่มต้นอัตโนมัตินี้ดำเนินการผ่าน 'Constructor' ถ้าวัตถุต้องการรันโค้ดบางอย่างก่อนที่มันจะถูกทำลาย ตัวอย่างเช่นหากวัตถุต้องการปิดไฟล์ที่เปิดไว้ก่อนที่จะถูกทำลาย สามารถทำได้ด้วยความช่วยเหลือของ 'Destructor'

มาดูภาพรวมของความแตกต่างพื้นฐานระหว่างตัวสร้างและ destructor ด้วยความช่วยเหลือของกราฟเปรียบเทียบ

แผนภูมิเปรียบเทียบ:

พื้นฐานสำหรับการเปรียบเทียบนวกรรมิกdestructor
วัตถุประสงค์
มันจัดสรรหน่วยความจำไปยังวัตถุมันยกเลิกการจัดสรรหน่วยความจำของวัตถุ
การประกาศclass_name (อาร์กิวเมนต์ถ้ามี) {};~ class_name (ไม่มีอาร์กิวเมนต์) {};
ข้อโต้แย้งตัวสร้างยอมรับอาร์กิวเมนต์Destructor ไม่ยอมรับอาร์กิวเมนต์ใด ๆ
การเรียกร้องตัวสร้างถูกเรียกโดยอัตโนมัติในขณะที่วัตถุถูกสร้างขึ้นDestructor ถูกเรียกโดยอัตโนมัติเมื่อบล็อกถูกออกหรือโปรแกรมสิ้นสุดลง
การทำงานตัวสร้างอนุญาตให้วัตถุเริ่มต้นค่าบางอย่างก่อนที่จะใช้Destructor อนุญาตให้วัตถุรันโค้ดบางอย่างในเวลาที่ถูกทำลาย
คำสั่งของการดำเนินการ
ตัวสร้างจะถูกเรียกตามลำดับอย่างต่อเนื่อง
Destructor ถูกเรียกตามลำดับตัวสร้างแบบย้อนกลับ
เป็นตัวเลขอาจมีหลายคอนสตรัคในชั้นเรียนแต่มี destructor เดียวเสมอในชั้นเรียน
คัดลอกตัวสร้างตัวสร้างการคัดลอกอนุญาตให้ตัวสร้างการประกาศและเตรียมใช้งานวัตถุจากวัตถุอื่นไม่มีแนวคิดดังกล่าว
โหลดมากกว่าตัวสร้างสามารถโอเวอร์โหลดได้Destructor ไม่สามารถโหลดได้มากเกินไป

คำจำกัดความของตัวสร้าง:

ตัวสร้างนั้นเป็นฟังก์ชันสมาชิกของคลาสซึ่งเริ่มต้นวัตถุและจัดสรรหน่วยความจำให้กับมัน คอนสตรัคเตอร์สามารถระบุได้ง่าย ๆ เมื่อมีการประกาศและกำหนดด้วยชื่อเดียวกันกับคลาส คอนสตรัคไม่มีประเภทผลตอบแทนใด ๆ ดังนั้นพวกเขาจะไม่ส่งคืนสิ่งใดแม้แต่จะเป็น 'โมฆะ' ตัวสร้างถูกกำหนดไว้เสมอในส่วนสาธารณะของชั้นเรียน

สามารถมีหลาย constructors ในชั้นเรียน สามารถแยกได้ตามจำนวนและชนิดของอาร์กิวเมนต์ที่ส่งผ่าน หากมีคอนสตรัคเตอร์หลายตัวในคลาส Constructor (Constructor do-nothing) ต้องถูกกำหนดพร้อมกับพวกมัน มันไม่ทำอะไรเลยนอกจากคอมไพเลอร์เป็นที่น่าพอใจ

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

การดำเนินการของคอนสตรัค:

 คลาส Const {int a, b; สาธารณะ: Const () {// คอนสตรัคโดยไม่มีพารามิเตอร์ a = 0; ข = 0; } Const (int c, int d) {// คอนสตรัคเตอร์ที่มีพารามิเตอร์ a = c; c = d; }}; int main () {Const C1; C2 (10, 20); // คำสั่งนี้เรียกใช้ constructor} 

เมื่อ C1 ถูกสร้างคอนสตรัคเตอร์โดยไม่มีพารามิเตอร์จะถูกดำเนินการเนื่องจาก C1 ไม่ผ่านพารามิเตอร์ใด ๆ ในขณะที่เมื่อ C2 ถูกสร้างตัวสร้างด้วยพารามิเตอร์จะได้รับการดำเนินการตามที่มันผ่านสองจำนวนเต็มไปที่ตัวสร้าง

คำจำกัดความของ Destructor:

Destructor ยังเป็นฟังก์ชันสมาชิกของคลาสซึ่ง deallocates หน่วยความจำที่จัดสรรให้กับวัตถุ มันถูกกำหนดด้วยชื่อเดียวกับของคลาสนำหน้าด้วยสัญลักษณ์ tilde (~) Destructors จะถูกเรียกในลำดับย้อนกลับของตัวสร้างเสมอ

มี destructor เดียวในคลาสเสมอเนื่องจากไม่ยอมรับอาร์กิวเมนต์ใด ๆ วัตถุในท้องถิ่นจะถูกทำลายทันทีที่การควบคุมของการดำเนินการ lefts บล็อก; ในทางกลับกันวัตถุโกลบอลจะถูกทำลายเมื่อโปรแกรมทั้งหมดสิ้นสุดลง ตัวทำลายถูกเรียกโดยคอมไพเลอร์ หากคลาสนั้นได้รับการสืบทอดและคลาสนั้นได้มาจากคลาสแม่และทั้งคลาสลูกและคลาสแม่มี destructors จากนั้น destructor ของคลาสที่ได้รับจะถูกเรียกก่อนตามด้วย destructor ของคลาสพาเรนต์

การใช้งาน Destructor:

 คลาส Const {int a, b; สาธารณะ: Const (int c, int d) {// คอนสตรัคกับพารามิเตอร์ A = C; c = d; ศาล << "ค่าของ a และ b คือ" < 

เมื่อวัตถุ C1 ถูกสร้างขึ้นคอนสตรัคเตอร์ที่มีพารามิเตอร์จำนวนเต็มสองชนิดจะถูกเรียกใช้และสมาชิก“ a, b” จะได้รับการกำหนดค่าเริ่มต้นด้วยค่าของ“ a, b” หลังจาก destructor นั้นถูกเรียกใช้และพิมพ์ข้อความ“ object C1 get destroy”

ความแตกต่างหลักระหว่าง Constructors และ Destructors

  1. วัตถุประสงค์หลักของตัวสร้างคือการจัดสรรหน่วยความจำให้กับวัตถุเมื่อพวกเขาถูกสร้างขึ้นในขณะที่วัตถุประสงค์หลักของ destructor คือการจัดสรรคืนหน่วยความจำของวัตถุเมื่อมันถูกทำลาย
  2. คอนสตรัคได้รับอนุญาตให้ยอมรับข้อโต้แย้งเป็นข้อโต้แย้งที่สามารถใช้ในการเริ่มต้นสมาชิกข้อมูลของชั้นเรียน destructor ที่ไม่ยอมรับข้อโต้แย้งใด ๆ เป็นงานเดียวคือการจัดสรรคืนหน่วยความจำของวัตถุ
  3. คอนสตรัคถูกเรียกเมื่อวัตถุถูกสร้างขึ้น ในทางกลับกัน destructor จะถูกเรียกใช้เมื่อโปรแกรมถูกยกเลิกหรือโปรแกรมออกจากบล็อกที่วัตถุถูกสร้างขึ้น
  4. คอนสตรัคเตอร์โดยทั่วไปจะใช้ในการเริ่มต้นข้อมูลสมาชิกของคลาสในขณะที่ destructor จะใช้เพื่อให้วัตถุดำเนินการบางอย่างก่อนที่มันจะถูกทำลาย
  5. คอนสตรัคเตอร์จะถูกดำเนินการตามลำดับที่ต่อเนื่องซึ่งหมายความว่าหากมีคลาสที่ได้รับซึ่งสืบทอดคลาสฐานและวัตถุของคลาสที่ได้รับนั้นถูกสร้างขึ้นมันจะเรียกคอนสตรัคเตอร์ของคลาสพื้นฐานก่อนจากนั้นตัวสร้างของคลาสที่ได้รับ ในทางตรงกันข้าม destructor ของคลาสที่ได้รับนั้นถูกเรียกก่อนแล้วคลาสฐานก็หมายความว่า destructor จะถูกดำเนินการในลำดับที่กลับกันของคอนสตรัคเตอร์
  6. ในชั้นเรียนสามารถมีหลายตัวสร้างซึ่งจะถูกระบุโดยการโต้แย้งจำนวนผ่าน ในชั้นเรียนมีเพียงคนทำลายล้างคนเดียว
  7. มีแนวคิดของตัวสร้างสำเนาซึ่งอนุญาตให้วัตถุเริ่มต้นจากวัตถุอื่นในขณะที่ destructor ไม่มีแนวคิดดังกล่าว
  8. คอนสตรัคเตอร์สามารถโอเวอร์โหลดเพื่อดำเนินการต่าง ๆ ภายใต้ชื่อของคอนสตรัคเตอร์เดียวกันในขณะที่ destructors ไม่สามารถโอเวอร์โหลด

สรุป:

นอกจากความคล้ายคลึงกันคอนสตรัคเตอร์และ destructor นั้นเป็นฟังก์ชันสมาชิกพิเศษของคลาสและมีชื่อเดียวกันความแตกต่างพื้นฐานระหว่างทั้งสองคือ 'คอนสตรัคเตอร์' ถูกเรียกในเวลาของการจัดสรรหน่วยความจำและ 'destructor' ถูกเรียก เวลาของการจัดสรรคืนหน่วยความจำวัตถุ ทั้ง constructor และ destructor ถูกเรียกโดยปริยายโดยคอมไพเลอร์แม้ว่าจะไม่ได้กำหนดไว้ในคลาส

Top