VòngVòng
đờiđời
đốiđối
tượngtượng
GV. GV. NguyễnNguyễn Minh Minh HuyHuy
VòngVòng
đờiđời
đốiđối
tượngtượng
1Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
PhươngPhương thứcthức khởikhởi tạotạo
PhươngPhương thứcthức hủyhủy
ThànhThành phầnphần tĩnhtĩnh
Class Template.Class Template.
2Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
PhươngPhương thứcthức khởikhởi tạotạo
PhươngPhương thứcthức hủyhủy
ThànhThành phầnphần tĩnhtĩnh
Class Template.Class Template.
3Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
PhươngPhương thứcthức khởikhởi tạotạo
VấnVấn đềđề khởikhởi tạotạo thôngthông tin tin đốiđối tượngtượng::
GiáGiá trịtrị ban ban đầuđầu củacủa thuộcthuộc tínhtính??
class class PhanSoPhanSo
{{
private:private:
intint m_tum_tu;;
intint
m_maum_mau
;;
void void mainmain()()
{{
PhanSoPhanSo p;p;
// // GiáGiá trịtrị củacủa p??p??
}}
intint
m_maum_mau
;;
};};
KhởiKhởi tạotạo bằngbằng phươngphương thứcthức truytruy xuấtxuất
class class PhanSoPhanSo
{{
public:public:
void void ganTuganTu((intint tutu););
void void ganMauganMau((intint maumau););
};};
4Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
}}
void void mainmain()()
{{
PhanSoPhanSo p;p;
p.ganTup.ganTu(1);(1);
p.ganMaup.ganMau(3);(3);
}}
PhươngPhương thứcthức khởikhởi tạotạo
VấnVấn đềđề khởikhởi tạotạo thôngthông tin tin đốiđối tượngtượng::
NhượcNhược điểmđiểm củacủa phươngphương thứcthức truytruy xuấtxuất::
Vi Vi phạmphạm ““tínhtính chấtchất hộphộp đenđen”.”.
NgườiNgười dùngdùng quênquên gọigọi
““LàmLàm khaikhai sinhsinh” ” chocho đốiđối tượngtượng
PhươngPhương
thứcthức
khởikhởi
tạotạo
PhươngPhương
thứcthức
khởikhởi
tạotạo
5Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
PhươngPhương thứcthức khởikhởi tạotạo
TínhTính chấtchất phươngphương thứcthức khởikhởi tạotạo::
BắtBắt buộcbuộc gọigọi khikhi khaikhai báobáo đốiđối tượngtượng
CóCó thểthể nạpnạp chồngchồng nhiềunhiều phươngphương thứcthức
KhôngKhông cócó giágiá trịtrị trảtrả vềvề
CóCó têntên trùngtrùng têntên lớplớp ((trongtrong C++).C++).
class class PhanSoPhanSo
{{
private:private:
intint m_tum_tu;;
intint m_maum_mau;;
public:public:
PhanSoPhanSo((intint tutu, , intint maumau););
PhanSoPhanSo((intint giaTrigiaTri););
};};
6Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
void void mainmain()()
{{
PhanSoPhanSo p1(1, 2p1(1, 2););
PhanSoPhanSo p2(1, p2(1, 33););
PhanSoPhanSo *p3 = new *p3 = new PhanSoPhanSo(2, 3(2, 3););
}s}s
PhươngPhương thứcthức khởikhởi tạotạo
PhươngPhương thứcthức khởikhởi tạotạo mặcmặc địnhđịnh::
““LàmLàm khaikhai sinhsinh” ” mặcmặc địnhđịnh chocho đốiđối tượngtượng
KhôngKhông cócó thamtham sốsố
NếuNếu lớplớp khôngkhông cócó phươngphương thứcthức khởikhởi tạotạo
TrìnhTrình biênbiên dịchdịch tựtự cấpcấp
class class PhanSoPhanSo
{{
private:private:
intint m_tuSom_tuSo;;
intint m_mauSom_mauSo;;
public:public:
PhanSoPhanSo();();
};};
7Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
void void mainmain()()
{{
PhanSoPhanSo p;p;
PhanSoPhanSo *q = new *q = new PhanSoPhanSo;;
}}
PhươngPhương thứcthức khởikhởi tạotạo
PhươngPhương thứcthức khởikhởi tạotạo saosao chépchép::
““LàmLàm khaikhai sinhsinh” ” bằngbằng saosao chépchép đốiđối tượngtượng kháckhác
ThamTham sốsố làlà đốiđối tượngtượng cùngcùng lớplớp
LuônLuôn tồntồn tạitại trongtrong lớplớp ((trìnhtrình biênbiên dịchdịch cấpcấp).).
class class PhanSoPhanSo
{{
void void mainmain()()
{{
{{
private:private:
intint m_tuSom_tuSo;;
intint m_mauSom_mauSo;;
public:public:
PhanSoPhanSo(const (const PhanSoPhanSo &p);&p);
};};
8Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
{{
PhanSoPhanSo p1(1, 2p1(1, 2););
PhanSoPhanSo p2(p1p2(p1););
PhanSoPhanSo p3 = p2p3 = p2;;
}}
PhươngPhương thứcthức khởikhởi tạotạo
Dr. Guru Dr. Guru khuyênkhuyên::
MộtMột lớplớp nênnên cócó tốitối thiểuthiểu 3 3 phươngphương thứcthức khởikhởi tạotạo::
KhởiKhởi tạotạo mặcmặc địnhđịnh
KhởiKhởi tạotạo saosao chépchép
KhởiKhởi tạotạo vớivới đầyđầy đủđủ thôngthông tin.tin.
class class
PhanSoPhanSo
class class
PhanSoPhanSo
{{
private:private:
intint m_tum_tu;;
intint m_maum_mau;;
public:public:
PhanSoPhanSo();();
PhanSoPhanSo(const (const PhanSoPhanSo &p);&p);
PhanSoPhanSo((intint tutu, , intint maumau););
};};
9Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
PhươngPhương thứcthức khởikhởi tạotạo
PhươngPhương thứcthức hủyhủy
ThànhThành phầnphần tĩnhtĩnh
10Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
PhươngPhương thứcthức hủyhủy
VấnVấn đềđề ròrò rỉrỉ bộbộ nhớnhớ (memory leak):(memory leak):
BộBộ nhớnhớ cấpcấp chocho con con trỏtrỏ khôngkhông tựtự đượcđược thuthu hồihồi
LàmLàm saosao thuthu hồihồi??
XâyXây dựngdựng phươngphương thứcthức thuthu hồihồi
NgườiNgười dùngdùng quênquên gọigọi
““
LàmLàm
didi
chúcchúc
” ”
chocho
đốiđối
tượngtượng
HocSinh
Họ tên
Điểm
văn
““
LàmLàm
didi
chúcchúc
” ”
chocho
đốiđối
tượngtượng
PhươngPhương thứcthức hủyhủy
class class HocSinhHocSinh
{{
private:private:
charchar **m_hoTenm_hoTen;;
public:public:
void void thuHoiBoNhothuHoiBoNho() { () {
delete delete m_hoTenm_hoTen; }; }
};};
11Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Điểm
văn
Điểm toán
void void mainmain()()
{{
HocSinhHocSinh h;h;
h.thuHoiBoNhoh.thuHoiBoNho();();
}}
PhươngPhương thứcthức hủyhủy
TínhTính chấtchất phươngphương thứcthức hủyhủy::
TựTự độngđộng gọigọi khikhi đốiđối tượngtượng bịbị hủyhủy
DuyDuy nhấtnhất chocho mỗimỗi lớplớp
CóCó têntên ~<~<TênTên lớplớp>> ((trongtrong C++).C++).
class class HocSinhHocSinh
{{
void void mainmain()()
{{
{{
private:private:
charchar **m_hoTenm_hoTen;;
floatfloat m_diemVanm_diemVan;;
floatfloat m_diemToanm_diemToan;;
public:public:
~~HocSinhHocSinh() { delete () { delete m_hoTenm_hoTen; }; }
};};
12Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
{{
HocSinhHocSinh h;h;
HocSinhHocSinh *p = *p = new new HocSinhHocSinh;;
delete delete pp;;
}}
NộiNội dungdung
PhươngPhương thứcthức khởikhởi tạotạo
PhươngPhương thứcthức hủyhủy
ThànhThành phầnphần tĩnhtĩnh
Class Template.Class Template.
13Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
ThànhThành phầnphần tĩnhtĩnh
ChiaChia sẻsẻ giữagiữa cáccác đốiđối tượngtượng cùngcùng lớplớp::
MỗiMỗi đốiđối tượngtượng cócó bảnbản saosao riêngriêng::
ThuộcThuộc tínhtính
PhươngPhương thứcthức
ThànhThành phầnphần đốiđối tượngtượng
MuốnMuốn
dùngdùng
chungchung
thôngthông
tin?tin?
PhanSo
Tử số
Mẫu số
MuốnMuốn
dùngdùng
chungchung
thôngthông
tin?tin?
ThànhThành phầnphần tĩnhtĩnh
14Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Rút gọn()
p1: PhanSo
Tử số: 1
Mẫu số: 2
Rút gọn()
p1: PhanSo
Tử số: 1
Mẫu số: 2
Rút gọn()
p2: PhanSo
Tử số: 1
Mẫu số: 3
Rút gọn()
p2: PhanSo
Tử số: 1
Mẫu số: 3
Rút gọn()
ThànhThành phầnphần tĩnhtĩnh
TínhTính chấtchất thànhthành phầnphần tĩnhtĩnh::
ThuộcThuộc tínhtính, , phươngphương thứcthức thuộcthuộc phạmphạm vi vi lớplớp
DùngDùng chungchung chocho mọimọi đốiđối tượngtượng củacủa lớplớp
KhaiKhai báobáo bằngbằng từtừ khóakhóa “static” (“static” (trongtrong C++).C++).
TruyTruy xuấtxuất bằngbằng toántoán tửtử :: (:: (trongtrong C++).C++).
class class PhanSoPhanSo
{{
private:private:
static static intint m_giaTriLNm_giaTriLN;;
public:public:
static static intint layGiaTriLNlayGiaTriLN();();
private:private:
intint m_tum_tu;;
intint m_maum_mau;;
};};
15Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
PhanSoPhanSo::::m_giaTriLNm_giaTriLN = = 10000;10000;
void void mainmain()()
{{
intint x x = = PhanSoPhanSo::::layGiaTriLNlayGiaTriLN();();
}}
NộiNội dungdung
PhươngPhương thứcthức khởikhởi tạotạo
PhươngPhương thứcthức hủyhủy
ThànhThành phầnphần tĩnhtĩnh
Class Template.Class Template.
16Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Class TemplateClass Template
XétXét lớplớp mảngmảng::
CácCác phầnphần tửtử làlà sốsố nguyênnguyên
TổngTổng quátquát: : cáccác phầnphần tửtử kiểukiểu bấtbất kỳkỳ
ThamTham sốsố hóahóa thuộcthuộc tínhtính, , phươngphương thứcthức
Class Template.Class Template.
17Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Class TemplateClass Template
CáchCách sửsử dụngdụng Class Template:Class Template:
template <class T>template <class T>
class class MangMang
{{
private:private:
intint m_kichThuocm_kichThuoc;;
TT
**
m_duLieum_duLieu
;;
void main()void main()
{{
MangMang<<intint>> m1(10);m1(10);
intint a = m1.layPhanTu(5);a = m1.layPhanTu(5);
MangMang
<<
PhanSoPhanSo
>>
m2(5);m2(5);
TT
**
m_duLieum_duLieu
;;
public:public:
MangMang((intint kichThuockichThuoc););
TT layPhanTulayPhanTu((intint viTriviTri););
};};
18Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
MangMang
<<
PhanSoPhanSo
>>
m2(5);m2(5);
PhanSoPhanSo p = m2.layPhanTu(2);p = m2.layPhanTu(2);
}}
TómTóm tắttắt
PhươngPhương thứcthức khởikhởi tạotạo::
““LàmLàm khaikhai sinhsinh” ” chocho đốiđối tượngtượng
BắtBắt buộcbuộc gọigọi khikhi khaikhai báobáo
CóCó thểthể nạpnạp chồngchồng
PhươngPhương
thứcthức
hủyhủy
::
PhươngPhương
thứcthức
hủyhủy
::
““LàmLàm didi chúcchúc” ” chocho đốiđối tượngtượng
TựTự độngđộng gọigọi khikhi hủyhủy
CóCó duyduy nhấtnhất mộtmột
19Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
TómTóm tắttắt
ThànhThành phầnphần tĩnhtĩnh::
DùngDùng chungchung chocho đốiđối tượngtượng củacủa lớplớp
KhaiKhai báobáo bằngbằng từtừ khóakhóa “static”.“static”.
TruyTruy xuấtxuất bằngbằng toántoán tửtử ::.::.
Class Template:Class Template:
Class Template:Class Template:
ThamTham sốsố hóahóa kiểukiểu dữdữ liệuliệu thuộcthuộc tínhtính
LưuLưu trữtrữ vàvà xửxử lýlý tổngtổng quátquát trêntrên nhiềunhiều kiểukiểu
20Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 3.1:3.1:
TrangTrang bịbị chocho lớplớp phânphân sốsố nhữngnhững cáchcách khởikhởi tạotạo sausau::
KhởiKhởi tạotạo mặcmặc địnhđịnh phânphân sốsố = 0.= 0.
KhởiKhởi tạotạo vớivới tửtử vàvà mẫumẫu chocho trướctrước
KhởiKhởi tạotạo từtừ giágiá trịtrị nguyênnguyên chocho trướctrước
KhởiKhởi
tạotạo
từtừ
mộtmột
phânphân
sốsố
kháckhác
KhởiKhởi
tạotạo
từtừ
mộtmột
phânphân
sốsố
kháckhác
21Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 3.2:3.2:
TrangTrang bịbị chocho lớplớp họchọc sinhsinh nhữngnhững cáchcách khởikhởi tạotạo vàvà hủyhủy sausau::
KhởiKhởi tạotạo vớivới họhọ têntên vàvà điểmđiểm vănvăn, , toántoán chocho trướctrước
KhởiKhởi tạotạo vớivới họhọ têntên chocho trướctrước, , điểmđiểm vănvăn, , toántoán = 0.= 0.
KhởiKhởi tạotạo từtừ mộtmột họchọc sinhsinh kháckhác
HủyHủy
đốiđối
tượngtượng
họchọc
sinhsinh
, ,
thuthu
hồihồi
bộbộ
nhớnhớ
HủyHủy
đốiđối
tượngtượng
họchọc
sinhsinh
, ,
thuthu
hồihồi
bộbộ
nhớnhớ
22Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 3.3:3.3:
TrangTrang bịbị chocho lớplớp mảngmảng sốsố nguyênnguyên nhữngnhững cáchcách khởikhởi tạotạo vàvà hủyhủy sausau::
KhởiKhởi tạotạo mặcmặc địnhđịnh mảngmảng kíchkích thướcthước = 0.= 0.
KhởiKhởi tạotạo vớivới kíchkích thướcthước chocho trướctrước, , cáccác phầnphần tửtử = 0.= 0.
KhởiKhởi tạotạo từtừ mộtmột mảngmảng intint [ ] [ ] vớivới kíchkích thướcthước chocho trướctrước
KhởiKhởi
tạotạo
từtừ
mộtmột
đốiđối
tượngtượng
mảngmảng
kháckhác
KhởiKhởi
tạotạo
từtừ
mộtmột
đốiđối
tượngtượng
mảngmảng
kháckhác
HủyHủy đốiđối tượngtượng mảngmảng, , thuthu hồihồi bộbộ nhớnhớ
23Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 3.4:3.4:
TrangTrang bịbị chocho lớplớp phânphân sốsố nhữngnhững phươngphương thứcthức sausau::
ĐếmĐếm sốsố lượnglượng phânphân sốsố đượcđược tạotạo rara
TạoTạo vàvà trảtrả vềvề phânphân sốsố vớivới tửtử vàvà mẫumẫu chocho trướctrước
24Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 3.5:3.5:
XâyXây dựngdựng lớplớp mảngmảng kiểukiểu dữdữ liệuliệu bấtbất kỳkỳ
25Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy