Xem mẫu
Nội dung
Chương 5
HÀM XÂY DỰNG, HÀM HỦY VÀ VIỆC KHỞI TẠO ðỐI TƯỢNG
• 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
1 2
Hàm xây dựng Hàm xây dựng • Mục ñích: khởi tạo giá trị ban ñầu cho ñối tượng • Ví dụ:
– 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
class SinhVien { class Stack { char mssv[8]; float *ds; char* hoten; int soluong; int namsinh; int vitri; float diemtb; public:
public: Cấp vùng nhớ Stack(int max = 10) 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 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ố.
• 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.
class Diem { int x, y;
public:
void InDiem(); void NhapDiem();
void GanGiaTri(int, int);
int GiaTriX(); int GiaTriY(); …
};
// ðịnh nghĩa các hàm thành viên
...
void main() { Diem a;
Diem *pa = new Diem(); Diem ds1[10];
Diem *ds2 = new Diem[20];
… }
x … 1000H Không có giá trị
y ñầu
a nên dễ gây ra
hiệu ứng phụ
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<10;i++) PhanSo *pc = new data[i]=i;
PhanSo(2,5); Stack d(data, 30, 10); … …
} } 6
Hàm xây dựng
• Trình tự thực hiện:
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ỏ.
– ðối tượng ñược tạo ra trước.
– Hàm xây dựng sẽ gọi sau trên ñối tượng.
class SinhVien {
char mssv[8];
class Stack {
float *ds;
char* hoten; int soluong;
PhanSo c(2,5); tu mau
c
PhanSo 1000H *pa2 = new tu
PhanSo[5]; *pa2
tu 2 mau 5
c 1000H
0 0 0 0 0
mau 1 1 1 1 1 *pa2
int namsinh; float diemtb;
public: SinhVien() {
strcpy(mssv,””); hoten = new char[50];
namsinh = 1980;
int vitri; public:
Stack(int max = 10) { soluong = max;
vitri = 0; ds = new
float[soluong];
*ds Stack soluong
b(5); vitri
… … …
1200H *ds 1200
soluong
vitri 7
diemtb = 0; } ~SinhVien() {
delete[] hoten; …
};
} ~Stack() {
} delete[] ds; } …
}; 8
Hàm hủy Hàm xây dựng sao chép
• 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.
• 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 =)
void HamMinhHoa() { Stack a;
Stack *pa = new Stack(8); …
delete pa;
Stack *pb = new Stack[5]; …
delete[] pb;
pb = new Stack(20); …
}
Hàm xây dựng ñược gọi
Hàm hủy ñược gọi cho ñối tượng mà pa ñang trỏ tới
Hàm xây dựng ñược gọi 5 lần
Hàm hủy ñược gọi 5 lần
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
• 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 Hàm xây dựng sao chép
• Cú pháp:
(const & )
Stack a(8); soluong 1300 1340H 3.2 1.4 … vitri
a *ds 1300 2 con trỏ sẽ trỏ Stack b(a); soluong cùng 1 ñịa chỉ
vitri
b ñịnh nghĩa hàm xây dựng
sao chép
{ 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 Hàm xây dựng sao chép • Ví dụ: • Ví dụ:
class SinhVien { char mssv[8]; char* hoten;
int namsinh; float diemtb;
public: …
SinhVien(const SinhVien& s){ strcpy(mssv, s.mssv); hoten = new char[50]; strcpy(hoten, s.hoten); namsinh = s.namsinh; diemtb = s.diemtb;
}
… };
SinhVien nva; …
1 9 2 0 8 9 1 \0 mssv[] 1240 *hoten 1974 namsinh 8.14 diemtb
1240H
N g u y e n … …
2760H copy N g u y e n … …
1 9 2 0 8 9 1 \0 mssv[] 2760 *hoten 1974 namsinh 8.14 diemtb
SinhVien x(nva); 13
class Stack { float *ds;
int soluong; int vitri;
public: …
Stack(const Stack& s) { soluong = s.soluong; vitri = s.vitri;
ds = new float[soluong]; for(int i=0; i
nguon tai.lieu . vn