Tải bản đầy đủ (.docx) (8 trang)

Hàm tạo và đối tượng thành phần

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (64.71 KB, 8 trang )

Hàm tạo và đối tượng thành phần
8.1. Lớp bao, lớp thành phần
Một lớp có thuộc tính là đối tượng của lớp khác gọi là lớp bao, ví dụ:
class A
{
private:
int a, b;
...
} ;
class B
{
private:
double x, y, z;
...
} ;
class C
{
private:
int m, n;
A u;
B p, q;
...
} ;
Trong vớ dụ trờn thỡ:
C là lớp bao
A, B là các lớp thành phần (của C)
8.2. Hàm tạo của lớp bao
+ Chỳ ý là trong cỏc phương thức của lớp bao không cho phép truy nhập trực tiếp đến các
thuộc tính của các đối tượng của các lớp thành phần.
+ Vỡ vậy, khi xõy dựng hàm tạo của lớp bao, phải sư dụng các hàm tạo của lớp thành
phần để khởi gán cho các đối tượng thành phần của lớp bao.


Ví dụ khi xây dựng hàm tạo của lớp C, cần dùng các hàm tạo của lớp A để khởi gán cho
đối tượng thành phần u và dùng các hàm tạo của lớp B để khởi gán cho các đối tượng thành
phần p, q.
8.3. Cách dùng hàm tạo của lớp thành phần để xây dựng hàm tạo của lớp bao
196
+ Để dùng hàm tạo (của lớp thành phần) khởi gán cho đối tưọng thành phần của lớp
bao, ta sử dụng mẫu:
tên_đối_tượng(danh sách giá trị)
+ Cỏc mẫu trờn cần viết bờn ngoài thõn hàm tạo, ngay sau dũng đầu tiên. Nói một cách
cụ thể hơn, hàm tạo sẽ có dạng:
tên_lớp(danh sách đối) : tên_đối_tượng( danh sách giá trị),
...
tên_đối_tượng( danh sách giá trị)
{
// Các câu lệnh trong thân hàm tạo
}
Chỳ ý là các dấu ngoặc sau tên đối tượng luôn luôn phải có, ngay cả khi danh sách giá trị
bên trong là rỗng.
+ Danh sách giá trị lấy từ danh sách đối. Dựa vào danh sách giá trị, Trỡnh biờn dịch sẽ
biết cần dựng hàm tạo nào để khởi gán cho đối tượng. Nếu danh sách giá trị là rỗng thỡ
hàm tạo khụng đối sẽ được sử dụng.
+ Các đối tượng muốn khởi gán bằng hàm tạo không đối có thể bỏ qua, không cần phải
liệt kê trong hàm tạo. Nói cách khác: Các đối tượng không được liệt kê trên dũng đầu hàm
tạo của lớp bao, đều được khởi gán bằng hàm tạo không đối của lớp thành phần.
Ví dụ:
class A
{
private:
int a, b;
public:

A()
{
a=b=0;
}
A(int a1, int b1)
{
a = a1; b = b1;
}
...
} ;
class B
{
private:
double x, y, z;
198
public:
B()
{
x = y = z = 0.0 ;
}
B(double x1, double y1)
{
x = x1; y = y1; z = 0.0 ;
}
B(double x1, double y1, double z1)
{
x = x1; y = y1; z = z1 ;
}
...
} ;

class C
{
private:
int m, n;
A u, v;
B p, q, r;
public:
C(int m1, int n1,int a1, int b1, double x1, double y1, double x2, double y2, double
z2) : u(), v(a1,b1), q(x1,y1), r(x2,y2,z2)
{
m = m1 ; n = n1;
}
} ;
Trong hàm tạo núi trờn của lớp C, thỡ cỏc đối tượng thành phần được khởi gán như sau:
u được khởi gán bằng hàm tạo không đối của lớp A
v được khởi gán bằng hàm tạo 2 đối của lớp A
q được khởi gán bằng hàm tạo 2 đối của lớp B
r được khởi gán bằng hàm tạo 3 đối của lớp B
p (không có mặt) được khởi gán bằng hàm tạo không đối của lớp B
8.4. Sử dụng các phương thức của lớp thành phần
Mặc dù lớp bao có các thành phần đối tượng, nhưng trong lớp bao lại không được phép
truy nhập đến các thuộc tính của các đối tượng này. Vỡ vậy giải phỏp thụng thường là:
+ Trong các lớp thành phần, xây dựng sẵn các phương thức để có thể lấy ra các thuộc
tính của lớp.
+ Trong lớp bao dùng các phương thức của lớp thành phần để nhận các thuộc tính của
các đối tượng thành viên cần dùng đến.
8.5. Các ví dụ
Hai chương trỡnh dưới đây minh hoạ các điều đó nói trong các mục trên.
Ví dụ 1:
Trong ví dụ này xét 2 lớp:

DIEM (Điểm) và DT (Đoạn thẳng)
Lớp DIEM là lớp thành phần của lớp DT
//CT4_12.CPP
// Thuoc tinh doi tuong
#include <conio.h>
#include <iostream.h>
class DIEM
{
private:
int x,y ;
public:
DIEM()
{
x=y=0;
}
DIEM(int x1, int y1)
{
x= x1; y=y1;
}
void in()
{
cout << "(" << x << "," << y << ")" ;
}
} ;
class DT
{
private:
DIEM d1, d2;
int m;
public:

200
DT() : d1(), d2()
{
m=0;
}
DT(int m1,int x1, int y1, int x2, int y2) : d1(x1,y1), d2(x2,y2)
{
m=m1;
}
DT(int m1,DIEM t1, DIEM t2)
{
m=m1;
d1 = t1;
d2 = t2;
}
void in()
{
cout << "\n Diem dau : "; d1.in();
cout << "\n Diem cuoi: "; d2.in();
cout << "\n Mau : " << m;
}
};
void main()
{
DT u, v(1,100,100,200,200), s(2,DIEM(300,300),
DIEM(400,400)) ;
clrscr();
u.in();
v.in();
s.in();

getch();
}
Ví dụ 2:
Trong ví dụ này xét 3 lớp:
Diem (Điểm)
DTron (Đường trũn)
HTron (Hỡnh trũn)
Lớp DTron có một lớp thành phần là lớp Diem.
Lớp HTron có 2 lớp thành phần là lớp DTron và lớp Diem.
202

×