24/05/2018, 22:49

Lớp không có hàm tạo và hàm tạo mặc định

Các chương trình nêu trong chương 3 đều không có hàm tạo. Vậy khi đó các đối tượng được hình thành như thế nào ? Chương trình dịch sẽ cung cấp một hàm tạo mặc định không đối (default). Hàm này thực chất không làm gì cả. Như vậy một đối ...

Các chương trình nêu trong chương 3 đều không có hàm tạo. Vậy khi đó các đối tượng được hình thành như thế nào ?

Chương trình dịch sẽ cung cấp một hàm tạo mặc định không đối (default). Hàm này thực chất không làm gì cả. Như vậy một đối tượng tạo ra chỉ được cấp phát bộ nhớ, còn các thuộc tính của nó chưa được xác định. Chúng ta có thể kiểm chứng điều này, bằng cách chạy chương trình sau:

//ct4_03.cpp
    // hàm tạo mặc định
    #include <conio.h>
    #include <iostream.h>
    Class diem_dh
    {
    private:
    Int x,y,m;
    Public:
    // phuong thuc
    Void in()
    {
    Cout <<"
 " << x << " "<< y<<" " << m ;
    }
    };
    Void main()
    {
    Diem_dh d;
    D.in();
    Diem_dh *p;
    P= new diem_dh[10];
    Clrscr();
    D.in();
    For (int i=0;i<10;++i)
    (p+i)->in();
    Getch();
    }
    

Thì hàm tạo mặc định sẽ không được phát sinh nữa. Khi đó mọi câu lệnh xây dựng đối tượng mới đều sẽ gọi đến một hàm tạo của lớp. Nếu không tìm thấy hàm tạo cần gọi thì chương trình dịch sẽ báo lỗi. Điều này thường xẩy ra khi chúng ta không xây dựng hàm tạo không đối, nhưng lại sử dụng các khai báo không tham số như ví dụ sau:

#include <conio.h>
    #include <iostream.h>
    Class diem_dh
    {
    Private:
    Int x,y,m;
    Public:
    // phương thức dùng để in đối tượng diem_dh
    Void in()
    {
    Cout <<"
 " << x << " "<< y<<" " << m ;
    }
    //hàm tạo có đối
    Diem_dh::diem_dh(int x1,int y1,int m1)
    {
    X=x1; y=y1; m=m1;
    }
    };
    Void main()
    {
    Diem_dh d1(200,200,10); // gọi tới hàm tạo có đối
    Diem_dh d2; // gọi tới hàm tạo không đối
    D2= diem_dh(300,300,8); // gọi tới hàm tạo có đối
    D1.in();
    D2.in();
    Getch();
    }
    

Trong các câu lệnh trên, chỉ có câu lệnh thứ 2 trong hàm main() là bị báo lỗi. Câu lệnh này sẽ gọi tới hàm tạo không đối, mà hàm này chưa được xây dựng.

Giải pháp: có thể chọn một trong 2 giải pháp sau:

- Xây dựng thêm hàm tạo không đối.

- Gán giá trị mặc định cho tất cả các đối x1, y1 và m1 của hàm tạo đã xây dựng ở trên.

Theo phương án 2, chương trình có thể sửa như sau:

#include <conio.h>
    #include <iostream.h>
    Class diem_dh
    {
    Private:
    Int x,y,m;
    Public:
    // phương thức dùng để in đối tượng diem_dh
    Void in()
    {
    Cout <<"
 " << x << " "<< y<<" " << m ;
    }
    //hàm tạo có đối , tất cả các đối đều có giá trị mặc định
    Diem_dh::diem_dh(int x1=0,int y1=0,int m1=15)
    {
    X=x1; y=y1; m=m1;
    }
    };
    Void main()
    {
    Diem_dh d1(200,200,10); // gọi tới hàm tạo, không dùng 
    // tham số mặc định
    Diem_dh d2; // gọi tới hàm tạo , dùng 3 tham số mặc định
    D2= diem_dh(300,300); // gọi tới hàm tạo, dùng 1 tham số
    // mặc định
    D1.in();
    D2.in();
    Getch();
    }
    
0