HÀM TẠO (Constructor) Hàm tạo (hàm thiết lập)
Hàm tạo cũng là một phương thức của lớp (nhưng là hàm đặc biệt) dùng để tạo dựng một đối tượng mới. Chương trình dịch sẽ cấp phát bộ nhớ cho đối tượng sau đó sẽ gọi đến hàm tạo. Hàm tạo sẽ khởi gán giá trị cho các thuộc tính của đối tượng và có thể thực hiện một số công việc khác nhằm chuẩn bị cho đối tượng mới.
Cách viết hàm tạo
Điểm khác của hàm tạo và các phương thức thông thường:
Khi viết hàm tạo cần để ý 3 sự khác biệt của hàm tạo so với các phương thức khác như sau:
Tên của hàm tạo: Tên của hàm tạo bắt buộc phải trùng với tên của lớp.
Không khai báo kiểu cho hàm tạo.
Hàm tạo không có kết quả trả về.
Sự giống nhau của hàm tạo và các phương thức thông thường
Ngoài 3 điểm khác biệt trên, hàm tạo được viết như các phương thức khác:
Hàm tạo có thể được xây dựng bên trong hoặc bên ngoài định nghĩa lớp.
Hàm tạo có thể có đối hoặc không có đối.
Trong một lớp có thể có nhiều hàm tạo (cùng tên nhưng khác bộ đối).
Ví dụ sau định nghĩa lớp DIEM_DH (Điểm đồ họa) có 3 thuộc tính:
int x; // hoành độ (cột) của điểm
int y; // tung độ (hàng) của điểm
int m; // mầu của điểm
và đưa vào 2 hàm tạo để khởi gán cho các thuộc tính của lớp:
// Hàm tạo không đối: Dùng các giá trị cố định để khởi gán cho x, y, m
DIEM_DH() ;
// Hàm tạo có đối: Dùng các đối x1, y1, m1 để khởi gán cho x, y, m
DIEM_DH(int x1, int y1, int m1 = 15) ; // Đối m1 có giá trị mặc định 15
class DIEM_DH // (mầu trắng)
{
private:
int x, y, m ;
public:
// Hàm tạo không đối: khởi gán cho x = 0, y = 0, m = 1
// Hàm này viết bên trong định nghĩa lớp
DlEM_DH()
{
x = y = 0;
m = 1;
}
// Hàm tạo này xây dựng bên ngoài định nghĩa lớp
DIEM_DH(int x1, int y1, int m1 = 15) ;
// Các phương thức khác
};
// Xây dựng hàm tạo bên ngoài định nghĩa lớp
DIEM_DH:: DIEM_DH(int x1, int y1, int m1) ;
{
x = x1; y = y1; m = m1;
}
Dùng hàm tạo trong khai báo
Khi đã xây dựng các hàm tạo, ta có thể dùng chúng trong khai báo để tạo ra một đối tượng đồng thời khởi gán cho các thuộc tính của đối tượng được tạo. Dựa vào các tham số trong khai báo mà trình biên dịch sẽ biết cần gọi đến hàm tạo nào.
Khi khai báo một biến đối tượng có thể sử dụng các tham số để khởi gán cho các thuộc tính của biến đối tượng.
Khi khai báo mảng đối tượng không cho phép dùng các tham số để khởi gán.
Câu lệnh khai báo một biến đối tượng sẽ gọi tới hàm tạo 1 lần.
Câu lệnh khai báo một mảng n đối tượng sẽ gọi tới hàm tạo n lần.
Ví dụ:
DIEM_DH d; // Gọi tới hàm tạo không đối.
// Kết quả d.x = 0, d.y = 0, d.m = 1
DIEM_DH u(300, 100, 5); // Gọi tới hàm tạo có đối.
// Kết quả u.x = 300, u.y = 100, d.m = 5
DIEM_DH v(400, 200); // Gọi tới hàm tạo có đối.
// Kết quả v.x = 400, v.y = 200, d.m = 15
DIEM_DH p[20] ; // Gọi tới hàm tạo không đối 20 lần
Chú ý: Với các hàm có đối kiểu lớp, thì đối chỉ xem là các tham số hình thức, vì vậy khai báo đối (trong dòng đầu của hàm) sẽ không tạo ra đối tượng mới và do đó không gọi tới các hàm tạo.
Dùng hàm tạo trong cấp phát bộ nhớ
Khi cấp phát bộ nhớ cho một đối tượng có thể dùng các tham số để khởi gán cho các thuộc tính của đối tượng, ví dụ
DIEM_DH *q = new DIEM_DH(40, 20, 4); // Gọi tới hàm tạo có đối
// Kết quả q ® x = 40, q ® y = 20, q ® m = 4
DIEM_DH *r = new DIEM_DH ; //Gọi tới hàm tạo không đối
// Kết quả r ® x = 0, r ® y = 0, r ® m = 1
Khi cấp phát bộ nhớ cho một dãy đối tượng không cho phép dùng tham số để khởi gán, ví dụ:
int n = 30;
DIEM_DH *s = new DlEM_DH[n] ; // Gọi tới hàm tạo không đối 30 lần.
Dùng hàm tạo để biểu điền các đối tượng hằng
Như đã biết, sau khi định nghĩa lớp DIEM_DH thì có thể xem lớp này như một kiểu dữ liệu như int, double, char, ...
Với kiểu int chúng ta có các hằng int, như 253.
Với kiểu double chúng ta có các hằng double, như 75.42
Khái niệm hằng kiểu int, hằng kiểu double có thể mở rộng cho hằng kiểu DIEM_DH
Để biểu diễn một hằng đối tượng (hay còn gọi: Đối tượng hằng) chúng ta phải dùng tới hàm tạo. Mẫu viết như sau:
Tên_lớp(danh sách tham số) ;
Ví dụ đối với lớp DIEM_DH nói trên, có thể viết như sau:
DIEM_DH(234, l 23, 4) // Biểu thị một đối tượng kiểu DIEM_DH
// có các thuộc tính x = 234, y = 123, m = 4
Chú ý: Có thể sử dụng một hằng đối tượng như một đối tượng. Nói cách khác, có thể dùng hằng đối tượng để thực hiện một phương thức, ví dụ nếu viết:
DIEM_DH(234, l 23, 4).in();
thì có nghĩa là thực hiện phương thức in() đối với hằng đối tượng.
Ví dụ minh họa
Chương trình sau đây minh họa cách xây dựng hàm tạo và cách sử dùng hàm tạo trong khai báo, trong cấp phát bộ nhớ và trong việc biểu diễn các hằng đối tượng.
#include
#include
#include
class DIEM_DH
{
private:
int x, y, m;
public:
// Hàm bạn dùng để in đối tượng DIEM_DH
friend void in(DIEM_DH d)
{
cout <<"\n '' << d.x << '' ''<< d.y<<" " << d.m ;
}
// Phương thức dùng để in đối tượng DIEM_DH
void in()
{
cout <<''\n '' << x << '' ''<< y<<" " << m ;
}
// Hàm tạo không đối
DIEM_DH()
{
x = y = 0;
m = 1;
}
// Hàm tạo có đối, đối m1 có giá trí mặc định là 15 (mầu trắng)
DIEM_DH(int x1, int y1, int m1 = 15);
};
// Xây dựng hàm tạo
DIEM_DH::DIEM_DH(int x1, int y1, int m1)
{
x = x1; y = y1; m = m1;
}
void main()
{
DIEM_DH d1; // Gọi tới hàm tạo không đối
DIEM_DH d2(200, 200, 10); // Gọi tới hàm tạo có đối
DIEM_DH*d;
d = new DIEM_DH(300, 300); // Gọi tới hàm tạo có đối
clrscr();
in(d1); //Gọi hàm bạn in()
d2.in(); //Gọi phương thức in()
in(*d); // Gọi hàm bạn in()
DIEM_DH(2, 2, 2).in(); // Gọi phương thức in()
DIEM_DH t[3]; // 3 lần gọi hàm tạo không đối
DIEM_DH*q; // Gọi hàm tạo không đối
int n;
cout << "\n N = "; cin >> n;
q = new DIEM_DH[n+1]; // (n+1) lần gọi hàm tạo không đối
for (int i = 0; i< = n; ++i)
q[i] = DIEM_DH(300+i, 200+i, 8); //(n+1) lần gọi hàm tạo có đối
for (i = 0; i< = n; ++i)
q[i].in(); // Gọi phương thức in()
for (i = 0; i< = n; ++i)
DIEM_DH(300+i, 200+i, 8).in(); // Gọi phương thức in()
getch();
}
Chia sẻ với bạn bè của bạn: |