Nội dung 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... Khởi tạo đối tượng Hàm xây dựng và vi
Trang 1TS Trần Công Án - 2014
Hàm xây dựng, hàm hủy
CT114 – Lập trình Hướng đối tượng C++
Trang 2Nội dung
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.
Trang 3Hàm xây dựng
Mục đích: dùng để khởi tạo cho đối tượng.
Gán giá trị cho các dữ liệu thành viên.
Cấp phát vùng nhớ cho các con trỏ.
Hàm xây dựng
class PhanSo {
int tu, mau;
public :
PhanSo()
{ tu=0 ; mau=1 ; }
PhanSo( int t, int m)
{ tu=t; mau=m; }
};
class Stack {
float *ds;
int soluong, vitri;
public :
Stack( int n=10 ) {
ds = new float [n];
soluong = n;
vitri = 0 ;
}
};
Trang 4Khởi tạo đối tượng
Hàm xây dựng và việc khởi tạo đối tượng:
Lớp có bao nhiêu hàm xây dựng ⇒ có bấy nhiêu cách tạo đối tượng , trừ trường hợp dùng đối số mặc nhiên.
Nếu lớp không có hàm xây dựng nào, trình biên dịch
sẽ tự động thêm vào 1 hàm xây dựng không đối số
được gọi là hàm xây dựng mặc nhiên
Ví dụ:
Lớp Phanso trong ví dụ trước có 2 hàm xây dựng
⇒ có 2 cách tạo 1 đối tượng Phanso:
Phanso p1; Phanso p2(1, 2);
Lớp Stack có 1 hàm XD, nhưng có 2 cách tạo ĐT
Stack: Stack s; Stack s(20);
Hàm xây dựng
Trang 5Trình tự tạo đối tượng
Vùng nhớ dành cho đối tượng được cấp phát 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
p1
tu:…
mau:…
tu:1 mau:2
ds:…
soluong:…
vitri:…
2 × 2 bytes
s
ds:1000
soluong:5 vitri:0
3 × 2 bytes
1000
5 × 2 bytes
Trang 6Hàm hủy
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 các vùng nhớ đã cấp phát cho các con trỏ;
Đóng các nguồn tài nguyên đang mở (tập tin,…).
Hàm hủy
class PhanSo {
int tu, mau;
public :
PhanSo()
{ tu=0 ; mau=1 ; }
PhanSo( int t, int m)
{ tu=t; mau=m; }
};
class Stack {
float *ds;
int soluong, vitri;
public :
Stack( int n=10 ) {
ds = new float [n];
soluong = n;
vitri = 0 ;
}
};
Trang 7Hàm xây dựng sao chép
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) ;
Trang 8Hàm xây dựng sao chép
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
Trang 9Hàm xây dựng sao chép
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
Trang 10Ví dụ
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
1
3 2
1000
5 × 2 bytes
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
Trang 11Hàm xây dựng sao chép
Cú pháp khai báo:
<tên lớp> ( const <tên lớp>& <tên t.số>);
Tên hàm trùng với tên lớp (giống hàm xây dựng).
Có một đối số là một đối tượng thuộc chính lớp đó
(đối tượng mà ta cần sao chép dữ liệu).
Nội dung hàm:
Gán bằng (“=“) cho từng thuộc tính tương ứng.
Đối với dữ liệu thành viên là con trỏ: cấp phát vùng
và sao chép nội dung vùng nhớ quản lý bởi con trỏ.
Trang 12Ví dụ
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;
}
};
Đây cũng chính là nội dung hàm XDSC mặc nhiên
void main() {
Diem a( 1 , 2 );
Diem b(a), c;
c = a.doixung();
cout << "\na: " << &a;
cout << "\nb: " << &b;
cout << "\nc: " << &c;
}
Trang 13Ví dụ
Hàm xây dựng sao chép
class Stack {
float * ds;
int sluong, vtri;
public :
Stack( int sl= 10 ) {
ds = new float [sl];
sluong = sl; vtri = 0 ;
}
Stack( const Stack& s) {
sluong = s.sluong;
vtri = s.vtri;
ds = new float [s.sluong];
for ( int i= 0 ; i<=vtri;i++)
ds[i] = s.ds[i];
}
~Stack() { delete [] ds; }
};
Hàm xây dựng sao chép mặc nhiên
Stack( const Stack& s) {
sluong = s.sluong;
vtri = s.vtri;
ds = s.ds;
}
a
ds:1000
soluong:5 vitri:2
1
3 2
b
ds:
soluong:
vitri:
=
2
=
=
=
1010
1 3 2
Trang 14Đối tượng là dữ liệu thành viên
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 đối
tượng.
Đâ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 lớp đã thiết kế 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 của một lớp
Trang 15Cách truy xuất
Truy xuất các thành phần của ĐT thông qua tên đối
tượng
Chú ý thuộc tính truy cập: Chỉ truy xuất được các
thành phần public
Đối tượng là dữ liệu thành viên của một lớp
void Duongtron::hienthi() {
cout << "Tam: " ;
tam.hienthi();
cout << "\nBan kinh: " << bkinh;
}
void Duongtron::doiTam( int dx, int dy)
{
tam.doidiem(dx, dy);
}
void Duongtron::nhap() {
cout << "Nhap tam:" ;
tam.nhap();
cout << "Nhap bkinh:" ;
cin >> bkinh;
}
tam.x = xxx; Lỗi tam.y = xxx; Lỗi
Trang 16Hàm xây dựng
Hàm xây dựng của ĐT là dữ liệu thành viên:
Trong định nghĩa hàm xây dựng của lớp sử dụng đối
tượng là dữ liệu thành viên, ta gọi hàm xây dựng cho
các đối tượng này bằng cú pháp:
<prototype hàm XD> : <tên ĐT>(tsố) {…}
Ví dụ:
Duongtron() : tam() { bkinh = 0 ; }
Duongtron(Diem t, int r) : tam(t) , bkinh(r) {}
Đối tượng là dữ liệu thành viên của một lớp
Trang 17TS Trần Công Án - 2014
CT114 – Lập trình Hướng đối tượng C++