Xem mẫu
- Chương 5
HÀM XÂY DỰNG, HÀM HỦY VÀ
VIỆC KHỞI TẠO ĐỐI TƯỢNG
1
- Nội dung
• Hàm xây dựng
• Hàm hủy
• Hàm xây dựng sao chép
• Thuộc tính của 1 lớp là đối tượng
2
- Hàm xây dựng
• Mục đích: khởi tạo giá trị ban đầu cho đối tượng
– Gán giá trị đầu cho các thuộc tính.
– Cấp vùng nhớ cho con trỏ thành viên.
class Diem { class PhanSo {
int x, y; int tu, mau;
public: public:
Diem(int a) PhanSo()
{ x = y = a; } { tu=0; mau=1; }
Diem(int h, int t) PhanSo(int x)
{ x = h; y=t; } { tu=x; mau=1; }
…. PhanSo(int t, int m)
}; { tu = t; mau=m; }
….
};
3
- Hàm xây dựng
• Ví dụ:
class SinhVien { class Stack {
char mssv[8]; float *ds;
char* hoten; int soluong;
int namsinh; int vitri;
float diemtb; public:
Cấp vùng
public: Stack(int max = 10)
nhớ
SinhVien() { {
cho con trỏ
strcpy(mssv,””); soluong = max;
hoten = new char[50]; vitri = 0;
namsinh = 1980; ds = new
diemtb = 0; float[soluong];
} }
SinhVien(char*,char*,int,fl Stack(float* d, int m,
oat); int n);
… …
}; };
4
- Hàm xây dựng
• Nếu không có định nghĩa hàm xây dựng:
– Mặc nhiên sẽ tự động có 1 hàm xây dựng không tham số.
– Chỉ có 1 cách khởi tạo đối tượng theo dạng không tham số.
class Diem { void main() {
int x, y; Diem a;
public: Diem *pa = new Diem();
void InDiem(); Diem ds1[10];
void NhapDiem(); Diem *ds2 = new
void GanGiaTri(int, Diem[20];
int); …
int GiaTriX(); }
int GiaTriY();
1000H
… x … Không có giá trị
}; y … đầu
// Định nghĩa các hàm a nên dễ gây ra
thành viên hiệu ứng phụ5
...
- Hàm xây dựng
• Nếu có định nghĩa ít nhất 1 hàm xây dựng:
– Có bao nhiêu hàm xây dựng sẽ có bấy nhiêu cách khởi tạo
đối tượng theo dạng đã định nghĩa.
void main() { void main() {
PhanSo a; Stack a;
PhanSo b(3); Stack b(5);
PhanSo c(2,5); Stack c[5];
PhanSo d[3]; Stack *pa = new Stack();
PhanSo *pa = new PhanSo; Stack *pb = new Stack(40);
PhanSo *pa1 = new PhanSo(); Stack *pc = new Stack[40];
PhanSo *pa2 = new PhanSo[5]; float data[40];
PhanSo *pb = new PhanSo(3); for(int i=0;i
- Hàm xây dựng
• Trình tự thực hiện:
– Đối tượng được tạo ra trước.
– Hàm xây dựng sẽ gọi sau trên đối tượng.
PhanSo c(2,5); tu tu 2
mau mau 5
c c
PhanSo 1000H 1000H
*pa2 = new 100 tu 100 tu 0 0 0 0 0
0 mau 0 mau 1 1 1 1 1
PhanSo[5]; *pa2 *pa2
1200H
120
…
*ds *ds 0
Stack soluong … soluong 5
b(5); … 0
vitri vitri 7
- Hàm hủy • Mục đích: thu hồi vùng nhớ đã cấp cho con
trỏ là dữ liệu thành viên => delete con trỏ.
class SinhVien { class Stack {
char mssv[8]; float *ds;
char* hoten; int soluong;
int namsinh; int vitri;
float diemtb; public:
public: Stack(int max = 10) {
SinhVien() { soluong = max;
strcpy(mssv,””); vitri = 0;
hoten = new char[50]; ds = new
namsinh = 1980; float[soluong];
diemtb = 0; } }
~SinhVien() { ~Stack() {
delete[] hoten; } delete[] ds; }
… …
}; }; 8
- Hàm hủy
• Thứ tự thực hiện: gọi trước khi hủy đối tượng:
– Kết thúc 1 hàm mà trong đó ta có khởi tạo đối tượng.
– Thu hồi vùng nhớ cho con trỏ đối tượng.
Hàm xây dựng được gọi
void HamMinhHoa() {
Hàm hủy được gọi cho
Stack a;
đối tượng mà pa đang trỏ
Stack *pa = new Stack(8);
tới
…
Hàm xây dựng được gọi 5
delete pa;
lần
Stack *pb = new Stack[5];
Hàm hủy được gọi 5
…
lần
delete[] pb;
pb = new Stack(20); Hàm xây dựng được gọi
…
Hàm hủy được gọi cho a
}
trước khi kết thúc hàm
HamMinhHoa() 9
- Hàm xây dựng sao chép
• Tại sao cần hàm xây dựng sao chép?
– Khởi tạo 1 đối tượng có giá trị giống 1 đối tượng khác.
– Khác với phép gán (dấu =)
• Nếu không định nghĩa hàm xây dựng sao chép:
– Ngôn ngữ sẽ tự động tạo ra cho ta: nội dung là gán (=)
tương ứng từng thành phần.
– Không chính xác khi có dữ liệu thành viên là con trỏ.
10
- Hàm xây dựng sao chép
130 1300H
Stack a(8); *ds 0
… soluong 8 4 3.2 1.4 …
3
vitri
2 con trỏ sẽ
a 130
trỏ
*ds 0
8 cùng 1 địa chỉ
Stack b(a); soluong
3 nếu không
vitri
b định nghĩa
hàm xây
dựng
sao chép
- Hàm xây dựng sao chép
• Cú pháp: (const & )
{ Nội dung hàm }
VD: Diem(const Diem& d) { … }
Stack(const Stack& s) { … }
SinhVien(const SinhVien& sv) { … }
• Nội dung:
– Gán tương ứng các thành phần dữ liệu (không là con trỏ).
– Cấp vùng nhớ và sao chép nội dung vùng nhớ từ đối tượng
cho trước.
VD: Diem(const Diem& d) { x=d.x; y=d.y; }
PhanSo(const PhanSo& p) { tu=p.tu;
mau=p.mau; } 12
- Hàm xây dựng sao chép
• Ví dụ:
SinhVien nva; …
class SinhVien { 1 9 2 0 8 9 1 0 mssv[]
char mssv[8];
1240 *hoten
char* hoten;
1974 namsinh
int namsinh; 1
8.14 diemtb
float diemtb; 2
public: 24
c…
… 70
N g u y e n …
o
SinhVien(const SinhVien& s){ 6H
strcpy(mssv, s.mssv); N0 g u y e n … …
p
hoten = new char[50]; y
H
strcpy(hoten, s.hoten); 1 9 2 0 8 9 1 0
mssv[]
namsinh = s.namsinh; 2760 *hoten
diemtb = s.diemtb; 1974 namsinh
} 8.14 diemtb
…
SinhVien x(nva);
}; 13
- Hàm xây dựng sao chép
• Ví dụ:
class Stack { 1
Stack a(8);3…
float *ds;
int soluong; *ds 130
0
0 3 1
int vitri; soluong 8 04 2. 4. … …
public: vitri 3 H
… a
Stack(const Stack& s) { copy
soluong = s.soluong;
vitri = s.vitri; *ds 157
0
1 3 1
ds = new float[soluong]; soluong 8 54 2. 4. … …
for(int i=0; i
- Hàm xây dựng sao chép
• Sử dụng trong các trường hợp:
– Đối tượng được truyền theo giá trị của đối số 1 hàm.
– Trị trả về của hàm là 1 đối tượng.
– Tạo ra 1 đối tượng có giá trị giống 1 đối tượng cho trước.
class A { A HamThu(A x) {
int x; A y(x);
public: return y; Có bao
A() { x=0; } } nhiêu hàm
A(const A& a) { xây dựng
x=a.x; void main() { sao chép
} A a,b; được gọi?
void Hien() { b = HamThu(a);
cout
- Thuộc tính của 1 lớp là đối tượng
• Giới thiệu:
– Thuộc tính của 1 lớp có thể có kiểu bất kỳ.
– Thuộc tính của 1 lớp có thể là đối tượng của 1 lớp khác.
Sử dụng lại 1 lớp, nhưng không phải là thừa kế
class Diem { class DuongTron {
int x, y; Diem tam;
public : int bankinh;
Diem(); public:
Diem(int , int); DuongTron(); ...
void Nhap(); void Ve();
void Hien(); void Nhap();
void DoiDiem(int,int); void
DoiDTron(int,int);
int GiaTriX(); float ChuVi();
int GiaTriY(); float DienTich();
}; }; 16
- Thuộc tính của 1 lớp là đối tượng
• Cách truy xuất:
– Khi truy xuất đến thuộc tính là đối tượng, phải thông qua
tên của thuộc tính.
– Lưu ý đến thuộc tính truy cập (public, private, …) của
thành phần dữ liệu và hàm thành viên của lớp tạo ra đối
tượng đó để truy xuất hợp lý.
- Thuộc tính của 1 lớp là đối tượng
Void DuongTron::Ve() {
cout
- Thuộc tính của 1 lớp là đối tượng
• Hàm xây dựng:
– Phải khởi tạo cho thuộc tính là đối tượng theo dạng
hàm xây dựng của lớp đó.
DuongTron() : tam()
{ bankinh=0; }
DuongTron(Diem d, int bk) : tam(d)
{ bankinh=bk; }
DuongTron(int x, int y, int bk) : tam(x,y)
{ bankinh=bk; }
DuongTron(const DuongTron& d): tam(d.tam)
{bankinh=d.bankinh;}
19
- Thuộc tính của 1 lớp là đối tượng
• Hàm xây dựng:
■ Nếu có nhiều thuộc tính là đối tượng, khởi tạo các đối
tượng này liên tiếp nhau thông qua dấu phẩy (,).
■ Cú pháp này cho phép áp dụng cả với thuộc tính
thường.
Duongtron(): tam(), bankinh(0)
{}
Duongtron(Diem d, int bk) : tam(d), bankinh(bk)
{}
20
nguon tai.lieu . vn