Tài liệu Lập trình hướng đối tượng & C++ - Chương 5: Hàm xây dựng, hàm hủy và việc khởi tạo đối tượng: HÀM XÂY DỰNG, HÀM HỦY VÀ
VIỆC KHỞI TẠO ðỐI TƯỢNG
Chương 5
1
Nội dung
• Hàm xây dựng
• Hàm hủy
• Hàm xây dựng sao chép
• Thuộc tính của 1 lớp là đối tượng
2
Hàm xây dựng
• Mục đích: khởi tạo giá trị ban đầu cho đối tượng
– Gán giá trị đầu cho các thuộc tính.
– Cấp vùng nhớ cho con trỏ thành viên.
class Diem {
int x, y;
class PhanSo {
int tu, mau;
3
public:
Diem(int a)
{ x = y = a; }
Diem(int h, int t)
{ x = h; y=t; }
.
};
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àm xây dựng
Cấp vùng nhớ
4
SinhVien() {
strcpy(mssv,””);
hoten = new char[50];
namsinh = 1980;
diemtb = 0;
}
SinhVien(char*,char*,int,fl
oat);
};
{
soluong = max;
vitri = 0;
ds = new
float[soluong];
}
Stack(float* d, int m,
in...
5 trang |
Chia sẻ: putihuynh11 | Lượt xem: 486 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Lập trình hướng đối tượng & C++ - Chương 5: Hàm xây dựng, hàm hủy và việc khởi tạo đối tượng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
HÀM XÂY DỰNG, HÀM HỦY VÀ
VIỆC KHỞI TẠO ðỐI TƯỢNG
Chương 5
1
Nội dung
• Hàm xây dựng
• Hàm hủy
• Hàm xây dựng sao chép
• Thuộc tính của 1 lớp là đối tượng
2
Hàm xây dựng
• Mục đích: khởi tạo giá trị ban đầu cho đối tượng
– Gán giá trị đầu cho các thuộc tính.
– Cấp vùng nhớ cho con trỏ thành viên.
class Diem {
int x, y;
class PhanSo {
int tu, mau;
3
public:
Diem(int a)
{ x = y = a; }
Diem(int h, int t)
{ x = h; y=t; }
.
};
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àm xây dựng
Cấp vùng nhớ
4
SinhVien() {
strcpy(mssv,””);
hoten = new char[50];
namsinh = 1980;
diemtb = 0;
}
SinhVien(char*,char*,int,fl
oat);
};
{
soluong = max;
vitri = 0;
ds = new
float[soluong];
}
Stack(float* d, int m,
int n);
};
cho con trỏ
• Nếu khơng cĩ định nghĩa hàm xây dựng:
– Mặc nhiên sẽ tự động cĩ 1 hàm xây dựng khơng tham số.
– Chỉ cĩ 1 cách khởi tạo đối tượng theo dạng khơng tham số.
class Diem {
int x, y;
public:
void main() {
Diem a;
Diem *pa = new Diem();
Hàm xây dựng
5
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 ds1[10];
Diem *ds2 = new
Diem[20];
}
Khơng cĩ giá trị
đầu
nên dễ gây ra
hiệu ứng phụ
• 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.
void main() {
PhanSo a;
PhanSo b(3);
void main() {
Stack a;
Stack b(5);
Hàm xây dựng
6
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 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ự thực hiện:
– ðối tượng được tạo ra trước.
– Hàm xây dựng sẽ gọi sau trên đối tượng.
tu
mau
2
5
tu
mau
PhanSo c(2,5);
Hàm xây dựng
7
c c
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
Hàm hủy • Mục đích: thu hồi vùng nhớ đã cấp cho con
trỏ là dữ liệu 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
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ự 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.
void HamMinhHoa() {
Stack a;
Hàm xây dựng được gọi
Hàm hủy được gọi cho
Hàm hủy
9
Stack *pa = new Stack(8);
delete pa;
Stack *pb = new Stack[5];
delete[] pb;
pb = new Stack(20);
}
đố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
Hàm xây dựng sao chép
• Tại sao cần hàm xây dựng sao chép?
– Khởi tạo 1 đối tượng cĩ giá trị giống 1 đối tượng khác.
– Khác với phép gán (dấu =)
• Nếu khơng định nghĩa hàm xây dựng sao chép:
– Ngơn ngữ sẽ tự động tạo ra cho ta: nội dung là gán (=)
tương ứng từng thành phần.
– Khơng chính xác khi cĩ dữ liệu thành viên là con trỏ.
10
Hàm xây dựng sao chép
*ds
soluong
vitri
1300
8
3
4 3.2 1.4
1300H
Stack a(8);
a
*ds 1300
8
2 con trỏ sẽ trỏ
Stack b(a); soluong
vitri 3
b
cùng 1 địa chỉ
nếu khơng
định nghĩa
hàm xây dựng
sao chép
• Cú pháp: (const & )
{ Nội dung hàm }
VD: Diem(const Diem& d) { }
Stack(const Stack& s) { }
SinhVien(const SinhVien& sv) { }
Hàm xây dựng sao chép
• Nội dung:
– Gán tương ứng các thành phần dữ liệu (khơng là con trỏ).
– Cấp vùng nhớ và sao chép nội dung vùng nhớ 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; } 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 \01 mssv[]
Hàm xây dựng sao chép
13
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
2760
1974
8.14
91 02 98 \01
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 dựng 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];
}
};
Stack b(a);
1570
8
3
4 3.2 1.4
1570H
b
copy
*ds
soluong
vitri
• Sử dụng trong các trường hợp:
– ðối tượng được truyền theo giá trị của đối số 1 hàm.
– Trị trả về của hàm là 1 đối tượng.
– Tạo ra 1 đối tượng cĩ giá trị giống 1 đối tượng cho trước.
class A {
int x;
A HamThu(A x) {
Hàm xây dựng sao chép
15
public:
A() { x=0; }
A(const A& a) {
x=a.x;
}
void Hien() {
cout<<“x=“<<x;
}
};
A 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 dựng
sao chép
được gọi?
Thuộc tính của 1 lớp là đối tượng
• Giới thiệu:
– 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.
Sử dụng lại 1 lớp, nhưng khơng phải là thừa kế
class Diem { class DuongTron {
16
int x, y;
public :
Diem();
Diem(int , int);
void Nhap();
void Hien();
void DoiDiem(int,int);
int GiaTriX();
int GiaTriY();
};
Diem tam;
int bankinh;
public:
DuongTron(); ...
void Ve();
void Nhap();
void
DoiDTron(int,int);
float ChuVi();
float DienTich();
};
• 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 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ý.
Thuộc tính của 1 lớp là đối tượng
Void DuongTron::Ve() {
cout<<“Tam : “;
tam.Hien();
cout<<endl;
cout<<“Ban kinh : “
<<bankinh<<endl;
}
Void DuongTron::Nhap() {
7
10
20tam
bankinh
x
y
DuongTron a;
Thuộc tính của 1 lớp là đối tượng
18
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 dựng:
– 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 đĩ.
DuongTron() : tam()
{ bankinh=0; }
Thuộc tính của 1 lớp 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 dựng:
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.
Thuộc tính của 1 lớp là đối tượng
20
Duongtron(): tam(), bankinh(0)
{}
Duongtron(Diem d, int bk) : tam(d), bankinh(bk)
{}
Các file đính kèm theo tài liệu này:
- chapter5_2497_1993466.pdf