N i dung<br />
• Hàm xây d ng<br />
<br />
Chương 5<br />
<br />
HÀM XÂY D NG, HÀM H Y VÀ<br />
VI C KH I T O ð I TƯ NG<br />
<br />
• Hàm h y<br />
• Hàm xây d ng sao chép<br />
• Thu c tính c a 1 l p là ñ i tư ng<br />
<br />
1<br />
<br />
2<br />
<br />
Hàm xây d ng<br />
<br />
Hàm xây d ng<br />
<br />
• M c ñích: kh i t o giá tr ban ñ u cho ñ i tư ng<br />
<br />
• Ví d :<br />
<br />
– Gán giá tr ñ u cho các thu c tính.<br />
– C p vùng nh cho con tr thành viên.<br />
class Diem {<br />
int x, y;<br />
public:<br />
Diem(int a)<br />
{ x = y = a; }<br />
Diem(int h, int t)<br />
{ x = h; y=t; }<br />
….<br />
};<br />
<br />
class PhanSo {<br />
int tu, mau;<br />
public:<br />
PhanSo()<br />
{ tu=0; mau=1; }<br />
PhanSo(int x)<br />
{ tu=x; mau=1; }<br />
PhanSo(int t, int m)<br />
{ tu = t; mau=m; }<br />
….<br />
};<br />
3<br />
<br />
class SinhVien {<br />
class Stack {<br />
char mssv[8];<br />
float *ds;<br />
char* hoten;<br />
int soluong;<br />
int namsinh;<br />
int vitri;<br />
float diemtb;<br />
public:<br />
public:<br />
Stack(int max = 10)<br />
C p vùng nh<br />
SinhVien() {<br />
{<br />
cho con tr<br />
strcpy(mssv,””);<br />
soluong = max;<br />
hoten = new char[50];<br />
vitri = 0;<br />
namsinh = 1980;<br />
ds = new<br />
float[soluong];<br />
diemtb = 0;<br />
}<br />
}<br />
SinhVien(char*,char*,int,fl<br />
Stack(float* d, int m,<br />
int n);<br />
oat);<br />
…<br />
…<br />
};<br />
};<br />
4<br />
<br />
Hàm xây d ng<br />
<br />
Hàm xây d ng<br />
<br />
• N u không có ñ nh nghĩa hàm xây d ng:<br />
<br />
• N u có ñ nh nghĩa ít nh t 1 hàm xây d ng:<br />
<br />
– M c nhiên s t ñ ng có 1 hàm xây d ng không tham s .<br />
– Ch có 1 cách kh i t o ñ i tư ng theo d ng không tham s .<br />
class Diem {<br />
int x, y;<br />
public:<br />
void InDiem();<br />
void NhapDiem();<br />
void GanGiaTri(int,<br />
int);<br />
int<br />
GiaTriX();<br />
int<br />
GiaTriY();<br />
…<br />
};<br />
// ð nh nghĩa các hàm<br />
thành viên<br />
...<br />
<br />
void main() {<br />
Diem<br />
a;<br />
Diem<br />
*pa = new Diem();<br />
Diem<br />
ds1[10];<br />
Diem<br />
*ds2 = new<br />
Diem[20];<br />
…<br />
}<br />
x<br />
y<br />
<br />
…<br />
…<br />
a<br />
<br />
1000H<br />
<br />
Không có giá tr<br />
ñ u<br />
nên d gây ra<br />
hi u ng ph<br />
5<br />
<br />
Hàm xây d ng<br />
– Hàm xây d ng s g i sau trên ñ i tư ng.<br />
tu<br />
mau<br />
<br />
PhanSo c(2,5);<br />
<br />
tu<br />
1000 mau<br />
*pa2<br />
<br />
2<br />
5<br />
c<br />
1000H<br />
tu 0 0 0 0 0<br />
1000<br />
mau 1 1 1 1 1<br />
*pa2<br />
tu<br />
mau<br />
<br />
c<br />
1000H<br />
<br />
1200H<br />
Stack<br />
b(5);<br />
<br />
*ds<br />
soluong<br />
vitri<br />
<br />
void main() {<br />
void main() {<br />
PhanSo a;<br />
Stack a;<br />
PhanSo b(3);<br />
Stack b(5);<br />
PhanSo c(2,5);<br />
Stack c[5];<br />
PhanSo d[3];<br />
Stack *pa = new Stack();<br />
PhanSo *pa = new PhanSo;<br />
Stack *pb = new Stack(40);<br />
PhanSo *pa1 = new PhanSo();<br />
Stack *pc = new Stack[40];<br />
PhanSo *pa2 = new PhanSo[5]; float data[40];<br />
PhanSo *pb = new PhanSo(3);<br />
for(int i=0;i delete con tr .<br />
<br />
class SinhVien {<br />
char mssv[8];<br />
char* hoten;<br />
int<br />
namsinh;<br />
float diemtb;<br />
public:<br />
SinhVien() {<br />
strcpy(mssv,””);<br />
hoten = new char[50];<br />
namsinh = 1980;<br />
diemtb = 0;<br />
}<br />
~SinhVien() {<br />
delete[] hoten;<br />
}<br />
…<br />
};<br />
<br />
class Stack {<br />
float *ds;<br />
int<br />
soluong;<br />
int<br />
vitri;<br />
public:<br />
Stack(int<br />
max = 10) {<br />
soluong = max;<br />
vitri = 0;<br />
ds = new<br />
float[soluong];<br />
}<br />
~Stack() {<br />
delete[] ds; }<br />
…<br />
8<br />
};<br />
<br />
Hàm h y<br />
<br />
Hàm xây d ng sao chép<br />
<br />
• Th t th c hi n: g i trư c khi h y ñ i tư ng:<br />
– K t thúc 1 hàm mà trong ñó ta có kh i t o ñ i tư ng.<br />
<br />
• T i sao c n hàm xây d ng sao chép?<br />
– Kh i t o 1 ñ i tư ng có giá tr gi ng 1 ñ i tư ng khác.<br />
<br />
– Thu h i vùng nh cho con tr ñ i tư ng.<br />
<br />
– Khác v i phép gán (d u =)<br />
<br />
Hàm xây d ng ñư c g i<br />
void HamMinhHoa() {<br />
Stack a;<br />
Stack *pa = new Stack(8);<br />
…<br />
delete pa;<br />
Stack *pb = new Stack[5];<br />
…<br />
delete[] pb;<br />
pb = new Stack(20);<br />
…<br />
}<br />
<br />
• N u không ñ nh nghĩa hàm xây d ng sao chép:<br />
<br />
Hàm h y ñư c g i cho<br />
ñ i tư ng mà pa ñang tr t i<br />
<br />
– Ngôn ng s t ñ ng t o ra cho ta: n i dung là gán (=)<br />
tương ng t ng thành ph n.<br />
<br />
Hàm xây d ng ñư c g i 5 l n<br />
<br />
– Không chính xác khi có d li u thành viên là con tr .<br />
<br />
Hàm h y ñư c g i 5 l n<br />
Hàm xây d ng ñư c g i<br />
Hàm h y ñư c g i cho a<br />
trư c khi k t thúc hàm<br />
HamMinhHoa() 9<br />
<br />
Hàm xây d ng sao chép<br />
<br />
10<br />
<br />
Hàm xây d ng sao chép<br />
• Cú pháp: (const &<br />
const<br />
&<br />
<br />
Stack a(8);<br />
…<br />
<br />
*ds 1300<br />
8<br />
soluong<br />
3<br />
vitri<br />
a<br />
<br />
Stack b(a);<br />
<br />
{ N i dung hàm }<br />
<br />
1300H<br />
4<br />
<br />
*ds 1300<br />
8<br />
soluong<br />
3<br />
vitri<br />
b<br />
<br />
)<br />
<br />
3.2<br />
<br />
1.4<br />
<br />
…<br />
<br />
VD: Diem(const Diem& d) { … }<br />
Stack(const Stack& s) { … }<br />
<br />
2 con tr s tr<br />
cùng 1 ñ a ch<br />
n u không<br />
ñ nh nghĩa<br />
hàm xây d ng<br />
sao chép<br />
<br />
SinhVien(const SinhVien& sv) { … }<br />
• N i dung:<br />
– Gán tương ng các thành ph n d li u (không là con tr ).<br />
– C p vùng nh và sao chép n i dung vùng nh t ñ i tư ng<br />
cho trư c.<br />
VD: Diem(const Diem& d) { x=d.x; y=d.y; }<br />
PhanSo(const PhanSo& p) { tu=p.tu;<br />
mau=p.mau; }<br />
<br />
12<br />
<br />
Hàm xây d ng sao chép<br />
<br />
Hàm xây d ng sao chép<br />
<br />
• Ví d :<br />
<br />
• Ví d :<br />
SinhVien nva; …<br />
<br />
class SinhVien {<br />
char<br />
mssv[8];<br />
char* hoten;<br />
int<br />
namsinh;<br />
float<br />
diemtb;<br />
public:<br />
…<br />
SinhVien(const SinhVien& s){<br />
strcpy(mssv, s.mssv);<br />
hoten = new char[50];<br />
strcpy(hoten, s.hoten);<br />
namsinh = s.namsinh;<br />
diemtb = s.diemtb;<br />
}<br />
…<br />
};<br />
<br />
1 9 2 0 8 9 1 \0<br />
1240<br />
1974<br />
8.14<br />
<br />
mssv[]<br />
*hoten<br />
namsinh<br />
diemtb<br />
<br />
1240H<br />
N<br />
<br />
g<br />
<br />
u<br />
<br />
y<br />
<br />
e<br />
<br />
n<br />
<br />
2760H<br />
N<br />
<br />
g<br />
<br />
…<br />
<br />
…<br />
<br />
copy<br />
u<br />
<br />
y<br />
<br />
e<br />
<br />
n<br />
<br />
1 9 2 0 8 9 1 \0<br />
2760<br />
1974<br />
8.14<br />
<br />
SinhVien x(nva);<br />
<br />
…<br />
<br />
…<br />
<br />
mssv[]<br />
*hoten<br />
namsinh<br />
diemtb<br />
<br />
class Stack {<br />
Stack a(8); …<br />
float<br />
*ds;<br />
*ds 1300<br />
1300H<br />
int<br />
soluong;<br />
4 3.2 1.4 …<br />
…<br />
soluong 8<br />
int<br />
vitri;<br />
3<br />
vitri<br />
public:<br />
a<br />
…<br />
copy<br />
Stack(const Stack& s) {<br />
soluong = s.soluong;<br />
*ds 1570<br />
vitri = s.vitri;<br />
4 3.2 1.4 …<br />
…<br />
soluong 8<br />
ds = new float[soluong];<br />
1570H<br />
3<br />
vitri<br />
for(int i=0; i