Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 3 của 3
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Giúp mình về hàm constructor và destructor trong c++ với

    Mình không hiểu rõ về 2 hàm này, có bạn nào hướng dẫn mình một cách đơn giản không ah. Nó để làm gì, tại sao phải dùng nó mà không viết bình thường được nhỉ. Nếu mình không dùng hai hàm này thì sao ah? lơ tơ mơ quá

  2. #2
    - uhm, cái này với người mới học thì khá là khó hiểu, khi nào lập trình nhiều với các kiểu dữ liệu tự định nghĩa thì bạn sẽ hiểu hơn. Nói đơn giản thì là thế này, khi một biến được khai báo (không tính con trỏ nhá, cái đó nói sau), máy tính cần cấp một số ô nhớ nhất định cho biến đó dùng làm chỗ chứa giá trị của nó, đến khi không cần biến đó thì thu hồi bộ nhớ cấp cho biến đó (coi như nó bị hủy). Với các class do bạn tự định nghĩa thì có thể khai báo hàm tạo và hàm hủy, bạn sẽ yêu cầu máy làm một số thao tác nào đó khi khởi tạo (hay gặp nhất là gán giá trị khởi tạo chẳng hạn) và làm gì đó trước khi hủy. Nếu không khai báo hai hàm này thì máy chỉ làm việc cấp phát và thu hồi bộ nhớ của biến đó mà không làm gì khác.

    - Khi bạn viết: A _a; thì thực ra máy đã tự gọi đến hàm khởi tạo của class A rồi,hàm hủy được gọi khi bạn delete 1 con trỏ của class A, hoặc máy tự hủy biến "_a" ở trên khi ra khỏi hàm (cơ chế xóa các biến cục bộ của C).
    - code ví dụ:
    Mã:
    class A
    {
          public :
          char *p;
          int x,y;
        
               A()
               {
                    x=0;y=0;
                    cout<<" tao A
    ";
               }
                ~A()
                {
                    cout<<" huy A
    ";                
                }
         
    };
    
    void abc()
    {
      A a;     
    }
    int main(){    
        abc();
        cin.get();
    }
    => bạn sẽ thấy in ra câu "tao A" và "huy A" mặc dù bạn không viết lời gọi hàm. câu "huy A" là do lúc ra khỏi hàm abc() , máy hủy biến a (biến cục bộ) nên tự gọi hàm hủy.

    - với biến con trỏ A *a, thì hàm tạo và hủy được gọi khi bạn viết câu lệnh "new A()" và "delete a;", nó không tự gọi hàm tạo và hủy nữa dù con trỏ a có là biến cục bộ, do đó nếu bạn quên gọi "delete a;" thì sẽ thất thoát bộ nhớ, thất thoát nhiều thì chết chương trình. Ưu điểm là bạn kiểm soát được kĩ càng nhưng sẽ tổn thất bộ nhớ nếu bạn quên gọi hàm hủy.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Đây là hai (loại) hàm có chức năng đặc biệt trong class, như bạn trên đã đề cập.

    Trở lại với structured programming, khi không có constructor/destructor thì phải tự viết ra hai hàm có chức năng tương tự như vậy.
    Điều này có thể gây uninitialized variable hay memory leak nếu không cẩn thận.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •