ใน c ++ เครื่องหมายทิลเดอ“ ~” ข้างหน้าชื่อฟังก์ชันมีความหมายว่าอย่างไร


142
 template <class T>
 class Stack
 {
 public:
    Stack(int = 10) ; 
    ~Stack() { delete [] stackPtr ; }  //<--- What does the "~" signify?
    int push(const T&); 
    int pop(T&) ;  
    int isEmpty()const { return top == -1 ; } 
    int isFull() const { return top == size - 1 ; } 
 private:
    int size ;  
    int top ;  
    T* stackPtr ;  
 } ;

คำตอบ:


157

มันเป็นตัวทำลายมันทำลายอินสแตนซ์เพิ่มหน่วยความจำ ฯลฯ ฯลฯ

นี่คือคำอธิบายจาก ibm.com:

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

ดูhttps://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm


1
ลิงค์นี้เสียแล้ว
zenofpython

2
@zenofpython แก้ไข!
inanutshellus

80

เป็นคนอื่นได้ตั้งข้อสังเกตในกรณีที่คุณจะถามเกี่ยวกับการเป็น destructor class Stackสำหรับ

แต่ตอบคำถามของคุณตรงตามที่ปรากฏในหัวข้อ:

ใน c ++ เครื่องหมายทิลเดอ“ ~” ข้างหน้าชื่อฟังก์ชันมีความหมายว่าอย่างไร

มีสถานการณ์อื่น ในบริบทใด ๆยกเว้นหน้าชื่อของคลาส (ซึ่งเป็นบริบท destructor) ~คือตัวดำเนินการส่วนเติมเต็ม (หรือ bitwise not) เพื่อให้แน่ใจว่าจะไม่เกิดขึ้นบ่อยนัก แต่คุณสามารถจินตนาการถึงกรณีเช่นนี้ได้

if (~getMask()) { ...

ซึ่งดูคล้ายกัน แต่มีความหมายแตกต่างกันมาก


8

มันเป็นตัวทำลาย ฟังก์ชันนี้รับประกันว่าจะถูกเรียกใช้เมื่อวัตถุอยู่นอกขอบเขต


2
... หากมีการจัดสรรบนสแต็ก เมื่อ 'ลบ' ถูกเรียกบนวัตถุหากมีการจัดสรรบนฮีป
Jherico

@Jherico: จริงๆแล้วมันคือเมื่อใช้คีย์เวิร์ด "ลบ" โปรดจำไว้ว่าคำหลัก "ใหม่" เรียกใช้ "ตัวดำเนินการใหม่" จากนั้นเรียกตัวสร้างตามที่อยู่ที่ส่งคืนดังนั้นจึงเป็นไปได้อย่างสมบูรณ์ที่จะสร้างหน่วยความจำ "ใหม่" บนสแต็ก :) คำหลัก "ลบ" เรียกตัวทำลายจากนั้นเรียกใช้ "operator delete"
Troubadour

@Jherico หรืออาศัยอยู่ที่ขอบเขตเนมสเปซหรือเป็นสมาชิกคลาสแบบคงที่หรือตัวแปรคงที่ของฟังก์ชันโลคัล: ระยะเวลาการจัดเก็บแบบคงที่ กล่าวอีกนัยหนึ่ง: vairables ทั้งหมดที่มีที่เก็บข้อมูลอัตโนมัติจะถูกทำลายโดยอัตโนมัติเมื่อเหมาะสม ระวังคำสั่งเริ่มต้นแบบคงที่ Fiasco
เห็น

4

นี่คือตัวทำลาย เรียกว่าเมื่อวัตถุถูกทำลาย (อยู่นอกขอบเขตชีวิตหรือถูกลบ)

เพื่อความชัดเจนคุณต้องใช้ ~ NameOfTheClass เหมือนกับตัวสร้างชื่ออื่น ๆ ไม่ถูกต้อง


2
"ชื่ออื่นใช้ได้"?
Lightness Races ใน Orbit

คำตอบเก่า ... ฉันคิดว่าฉันหมายความว่าหลังจาก ~ อาจเป็นชื่อใดก็ได้ตราบใดที่มันเหมือนกับชื่อคลาสและชื่อตัวสร้าง
Klaim

2

มันคือตัวทำลาย วิธีนี้เรียกว่าเมื่ออินสแตนซ์ของคลาสของคุณถูกทำลาย:

Stack<int> *stack= new Stack<int>;
//do something
delete stack; //<- destructor is called here;

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