SlideShare a Scribd company logo
1 of 22
Download to read offline
Lập trình hướng đối
tượng C++
Giảng viên giảng dạy: Nguyễn Hữu Vân Long
Chương 5
Hàm xây dựng & Hàm hủy
Hàm xây dựng sao chép
2
BM MTT&TT 3
 Hàm xây dựng (Constructor)
 Hàm hủy (Destructor)
 Hàm xây dựng sao chép (Copy constructor)
 Đối tượng là dữ liệu thành viên của một lớp
Nội dung bài giảng
BM MTT&TT 4
 Mục đích: dùng để khởi tạo giá trị ban đầu cho đối tượng
 Gán giá trị đầu cho các thuộc tính (dữ liệu thành viên)
 Cấp vùng nhớ cho con trỏ thành viên.
Hàm xây dựng
class Diem {
int x, y;
public:
Diem(int a)
{ x = y = a; }
Diem(int h, int t)
{ x = h; y=t; }
….
};
class PhanSo {
int tu, mau;
public:
PhanSo()
{ tu=0; mau=1; }
PhanSo(int x)
{ tu=x; mau=1; }
PhanSo(int t, int m)
{ tu = t; mau=m; }
….
};
BM MTT&TT 5
 Ví dụ
Hàm xây dựng
class SinhVien {
char mssv[8];
char* hoten;
int namsinh;
float diemtb;
public:
SinhVien() {
strcpy(mssv,””);
hoten = new char[50];
namsinh = 1980;
diemtb = 0;
}
SinhVien(char*,char*,int,float);
…
};
class Stack {
float *ds;
int soluong;
int vitri;
public:
Stack(int max = 10) {
soluong = max;
vitri = 0;
ds = new float[soluong];
}
Stack(float* d, int m, int n);
…
};
Cấp vùng nhớ
cho con trỏ
BM MTT&TT 6
 Nếu không có định nghĩa hàm xây dựng:
 Trình biên dịch sẽ tự động thêm vào 1 hàm xây dựng
không đối số => Hàm xây dựng mặc nhiên.
 Viêc khởi tạo đối tượng không tham số đầu chỉ có 1 cách
duy nhất.
Hàm xây dựng
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
…
…
…
a
x
y
1000H
void main() {
Diem a;
Diem *pa = new Diem();
Diem ds1[10];
Diem *ds2 = new Diem[20];
…
}
Không có giá trị đầu
nên dễ gây ra
hiệu ứng phụ
BM MTT&TT 7
 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.
 Chú ý: Trường hợp sử dụng đối số mặc nhiên trong hàm
xây dựng
Hàm xây dựng
void main() {
PhanSo a;
PhanSo b(3);
PhanSo c(2,5);
PhanSo d[3];
PhanSo *pa = new PhanSo;
PhanSo *pa1 = new PhanSo();
PhanSo *pa2 = new PhanSo[5];
PhanSo *pb = new PhanSo(3);
PhanSo *pc = new PhanSo(2,5);
…
}
void main() {
Stack a;
Stack b(5);
Stack c[5];
Stack *pa = new Stack();
Stack *pb = new Stack(40);
Stack *pc = new Stack[40];
float data[40];
for(int i=0;i<10;i++)
data[i]=i;
Stack d(data, 30, 10); …
}
BM MTT&TT 8
 Trình tự tạo 1 đối tượng:
 Vùng nhớ dành cho đối tượng được cấp phát (tạo ra) trước.
 Hàm xây dựng được gọi để khởi tạo giá trị cho các dữ liệu
thành viên của đối tượng mới.
Hàm xây dựng
c
tu
mau
2
5
c
tu
mau
PhanSo c(2,5);
PhanSo *pa2 =
new PhanSo[5];
tu
mau
1000H
*pa2
1000
tu
mau
1000H
*pa2
1000
0
1
0
1
0
1
0
1
0
1
0
1200
5
*ds
soluong
vitri
1200H
Stack b(5);
*ds
soluong
vitri
…
…
…
BM MTT&TT 9
 Mục đích: thu hồi các nguồn tài nguyên đang sử dụng bởi đối
tượng trước khi đối tượng bị hủy
 Thu hồi vùng nhớ đã cấp phát cho con trỏ  delete con
trỏ
 Đóng các nguồn tài nguyên đang mở (tập tin)
Hàm hủy
class SinhVien {
char mssv[8];
char* hoten;
int namsinh;
float diemtb;
public:
SinhVien() {
strcpy(mssv,””);
hoten = new char[50];
namsinh = 1980;
diemtb = 0;
}
~SinhVien() { delete[] hoten; }
…
};
class Stack {
float *ds;
int soluong;
int vitri;
public:
Stack(int max = 10) {
soluong = max;
vitri = 0;
ds = new float[soluong];
}
~Stack() { delete[] ds; }
…
};
BM MTT&TT 10
 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 hủy
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 hủy được gọi cho a
trước khi kết thúc hàm
HamMinhHoa()
Hàm xây dựng được gọi
BM MTT&TT 11
 Mục đích: dùng để tạo 1 đối tượng từ 1 đối tượng đã tồn tại.
Được gọi trong các trường hợp:
 Đối số của hàm là một đối tượng.
 Trị trả về của hàm là 1 đối tượng.
 Khởi tạo đối tượng từ một đối tượng đã có sẵn.
Hàm xây dựng sao chép
class Diem {
int x,y;
public:
Diem(int h=0, int t=0) {
x = h; y = t;
}
Diem doixung() {
return Diem(-x,-y);
}
char* trung(Diem d) {
if(x==d.x && y==d.y)
return “Trung”;
return “Ko trung”;
}
};
Diem a(1, 2), b, c(a);
b = a.doixung();
cout << a.trung(b);
BM MTT&TT 12
 Trong cả 3 trường hợp trên, có 1 đối tượng mới được tạo ra
từ một đối tượng có sẵn
 Diem c(a): tạo đối tượng c “giống” đối tượng a.
 b = a.doixung(): một đối tượng “tạm” “giống” với đối
tượng Diem(-x,-y) trong hàm doixung() được tạo ra
bên trong hàm main() để gán cho b.
 a.trung(b): đối tượng d, là tham số hình thức của hàm
trung() được tạo ra “giống” với đối tượng b, là tham số
thực tế trong hàm main().
 Khi đó, hàm xây dựng sao chép của các đối tượng “mới” sẽ
được gọi để sao chép dữ liệu.
Hàm xây dựng sao chép
BM MTT&TT 13
 Nếu lớp không có hàm xây dựng sao chép
 Trình biên dịch sẽ tự động thêm vào cho lớp một hàm xây
dựng sao chép mặc nhiên.
 Hàm này sẽ thực hiện gán tuần tự từng thuộc tính của đối
tượng mới bằng (“=“) với từng thuộc tính tương ứng của
đối tượng có sẵn.
 Có thể bị sai nếu lớp có dữ liệu thành viên là con trỏ.
Hàm xây dựng sao chép
Chú ý: Phân biệt giữa trường hợp thực hiện phép
gán (“=“) với trường hợp gọi hàm xây dựng sao
chép.
Diem a(1,2), b, c(a); //gọi hàm XDSC cho c
b = a; //thực hiện phép gán cho b
BM MTT&TT 14
Hàm xây dựng sao chép
Stack a(5);
//gán dữ liệu cho Stack a
...
Stack b(a); //tạo b giống a
a
ds:1000
soluong:5
vitri:3
b
ds:
soluong:
vitri:
Diem a(1,2);
Diem b(a); // tạo b giống a
a
x:1
y:2
b
x:
y:
=
=
=
=
=
1
2
1000
5
3
BM MTT&TT 15
 Cú pháp:
<Tên lớp> (const <Tên lớp>& <tên tham số> )
{ 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ỏ).
 Đối với dữ liệu thành viên là con trỏ: Cấp phát vùng nhớ và
sao chép nội dung vùng nhớ quản lý bởi con trỏ 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; }
Hàm xây dựng sao chép
BM MTT&TT 16
Hàm xây dựng sao chép
class Diem {
int x, y;
public:
Diem(int x=0, int y=0) {
this->x = x;
this->y = y;
cout << “nXD ” << this;
}
Diem(const Diem& d) {
x = d.x; y = d.y;
cout << "nXDSC: " << this;
}
Diem doixung() {
Diem kq(-x,-y);
return kq;
}
...
};
void main() {
Diem a(1,2);
Diem b(a), c;
c = a.doixung();
cout << "na: " << &a;
cout << "nb: " << &b;
cout << "nc: " << &c;
}
Đây cũng chính là nội
dung hàm XDSC mặc
nhiên
BM MTT&TT 17
Hàm xây dựng sao chép
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;
}
…
};
*hoten
namsinh
diemtb
1240
1974
8.14
N g u y e n … …
1240H
91 02 98 01mssv[]
*hoten
namsinh
diemtb
2760
1974
8.14
91 02 98 01mssv[]
N g u y e n … …
2760H
copy
SinhVien x(nva);
SinhVien nva; …
BM MTT&TT 18
Hàm xây dựng sao chép
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<vitri; i++)
ds[i]=s.ds[i];
}
…
};
*ds
soluong
vitri
1300
8
3
4 3.2 1.4 … … … … …
1300H
a
Stack a(8); …
Stack b(a);
*ds
soluong
vitri
1570
8
3
4 3.2 1.4 … … … … …
1570H
b
copy
BM MTT&TT 19
 Giới thiệu
 Lớp là một kiểu dữ liệu do người dùng định nghĩa
=> Dữ liệu thành viên của một lớp có thể là 1 ĐT.
 Đây là một cách sử dụng lại mã (reusability), trong đó
quan hệ giữa lớp sử dụng lại và lớp được sử dụng là quan
hệ “có” hay “bao gồm”.
(Cần phân biệt với tính kế thừa, quan hệ “là”).
Đối tượng là dữ liệu thành viên
BM MTT&TT 20
 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.
Đối tượng là dữ liệu thành viên
Sử dụng lại 1 lớp, nhưng không phải là thừa kế
class Diem {
int x, y;
public :
Diem();
Diem(int , int);
void Nhap();
void Hien();
void DoiDiem(int,int);
int GiaTriX();
int GiaTriY();
};
class DuongTron {
Diem tam;
int bankinh;
public:
DuongTron(); ...
void Ve();
void Nhap();
void
DoiDTron(int,int);
float ChuVi();
float DienTich();
};
BM MTT&TT 21
 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 đối tượng (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ý.
Đối tượng là dữ liệu thành viên
void DuongTron :: Ve() {
cout<<“Tam : “; tam.Hien(); cout<<endl;
cout<<“Ban kinh : “<<bankinh<<endl;
}
void DuongTron :: Nhap() {
cout<<“Nhap tam : “<<endl; tam.Nhap();
cout<<“Nhap ban kinh : “; cin>>bankinh;
}
void DuongTron :: DoiDTron(int dx, int dy) {
tam.DoiDiem(dx, dy);
}
7
10
20
tam
bankinh
x
y
DuongTron a;
BM MTT&TT 22
 Hàm xây dựng của đối tượng là dữ liệu thành viên
 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 đó: <prototype hàm XD> : <tên
ĐT>(tsố) {…}




 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.
Đối tượng là dữ liệu thành viên
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;}
Duongtron(): tam(), bankinh(0) {}
Duongtron(Diem d, int bk) : tam(d), bankinh(bk) {}

More Related Content

What's hot

Pplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09aPplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09aPix Nhox
 
Nmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyNmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyMinh Ngoc Tran
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01giang
 
Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Huy Rùa
 
Nmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inNmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inHuy Nguyễn
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1htpsccbb159
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Thanh Minh Hoang
 
Session 4
Session 4Session 4
Session 4pnanhvn
 
Phần 7: Mảng một chiều
Phần 7: Mảng một chiềuPhần 7: Mảng một chiều
Phần 7: Mảng một chiềuHuy Rùa
 
Ctdl C05
Ctdl C05Ctdl C05
Ctdl C05giang
 

What's hot (16)

Tut6 solution
Tut6 solutionTut6 solution
Tut6 solution
 
Pplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09aPplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09a
 
Nmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyNmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequy
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01
 
Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)
 
Nmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inNmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_in
 
Ctdl lab01
Ctdl lab01Ctdl lab01
Ctdl lab01
 
Tut5 solution
Tut5 solutionTut5 solution
Tut5 solution
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1
 
Lesson05
Lesson05Lesson05
Lesson05
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
 
Session 4
Session 4Session 4
Session 4
 
Nmlt c07 mang1_chieu
Nmlt c07 mang1_chieuNmlt c07 mang1_chieu
Nmlt c07 mang1_chieu
 
Phần 7: Mảng một chiều
Phần 7: Mảng một chiềuPhần 7: Mảng một chiều
Phần 7: Mảng một chiều
 
Ctdl C05
Ctdl C05Ctdl C05
Ctdl C05
 
Stl string
Stl stringStl string
Stl string
 

Viewers also liked

Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Hồ Lợi
 
C5 classes and objects
C5 classes and objectsC5 classes and objects
C5 classes and objectsHồ Lợi
 
Ctdl 2005 chuong 2
Ctdl 2005 chuong 2Ctdl 2005 chuong 2
Ctdl 2005 chuong 2Hồ Lợi
 
Bài tập CTDL và GT 2
Bài tập CTDL và GT 2Bài tập CTDL và GT 2
Bài tập CTDL và GT 2Hồ Lợi
 
C4 data structures
C4 data structuresC4 data structures
C4 data structuresHồ Lợi
 
Chương 3 - Hàng đợi
Chương 3 - Hàng đợi Chương 3 - Hàng đợi
Chương 3 - Hàng đợi Hồ Lợi
 
Ctdl 2005 chuong 4
Ctdl 2005 chuong 4Ctdl 2005 chuong 4
Ctdl 2005 chuong 4Hồ Lợi
 
Phân tích một số thuật toán
Phân tích một số thuật toánPhân tích một số thuật toán
Phân tích một số thuật toánHồ Lợi
 

Viewers also liked (20)

Chuong2 c
Chuong2 c Chuong2 c
Chuong2 c
 
Chuong 1
Chuong 1Chuong 1
Chuong 1
 
Chuong4 (2)
Chuong4 (2)Chuong4 (2)
Chuong4 (2)
 
Chuong8 (2)
Chuong8 (2)Chuong8 (2)
Chuong8 (2)
 
Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Bài tập CTDL và GT 12
Bài tập CTDL và GT 12
 
Bai6 stacks
Bai6 stacksBai6 stacks
Bai6 stacks
 
C5 classes and objects
C5 classes and objectsC5 classes and objects
C5 classes and objects
 
Bai1 kdl
Bai1 kdlBai1 kdl
Bai1 kdl
 
Ctdl 2005 chuong 2
Ctdl 2005 chuong 2Ctdl 2005 chuong 2
Ctdl 2005 chuong 2
 
Bài tập CTDL và GT 2
Bài tập CTDL và GT 2Bài tập CTDL và GT 2
Bài tập CTDL và GT 2
 
Cau 2
Cau 2Cau 2
Cau 2
 
C4 data structures
C4 data structuresC4 data structures
C4 data structures
 
Chương 3 - Hàng đợi
Chương 3 - Hàng đợi Chương 3 - Hàng đợi
Chương 3 - Hàng đợi
 
Ctdl 2005 chuong 4
Ctdl 2005 chuong 4Ctdl 2005 chuong 4
Ctdl 2005 chuong 4
 
Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oop
 
C9 templates
C9 templatesC9 templates
C9 templates
 
Debug trong c
Debug trong cDebug trong c
Debug trong c
 
Phân tích một số thuật toán
Phân tích một số thuật toánPhân tích một số thuật toán
Phân tích một số thuật toán
 
Chuong7
Chuong7Chuong7
Chuong7
 
Nguyen lyoop
Nguyen lyoopNguyen lyoop
Nguyen lyoop
 

Similar to Chuong5 (2)

Oop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớpOop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớpTráng Hà Viết
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09xcode_esvn
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07xcode_esvn
 
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...MasterCode.vn
 
Con tro va mang doi tuong
Con tro va mang doi tuongCon tro va mang doi tuong
Con tro va mang doi tuongNguyen Lam
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08xcode_esvn
 
Chuong9 lop vadoituong
Chuong9 lop vadoituongChuong9 lop vadoituong
Chuong9 lop vadoituongMinh Ngoc Tran
 

Similar to Chuong5 (2) (20)

Chuong 4
Chuong 4Chuong 4
Chuong 4
 
Oop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớpOop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớp
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
 
Oop 5
Oop 5Oop 5
Oop 5
 
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
 
Lesson07
Lesson07Lesson07
Lesson07
 
C9 templates
C9 templatesC9 templates
C9 templates
 
Lesson08
Lesson08Lesson08
Lesson08
 
Con tro va mang doi tuong
Con tro va mang doi tuongCon tro va mang doi tuong
Con tro va mang doi tuong
 
Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3
 
Chapter 6
Chapter 6Chapter 6
Chapter 6
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
 
Chuong 5
Chuong 5Chuong 5
Chuong 5
 
Lesson09
Lesson09Lesson09
Lesson09
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1
 
Chuong 3
Chuong 3Chuong 3
Chuong 3
 
Bai05 ket tapvakethua
Bai05 ket tapvakethuaBai05 ket tapvakethua
Bai05 ket tapvakethua
 
Chuong9 lop vadoituong
Chuong9 lop vadoituongChuong9 lop vadoituong
Chuong9 lop vadoituong
 
344444
344444344444
344444
 

More from Hồ Lợi

Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functionsHồ Lợi
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequyHồ Lợi
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignmentHồ Lợi
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapcHồ Lợi
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitapHồ Lợi
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhHồ Lợi
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Hồ Lợi
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++Hồ Lợi
 
Epc assignment
Epc assignmentEpc assignment
Epc assignmentHồ Lợi
 
Epc test practical
Epc test practicalEpc test practical
Epc test practicalHồ Lợi
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --thHồ Lợi
 

More from Hồ Lợi (20)

Xu ly chuoi
Xu ly chuoiXu ly chuoi
Xu ly chuoi
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
T4
T4T4
T4
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functions
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequy
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignment
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapc
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitap
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
Giaotrinhbaitapkythuatlaptrinh
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++
 
File trong c_
File trong c_File trong c_
File trong c_
 
Epc assignment
Epc assignmentEpc assignment
Epc assignment
 
Epc test practical
Epc test practicalEpc test practical
Epc test practical
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --th
 
Dethi c++ -lt
Dethi c++ -ltDethi c++ -lt
Dethi c++ -lt
 
D05 stl
D05 stlD05 stl
D05 stl
 
Cpl test3
Cpl test3Cpl test3
Cpl test3
 
Cpl test2
Cpl test2Cpl test2
Cpl test2
 
Cpl test1
Cpl test1Cpl test1
Cpl test1
 

Chuong5 (2)

  • 1. Lập trình hướng đối tượng C++ Giảng viên giảng dạy: Nguyễn Hữu Vân Long
  • 2. Chương 5 Hàm xây dựng & Hàm hủy Hàm xây dựng sao chép 2
  • 3. BM MTT&TT 3  Hàm xây dựng (Constructor)  Hàm hủy (Destructor)  Hàm xây dựng sao chép (Copy constructor)  Đối tượng là dữ liệu thành viên của một lớp Nội dung bài giảng
  • 4. BM MTT&TT 4  Mục đích: dùng để khởi tạo giá trị ban đầu cho đối tượng  Gán giá trị đầu cho các thuộc tính (dữ liệu thành viên)  Cấp vùng nhớ cho con trỏ thành viên. Hàm xây dựng class Diem { int x, y; public: Diem(int a) { x = y = a; } Diem(int h, int t) { x = h; y=t; } …. }; class PhanSo { int tu, mau; public: PhanSo() { tu=0; mau=1; } PhanSo(int x) { tu=x; mau=1; } PhanSo(int t, int m) { tu = t; mau=m; } …. };
  • 5. BM MTT&TT 5  Ví dụ Hàm xây dựng class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; diemtb = 0; } SinhVien(char*,char*,int,float); … }; class Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) { soluong = max; vitri = 0; ds = new float[soluong]; } Stack(float* d, int m, int n); … }; Cấp vùng nhớ cho con trỏ
  • 6. BM MTT&TT 6  Nếu không có định nghĩa hàm xây dựng:  Trình biên dịch sẽ tự động thêm vào 1 hàm xây dựng không đối số => Hàm xây dựng mặc nhiên.  Viêc khởi tạo đối tượng không tham số đầu chỉ có 1 cách duy nhất. Hàm xây dựng 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 … … … a x y 1000H void main() { Diem a; Diem *pa = new Diem(); Diem ds1[10]; Diem *ds2 = new Diem[20]; … } Không có giá trị đầu nên dễ gây ra hiệu ứng phụ
  • 7. BM MTT&TT 7  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.  Chú ý: Trường hợp sử dụng đối số mặc nhiên trong hàm xây dựng Hàm xây dựng void main() { PhanSo a; PhanSo b(3); PhanSo c(2,5); PhanSo d[3]; PhanSo *pa = new PhanSo; PhanSo *pa1 = new PhanSo(); PhanSo *pa2 = new PhanSo[5]; PhanSo *pb = new PhanSo(3); PhanSo *pc = new PhanSo(2,5); … } void main() { Stack a; Stack b(5); Stack c[5]; Stack *pa = new Stack(); Stack *pb = new Stack(40); Stack *pc = new Stack[40]; float data[40]; for(int i=0;i<10;i++) data[i]=i; Stack d(data, 30, 10); … }
  • 8. BM MTT&TT 8  Trình tự tạo 1 đối tượng:  Vùng nhớ dành cho đối tượng được cấp phát (tạo ra) trước.  Hàm xây dựng được gọi để khởi tạo giá trị cho các dữ liệu thành viên của đối tượng mới. Hàm xây dựng c tu mau 2 5 c tu mau PhanSo c(2,5); PhanSo *pa2 = new PhanSo[5]; tu mau 1000H *pa2 1000 tu mau 1000H *pa2 1000 0 1 0 1 0 1 0 1 0 1 0 1200 5 *ds soluong vitri 1200H Stack b(5); *ds soluong vitri … … …
  • 9. BM MTT&TT 9  Mục đích: thu hồi các nguồn tài nguyên đang sử dụng bởi đối tượng trước khi đối tượng bị hủy  Thu hồi vùng nhớ đã cấp phát cho con trỏ  delete con trỏ  Đóng các nguồn tài nguyên đang mở (tập tin) Hàm hủy class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; diemtb = 0; } ~SinhVien() { delete[] hoten; } … }; class Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) { soluong = max; vitri = 0; ds = new float[soluong]; } ~Stack() { delete[] ds; } … };
  • 10. BM MTT&TT 10  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 hủy 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 hủy được gọi cho a trước khi kết thúc hàm HamMinhHoa() Hàm xây dựng được gọi
  • 11. BM MTT&TT 11  Mục đích: dùng để tạo 1 đối tượng từ 1 đối tượng đã tồn tại. Được gọi trong các trường hợp:  Đối số của hàm là một đối tượng.  Trị trả về của hàm là 1 đối tượng.  Khởi tạo đối tượng từ một đối tượng đã có sẵn. Hàm xây dựng sao chép class Diem { int x,y; public: Diem(int h=0, int t=0) { x = h; y = t; } Diem doixung() { return Diem(-x,-y); } char* trung(Diem d) { if(x==d.x && y==d.y) return “Trung”; return “Ko trung”; } }; Diem a(1, 2), b, c(a); b = a.doixung(); cout << a.trung(b);
  • 12. BM MTT&TT 12  Trong cả 3 trường hợp trên, có 1 đối tượng mới được tạo ra từ một đối tượng có sẵn  Diem c(a): tạo đối tượng c “giống” đối tượng a.  b = a.doixung(): một đối tượng “tạm” “giống” với đối tượng Diem(-x,-y) trong hàm doixung() được tạo ra bên trong hàm main() để gán cho b.  a.trung(b): đối tượng d, là tham số hình thức của hàm trung() được tạo ra “giống” với đối tượng b, là tham số thực tế trong hàm main().  Khi đó, hàm xây dựng sao chép của các đối tượng “mới” sẽ được gọi để sao chép dữ liệu. Hàm xây dựng sao chép
  • 13. BM MTT&TT 13  Nếu lớp không có hàm xây dựng sao chép  Trình biên dịch sẽ tự động thêm vào cho lớp một hàm xây dựng sao chép mặc nhiên.  Hàm này sẽ thực hiện gán tuần tự từng thuộc tính của đối tượng mới bằng (“=“) với từng thuộc tính tương ứng của đối tượng có sẵn.  Có thể bị sai nếu lớp có dữ liệu thành viên là con trỏ. Hàm xây dựng sao chép Chú ý: Phân biệt giữa trường hợp thực hiện phép gán (“=“) với trường hợp gọi hàm xây dựng sao chép. Diem a(1,2), b, c(a); //gọi hàm XDSC cho c b = a; //thực hiện phép gán cho b
  • 14. BM MTT&TT 14 Hàm xây dựng sao chép Stack a(5); //gán dữ liệu cho Stack a ... Stack b(a); //tạo b giống a a ds:1000 soluong:5 vitri:3 b ds: soluong: vitri: Diem a(1,2); Diem b(a); // tạo b giống a a x:1 y:2 b x: y: = = = = = 1 2 1000 5 3
  • 15. BM MTT&TT 15  Cú pháp: <Tên lớp> (const <Tên lớp>& <tên tham số> ) { 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ỏ).  Đối với dữ liệu thành viên là con trỏ: Cấp phát vùng nhớ và sao chép nội dung vùng nhớ quản lý bởi con trỏ 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; } Hàm xây dựng sao chép
  • 16. BM MTT&TT 16 Hàm xây dựng sao chép class Diem { int x, y; public: Diem(int x=0, int y=0) { this->x = x; this->y = y; cout << “nXD ” << this; } Diem(const Diem& d) { x = d.x; y = d.y; cout << "nXDSC: " << this; } Diem doixung() { Diem kq(-x,-y); return kq; } ... }; void main() { Diem a(1,2); Diem b(a), c; c = a.doixung(); cout << "na: " << &a; cout << "nb: " << &b; cout << "nc: " << &c; } Đây cũng chính là nội dung hàm XDSC mặc nhiên
  • 17. BM MTT&TT 17 Hàm xây dựng sao chép 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; } … }; *hoten namsinh diemtb 1240 1974 8.14 N g u y e n … … 1240H 91 02 98 01mssv[] *hoten namsinh diemtb 2760 1974 8.14 91 02 98 01mssv[] N g u y e n … … 2760H copy SinhVien x(nva); SinhVien nva; …
  • 18. BM MTT&TT 18 Hàm xây dựng sao chép 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<vitri; i++) ds[i]=s.ds[i]; } … }; *ds soluong vitri 1300 8 3 4 3.2 1.4 … … … … … 1300H a Stack a(8); … Stack b(a); *ds soluong vitri 1570 8 3 4 3.2 1.4 … … … … … 1570H b copy
  • 19. BM MTT&TT 19  Giới thiệu  Lớp là một kiểu dữ liệu do người dùng định nghĩa => Dữ liệu thành viên của một lớp có thể là 1 ĐT.  Đây là một cách sử dụng lại mã (reusability), trong đó quan hệ giữa lớp sử dụng lại và lớp được sử dụng là quan hệ “có” hay “bao gồm”. (Cần phân biệt với tính kế thừa, quan hệ “là”). Đối tượng là dữ liệu thành viên
  • 20. BM MTT&TT 20  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. Đối tượng là dữ liệu thành viên Sử dụng lại 1 lớp, nhưng không phải là thừa kế class Diem { int x, y; public : Diem(); Diem(int , int); void Nhap(); void Hien(); void DoiDiem(int,int); int GiaTriX(); int GiaTriY(); }; class DuongTron { Diem tam; int bankinh; public: DuongTron(); ... void Ve(); void Nhap(); void DoiDTron(int,int); float ChuVi(); float DienTich(); };
  • 21. BM MTT&TT 21  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 đối tượng (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ý. Đối tượng là dữ liệu thành viên void DuongTron :: Ve() { cout<<“Tam : “; tam.Hien(); cout<<endl; cout<<“Ban kinh : “<<bankinh<<endl; } void DuongTron :: Nhap() { cout<<“Nhap tam : “<<endl; tam.Nhap(); cout<<“Nhap ban kinh : “; cin>>bankinh; } void DuongTron :: DoiDTron(int dx, int dy) { tam.DoiDiem(dx, dy); } 7 10 20 tam bankinh x y DuongTron a;
  • 22. BM MTT&TT 22  Hàm xây dựng của đối tượng là dữ liệu thành viên  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 đó: <prototype hàm XD> : <tên ĐT>(tsố) {…}      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. Đối tượng là dữ liệu thành viên 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;} Duongtron(): tam(), bankinh(0) {} Duongtron(Diem d, int bk) : tam(d), bankinh(bk) {}