Mục tiêu• Biết cách sử dụng con trỏ this • Sử dụng được hàm và lớp với chỉ thị friend • Hiện thực và sử dụng được constructor • Hiện thực và sử dụng được desstructor • Lập trình được với
Trang 1Chương 3
HỖ TRỢ OO
của Borland C++
Trang 2Mục tiêu
• Biết cách sử dụng con trỏ this
• Sử dụng được hàm và lớp với chỉ thị friend
• Hiện thực và sử dụng được constructor
• Hiện thực và sử dụng được desstructor
• Lập trình được với mảng đối tượng
• Hiện thực được thuộc tính và hàm static
Trang 4• public: cho phép bên ngoài truy cập interface của lớp.
• private: các thành phần nội, không cho phép bên ngoài truy cập.
• protected: các thành phần dành cho lớp thừa kế truy cập, không cho phép các đối tượng không phải
là con truy cập.
Trang 53.2- Con trỏ this
• this: từ khóa, là
pointer chỉ đến đối
tượng hiện hành
• Được dùng trong code các
method của lớp
?
Trang 6Con trỏ this…
class D
{ private : int b,c,y,z ;
public :
void f () { y=1 ; this -> z = 5 ; }
void g (void) { (* this).b = 1 ; c=1; }
};
Trong code của method:
y=1; tương đương với this -> y = 1;
• Khi cần trả trị là pointer của đối tượng hiện hành:
Trang 7• Hàm friend sẽ nhận 1 đối tượng thuộc lớp này
làm tham số vì đây là hàm hướng thủ tục
•Khi hiện thực hàm friend,
không có chỉ thị friend nữa.
•Khi hiện thực hàm có tham số
mặc định bên ngoài lớp, không chỉ định trị mặc định Nếu có trị mặc định sẽ gây lỗi lúc compile
Trang 8int Secret ; // điều bí mật (điểm)
friend class B ; // Khai báo lớp friend
};
class B // Khai báo lớp B
{ public:
void Change (A *T) // Sửa điểm cho đối tượng lớp A
• Khi B là friend của A thì
trong B có phương thức nhận đối tượng lớp A là tham số.
• B là friend của A nhưng chưa chắc A là friend của B- Điều này phụ thuộc là trong B có khai báo A là friend của B hay không.
Trang 9Constructor:Hành vi được thực thi ngay lúc
định nghĩa biến đối tượng.
Mọi lớp đều hiển nhiên có 1 constructor mặc định của ngôn ngữ.
Đa số các constructor mặc định của ngôn ngữ OOP
có tác vụ xóa trống bộ nhớ cho các dữ liệu của đối tượng thuộc lớp nếu lớp này không hiện thực các constructor.
Trang 10Demo: Default constructor của BC++
• Default
constructor của BC++
không xóa trống bộ nhớ chứa dữ liệu của đối
tượng
Trang 11Gán trị cho các thành phần dữ liệu
từ tham số.
Cấp tài nguyên nếu cần ( cấp bộ nhớ động )
• Constructor phải là một hành vi public vì
là công cụ định nghĩa biến đối tượng.
• Constructor có quan hệ chặt chẽ với các
dữ liệu của đối tượng nên không thể là
hành vi static.
Trang 13Constructor mặc định (chuẩn, default) là
constructor KHÔNG THAM SỐ
Mỗi lớp chỉ có thể có TỐI ĐA 1 default constructor
( sẽ có lỗi Ambiguity between Constructor1(…)
and Construcor2 (…) )
Trang 14• Một class có thể có nhiều Constructor cho những tình huống định nghĩa đối tượng khác nhau
Trang 16Constructor ( )
Hai loại constructor: Constructor thường (tham
số là các dữ liệu đơn), constructor sao chép
(copy constructor- tham số là 1 đối tượng cùng lớp nhằm sao chép trị từ đối tượng đã có và đối tượng hiện hành)
Tham số của 1 method là 1 đối tượng thì nên dùng tham khảo với toán tử & để tiết kiệm bộ nhớ stack
Trang 17Constructor ( )
Một lớp không có constructor sao chép mà lại định nghĩa đối tượng bằng cú pháp
TênLớp Obj2 = Obj1;
Trình biên dịch sẽ dùng constructor sao chép chuẩn của ngôn ngữ để sao chép dữ liệu của Obj1 sang Obj2 (giống sao chép cấu trúc của phép gán cấu trúc)
Trang 18Thí dụ: Lớp mô tả vòng tròn trên màn hình
class Circle
{ int x,y , r ; // tâm và bán kính
int bkColor; // mầu nền
Circle *pv1 = new Circle ( 120,480,70,10,3);
Circle *pv2= new Circle(*pv1);
Constructor chuẩn, gán trị
trống
Constructor 5 tham số gán 5 trị thuộc tính
Định nghĩa biến theo đúng mẫu constructor đã Copy constructor
Trang 19Constructor sao chép trị từ 1 đối tượng mảng đã có.
Constructor nối trị từ 2 mảng đã có vào mảng hiện hành
INT_AR ( INT_AR& Obj1);
INT_AR ( INT_AR& Obj1, INT_AR& Obj2);
a= new int[n];
Trang 20Constructor sao chép trị từ 1 đối tượng ma trận đã có.
Gợi ý về 2 cách quản lý ma trận vuông:
Dùng int* Dùng int**
Dữ liệu int*m, n; int**m, n;
Cấp bộ m=new int[n*n]; m= new int* [n];
Trang 213.6- Destructor
Tình huống lập trình
Cấp bộ nhớ động, sử dụng xong quên trả Cạn tài nguyên của hệ thống
Mở file, sử dụng xong, quên đóng file
Có cách nào tự động hóa các việc này không?Giải pháp là DESTRUCTOR
Trang 223.6- Destructor ( )
Hành vi được thực thi khi đối tượng không còn tồn tại
Thời gian sống của đối tượng: Từ lúc định
nghĩa đối tượng cho đến khi khối phát biểu có chứa đối tượng được thực thi xong
Trang 23Destructor không được có tham số.
Các tác vụ thường dùng trong code của
destructor: TRẢ TÀI NGUYÊN
Destructor phải có đặc tính public, không thể là static (giống constructor)
Mỗi class chỉ có thể có tối đa 1 destructor
Trang 24~INT_AR() { if (a) delete[ ] a; }
int getSize() { return n; }
int* getArray() { return a; }
nguyên
Trang 253.7- Mảng đối tượng
Định nghĩa mảng đối tượng với constructor chuẩn
ClassName ObjAr1[ 10];
ClassName *ObjAr2 = new ClassName[10];
Định nghĩa mảng đối tượng với các contructor khác nhau ClassName ObjAr3[4] = { (params0), (params1),
(params2), (params3) } ;
ClassName *ObjAr4[3] = { new ClassName(params0), new ClassName(params1), new ClassName(params2) }; ClassName** ObjAr5 = new ClassName* [3];
ObjAr5[0]= new ClassName (params0);
ObjAr5[1]= new ClassName (params1);
ObjAr5[2]= new ClassName (params2);
Các paramsX ứng với các constructor khác nhau.
Xem thí dụ OBJ_ARR.CPP
Trang 263.8- Lớp có dữ liệu static
static= tĩnh
Dữ liệu static của 1 lớp là dữ liệu chung của mọi
đối tượng thuộc lớp nên còn được gọi là class
variables
Dữ liệu static thường được dùng khi các đối
tượng cùng lớp có dữ liệu mang cùng một trị
Dữ liệu static được đặt ngoài khối bộ nhớ của các đối tượng thuộc lớp và phải được khai báo
Trang 273.8- Lớp có dữ liệu static ( )
Thí dụ: Mọi nhân viên trong 1 phòng ban đều biết
phòng ban mình có bao nhiêu người.
Hiện thực 1- Không dùng dữ liệu static
Khi thêm vào 1 nhân viên, cả 6 đối tượng cùng phải cập nhật dữ liệu SốNhânViên Nếu ta quên 1 phát biểu cập nhật, dữ liệu này bị mất nhất quán Tương tự khi có 1 nhân viên thôi việc.
Trang 283.8- Lớp có dữ liệu static ( )
Thí dụ: Mọi nhân viên trong 1 phòng ban đều biết
phòng ban mình có bao nhiêu người.
Hiện thực 2- Dùng dữ liệu static
Khi thêm vào 1 nhân viên, chỉ cần 1 phát biểu cập nhật ( trong
Thành phần static được
để rời và là chung của mọi đối tượng cùng lớp
Trang 293.9- Lớp có hành vi static
Hành vi static của 1 lớp là hành vi cho phép bên ngoài
sử dụng mà không cần định nghĩa 1 đối tượng thuộc
Trang 30static double Sqrt(double x) { return sqrt(x);}
static double Pow (double x, double y) { return pow(x,y);}
static double Sin (double x) { return sin(x);}
Trang 313.10- Tóm tắt
this : con trỏ của đối tượng hiện hành
constructor: Hành vi được thực thi ngay lúc định nghĩa biến Mỗi constructor đóng vai trò như 1 template (mẫu) định nghĩa đối tượng
Mặc định, mỗi lớp có constructor chuẩn của
ngôn ngữ – thường là gán trị trống cho mọi
thành phần dữ liệu của đối tượng thuộc lớp khi đối tượng được định nghĩa – nếu lớp này không
có hiện thực constructor
Nếu 1 lớp đã có hiện thực constructor thì
constructor mặc định của ngôn ngữ không còn được áp dụng cho các đối tượng thuộc lớp này nữa
Trang 32ClassName NewObj = ExistedObj; hoặc
ClassName NewObj (ExistedObj);
Trang 333.10- Tóm tắt ( )
Tầm vực (scope) của 1 biến bắt đầu từ lúc định
nghĩa biến này cho đến hết khối phát biểu chứa nó Thời gian sống của đối tượng bắt đầu từ lúc code định nghĩa đối tượng được thực thi cho đến hết
thực thi hết khối phát biểu chứa nó.
Trạng thái (status) của 1 đối tượng là tập gía trị của các thuộc tính Như thế trạng thái của đối tượng có thể thay đổi theo thời gian.
Destructor là hành vi được thực thi vào lúc đối
tượng CHẾT.
Cú pháp destructor:
~ClassName (void) { <code> }
Mỗi lớp chỉ có tối đa 1 destructor.
Trang 34Cú pháp gọi hành vi static:
ClassName.staticMethod(params);
Obj.staticMethod(params);
Trang 35Trắc nghiệm
Trang 37Câu 2
Chọn phát biểu sai
a- Hàm friend của 1 lớp là hàm được phép
truy cập mọi thuộc tính của lớp
b- Hàm friend của 1 lớp là hàm chỉ được phép truy cập thuộc tính public của lớp
c- Hàm friend của 1 lớp là hàm không được phép truy cập thuộc tính protected của lớp
b
c
Trang 38Câu 3
class A được khai báo là friend của class B ( trong khai báo của class A) Thông thường trong class A có ít nhất một hành vi nhận 1 đối tượng class B là tham số
a- Đúng
b- Sai
c- Không biết
a
Trang 39Câu 4
Constructor của 1 class
a- Buộc phải là public
b- Có thể là private
a
Trang 40Câu 5
Chọn các phát biểu sai
a- Nếu 1 user class trong C++ không có
constructor thì không thể sử dụng đối tượng thuộc lớp này
b- Nếu 1 user class trong C++ không có
constructor thì vẫn có thể sử dụng đối
tượng thuộc lớp này
c- Destructor của 1 lớp có thể có tham số
a
b
Trang 41a- Không có gì cần cải tiến.
b- Thêm các method có ý nghĩa hơn
c- Cần xây dựng destructor
c
Trang 42Câu 7
Chọn phát biểu sai
Có hai lớp A,B đều có constructor, B là con public của A Khi định nghĩa 1 đối tượng lớp B
a- Constructor của A được thực thi trước,
constructor của B được thực thi sau
b- Constructor của B được làm thực thi,
constructor của A được thực thi sau
b
Trang 43Câu 8
Chọn phát biểu sai
Có hai lớp A,B đều có constructor, B là con public của A Khi hủy 1 đối tượng lớp B
a- Destructor của A được thực thi trước,
destructor của B được thực thi sau
b- Destructor của B được thực thi trước,
destructor của A được thực thi sau
a
Trang 45Câu 10
Chọn phát biểu đúng.
a- Constructor và destructor có thể có tham số.
b- Constructor và destructor không thể có tham số.
c- Constructor và destructor buộc phải có tham số.
d- Constructor có thể có tham số, destructor buộc phải
Trang 47c- Chỉ cho phép bên ngoài sử dụng trong
trường hợp không tồn tại 1 đối tượng thuộc lớp
a
c
Trang 48Câu 13
Tầm vực của 1 đối tượng
a- Là khối văn bản chương trình kể từ lúc định nghĩa đối tượng đến hết khối chứa nó
b- Là vùng văn bản chương trình có thể truy xuất được đối tượng
c- Là toàn bộ chương trình
a
b
Trang 49Câu 14
Chọn các phát biểu sai
Thời gian sống của 1 đối tượng:
a- Là thời gian thực thi chương trình
b- Là thời gian kể từ lúc đối tượng được định nghĩa đến khi chương trình thực thi xong.c- Là thời gian kể từ lúc đối tượng được định nghĩa đến khi khối chương trình chứa đối tượng được thực thi xong
a
Trang 50Câu 15
Trạng thái của đối tượng:
a- Là khối bộ nhớ chứa dữ liệu mô tả đối
tượng
b- Là tập các gía trị thuộc tính hiện hành của đối tượng
c- Là chương trình chứa đối tượng
d- Là một thuộc tính của đối tượng
b
Trang 51Xin cảm ơn