Trong c ++, một dấu ngã ~ ~ trước một tên hàm biểu thị điều gì?


136
 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 ;  
 } ;

Câu trả lời:


150

Đó là hàm hủy, nó phá hủy thể hiện, giải phóng bộ nhớ, v.v.

Dưới đây là mô tả từ ibm.com:

Các bộ hủy cấu trúc thường được sử dụng để phân bổ bộ nhớ và thực hiện dọn dẹp khác cho một đối tượng lớp và các thành viên lớp của nó khi đối tượng bị phá hủy. Một hàm hủy được gọi cho một đối tượng lớp khi đối tượng đó vượt ra khỏi phạm vi hoặc bị xóa rõ ràng.

Xem https://www.ibm.com/support/ledgeledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm


1
Liên kết này hiện đã bị hỏng.
zenofpython

2
@zenofpython Đã sửa!
inanutshellus

75

Như những người khác đã lưu ý, trong trường hợp bạn đang hỏi về nó là hàm hủy cho class Stack.

Nhưng lấy câu hỏi của bạn chính xác như nó xuất hiện trong tiêu đề:

Trong c ++, một dấu ngã ~ ~ trước một tên hàm biểu thị điều gì?

Có một tình huống khác. Trong bất kỳ bối cảnh nào ngoại trừ ngay trước tên của một lớp (là bối cảnh hàm hủy), ~là toán tử bổ sung (hoặc bitwise không) của một người. Để chắc chắn rằng nó không xuất hiện thường xuyên, nhưng bạn có thể tưởng tượng một trường hợp như

if (~getMask()) { ...

trông giống nhau, nhưng có một ý nghĩa rất khác nhau.


8

Đó là một kẻ hủy diệt. Hàm được đảm bảo được gọi khi đối tượng đi ra khỏi phạm vi.


2
... nếu nó được phân bổ trên ngăn xếp. Khi 'xóa' được gọi trên đối tượng nếu nó được phân bổ trên heap.
Jherico

@Jherico: Thật ra đó là khi từ khóa "xóa" được sử dụng. Hãy nhớ rằng từ khóa "mới" gọi "toán tử mới" và sau đó gọi hàm tạo trên địa chỉ được trả về để hoàn toàn có thể "nhớ" bộ nhớ trên ngăn xếp. :) Từ khóa "xóa" gọi hàm hủy và sau đó gọi "xóa toán tử".
Troubadour

@Jherico hoặc sống ở phạm vi không gian tên hoặc là thành viên lớp tĩnh hoặc biến tĩnh hàm cục bộ: thời lượng lưu trữ tĩnh. Nói cách khác: tất cả các vai trò với bộ lưu trữ tự động sẽ tự động bị hủy khi thích hợp. Cảnh giác với Lệnh khởi tạo tĩnh Fiasco
sehe

4

Đây là một kẻ hủy diệt. Nó được gọi khi đối tượng bị phá hủy (ngoài phạm vi cuộc sống hoặc bị xóa).

Để rõ ràng, bạn phải sử dụng ~ NameOfTheClass như cho hàm tạo, các tên khác không hợp lệ.


2
"Tên khác là hợp lệ"?
Các cuộc đua nhẹ nhàng trong quỹ đạo

Câu trả lời cũ ... Tôi nghĩ rằng tôi có nghĩa là sau ~ nó có thể là bất kỳ tên nào miễn là nó giống với tên lớp và tên hàm tạo.
Klaim

2

Đó là kẻ hủy diệt. Phương thức này được gọi khi thể hiện của lớp của bạn bị hủy:

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

1

Đó sẽ là hàm hủy (giải phóng bất kỳ bộ nhớ động nào)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.