
HÀM XÂY DNG, HÀM HY VÀ HÀM XÂY DNG, HÀM HY VÀ
VV
II
C C
KHI TO ðI TƯNGKHI TO ðI TƯNG
Chương 5
VV
II
C C
KHI TO ðI TƯNGKHI TO ðI TƯNG
1
Ni dungNi dung
• Hàm xây dng
• Hàm hy
• Hàm xây dng sao chép
•
Thuc tính ca 1 lp là ñi tưng
•
Thuc tính ca 1 lp là ñi tưng
2
Hàm xây dngHàm xây dng
•Mc ñích: khi to giá tr ban ñu cho ñi tưng
– Gán giá tr ñu cho các thuc tính.
– Cp vùng nh cho con tr thành viên.
class Diem {
int
x, y;
class PhanSo {
int
tu, mau;
3
int
x, y;
public:
Diem(int a)
{ x = y = a; }
Diem(int h, int t)
{ x = h; y=t; }
….
};
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; }
….
};
•Ví d:
class SinhVien {
char mssv[8];
char* hoten;
int namsinh;
float diemtb;
public
:
class Stack {
float *ds;
int soluong;
int vitri;
public:
Stack
(
int
max = 10)
HàmHàm xâyxây dngdng
Cp vùng nh
4
public
:
SinhVien() {
strcpy(mssv,””);
hoten = new char[50];
namsinh = 1980;
diemtb = 0;
}
SinhVien(char*,char*,int,fl
oat);
…
};
Stack
(
int
max = 10)
{
soluong = max;
vitri = 0;
ds = new
float[soluong];
}
Stack(float* d, int m,
int n);
…
};
Cp vùng nh
cho con tr

•Nu không có ñnh nghĩa hàm xây dng:
– Mc nhiên s t ñng có 1 hàm xây dng không tham s.
– Ch có 1 cách khi to ñi tưng theo dng không tham s.
class Diem {
int x, y;
public
:
void main() {
Diem a;
Diem *pa = new Diem();
Hàm xây dngHàm xây dng
5
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
Diem *pa = new Diem();
Diem ds1[10];
Diem *ds2 = new
Diem[20];
…
}
Không có giá tr
ñu
nên d! gây ra
hiu ng ph
•Nu có ñnh nghĩaít nht 1 hàm xây dng:
– Có bao nhiêu hàm xây dng s có by nhiêu cách khi to
ñi tưng theo dng ñã ñnh nghĩa.
void main() {
PhanSo a;
PhanSo b(3);
void main() {
Stack a;
Stack b(5);
Hàm xây dngHàm xây dng
6
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);
…
}
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);
…
}
•Trình t thc hin:
–ði tưng ñưc to ra trưc.
– Hàm xây dng s gi sau trên ñi tưng.
tu
mau
22
55
tu
mau
PhanSo c(2,5);
Hàm xây dngHàm xây dng
7
c
mau
55
c
mau
PhanSo
*pa2 = new
PhanSo[5];
tu
mau
1000H
*pa2
1000 tu
mau
1000H
*pa2
1000 0
10
10
10
10
1
0
1200
5
*ds
soluong
vitri
1200H
Stack
b(5);
*ds
soluong
vitri
…
…
…
Hàm hyHàm hy•Mc ñích: thu hi vùng nh ñã cp cho con
tr là d liu thành viên => delete con tr.
class SinhVien {
char mssv[8];
char* hoten;
int namsinh;
float diemtb;
public
:
class Stack {
float *ds;
int soluong;
int vitri;
public:
8
public
:
SinhVien() {
strcpy(mssv,””);
hoten = new char[50];
namsinh = 1980;
diemtb = 0; }
~SinhVien() {
delete[] hoten; }
…
};
Stack(int max = 10) {
soluong = max;
vitri = 0;
ds = new
float[soluong];
}
~Stack() {
delete[] ds; }
…
};

•Th t thc hin: gi trưc khi hy ñi tưng:
– Kt thúc 1 hàm mà trong ñó ta có khi to ñi tưng.
– Thu hi vùng nh cho con tr ñi tưng.
void HamMinhHoa() {
Stack a;
Hàm xây d(ng ñư+c g,i
Hàm
h-y
ñư+c
g,i
cho
Hàm hyHàm hy
9
Stack a;
Stack *pa = new Stack(8);
…
delete pa;
Stack *pb = new Stack[5];
…
delete[] pb;
pb = new Stack(20);
…
}
Hàm
h-y
ñư+c
g,i
cho
ñ.i tư+ng mà pa pa ñang tr0 t1i
Hàm xây d(ng ñư+c g,i 5 l3n5 l3n
Hàm h-y ñư+c g,i 5 l3n5 l3n
Hàm h-y ñư+c g,i cho a a
trư1c khi k4t thúc hàm
HamMinhHoa()
Hàm xây d(ng ñư+c g,i
Hàm xây dng sao chépHàm xây dng sao chép
•Ti sao cn hàm xây dng sao chép?
– Khi to 1 ñi tưng có giá tr ging 1 ñi tưng khác.
– Khác vi phép gán (du =)
•Nukhông ñnh nghĩahàm xây dng sao chép:
–
Ngôn ng s t ñng to ra cho ta: ni dung là gán (=)
–
Ngôn ng s t ñng to ra cho ta: ni dung là gán (=)
tương ng tng thành phn.
–Không chính xác khi có d liu thành viên là con tr.
10
Hàm xây dng sao chépHàm xây dng sao chép
*ds
soluong
vitri
1300
8
3
4 3.2 1.4 …
1300H
Stack a(8);
…
a
*ds
1300
8
2 con tr0 s; tr0
Stack b(a);
*ds
soluong
vitri
8
3
b
cùng 1 ñ=a ch>
n4u không
ñ=nh nghĩa
hàm xây d(ng
sao chép
•Cú pháp:<Tên lp> (constconst <Tên lp>&& )
{ Ni dung hàm }
VD: Diem(const Diem&d) { … }
Stack(const Stack&s) { … }
SinhVien
(
const
SinhVien
&
sv
) { … }
Hàm xây dng sao chépHàm xây dng sao chép
SinhVien
(
const
SinhVien
&
sv
) { … }
•Ni dung:
– Gán tương ng các thành phn dliu (không là con tr).
– Cp vùng nhvà sao chép ni dung vùng nht ñ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

•Ví d:
class SinhVien {
char mssv[8];
char* hoten;
int namsinh;
float diemtb;
public
:
*hoten
namsinh
diemtb
1240
1974
8.14
1240H
SinhVien nva; …
91 02 98 \0
1mssv[]
Hàm xây dng sao chépHàm xây dng sao chép
13
public
:
…
SinhVien(const SinhVien&s){
strcpy(mssv, s.mssv);
hoten = new char[50];
strcpy(hoten, s.hoten);
namsinh = s.namsinh;
diemtb = s.diemtb;
}
…
};
N g u y e n … …
1240H
2760
1974
8.14
91 02 98 \0
1
N g u y e n … …
2760H copy
SinhVien x(nva);
*hoten
namsinh
diemtb
mssv[]
•Ví d:
class Stack {
float *ds;
int soluong;
int vitri;
public:
…
*ds
soluong
vitri
1300
8
3
4 3.2 1.4 … …
1300H
a
Stack a(8); …
Hàm xây dng sao chépHàm xây dng sao chép
14
…
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];
}
…
};
a
Stack b(a);
1570
8
3
4 3.2 1.4 … …
1570H
b
copy
*ds
soluong
vitri
•S dng trong các trưng hp:
–ði tưng ñưc truyn theo giá trca ñi s 1 hàm.
– Tr tr vca hàm là 1 ñi tưng.
– To ra 1 ñi tưng có giá tr ging 1 ñi tưng cho trưc.
class AA {
int
x;
AA HamThu(AA x) {
Hàm xây dng sao chépHàm xây dng sao chép
15
int
x;
public:
AA() { x=0; }
AA(const A&A& a) {
x=a.x;
}
void Hien() {
cout<<“x=“<<x;
}
};
AA y(x);
return y;
}
void main() {
A a,b;
b = HamThu(a);
A c = b;
A *d = new A(c);
}
Có bao
nhiêu hàm
xây d1ng
sao chép
ñư5c g6i?
Thuc tính ca 1 lp là ñi tưngThuc tính ca 1 lp là ñi tưng
•Gii thiu:
– Thuc tính ca 1 lp có th có kiu bt kỳ.
– Thuc tính ca 1 lp có th là ñi tưng ca 1 lp khác.
SH dng lIi 1 lp, nhưng khôngkhông phJiphJi làlà thKathKa k4k4
class
Diem
{
class
DuongTron
{
16
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();
};

•Cách truy xut:
– Khi truy xut ñn thuc tính là ñi tưng, phi thông qua
tên ca thuc tính.
– Lưu ý ñn thuc tính truy c p(public, private, …) ca
thành phn d liu và hàm thành viên ca lp to ra ñi
tưng ñó ñ truy xut hp lý.
Thuc tính ca 1 lp là ñi tưngThuc tính ca 1 lp là ñi tưng
tưng ñó ñ truy xut hp lý.
Void DuongTron::Ve() {
cout<<“Tam : “;
tam.Hien();
cout<<endl;
cout<<“Ban kinh : “
<<bankinh<<endl;
}
Void
DuongTron
::Nhap() {
7
10
20
tam
bankinh
x
y
DuongTron a;
Thuc tính ca 1 lp là ñi tưngThuc tính ca 1 lp là ñi tưng
18
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);
}
•Hàm xây dng:
– Phi khi to cho thuc tính là ñi tưng theo dng
hàm xây dng ca lp ñó.
DuongTron() : tam()
{ bankinh=0; }
Thuc tính ca 1 lp là ñi tưngThuc tính ca 1 lp là ñi tưng
19
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;}
•Hàm xây dng:
Nu có nhiu thuc tính là ñi tưng, khi to các ñi
tưng này liên tip nhau thông qua du ph!y (,).
Cú pháp này cho phép áp d"ng c vi thuc tính
thư#ng.
Thuc tính ca 1 lp là ñi tưngThuc tính ca 1 lp là ñi tưng
20
Duongtron():tam(), bankinh(0)
{}
Duongtron(Diem d, int bk) :tam(d), bankinh(bk)
{}

