Lập trình hướng đối tượng - Chương 3: Thực hiện ẩn khởi tạo và hủy bỏ đối tượng - Huỳnh Quyết Thắng

 Khi viết chương trình thông thường có hai

trường hợp xảy ra: (1) chúng ta viết thư viện và

(2) chúng ra sử dụng thư viện

 Trong truờng hợp (1): chúng ta không muốn

cho các LTV sử dụng thư viện được truy

nhập/can thiệp vào các phần lõi của thư viện

 Trong trường hợp (2): chúng ta không cần quan

tâm tới phần lõi của thư viện, chúng ta chỉ cần

quan tâm giao diện của phần được sử dụng

không bị thay đổi

 Giải pháp: Các cơ chế thực hiện/khai báo ẩn

(hidden implementation)

pdf31 trang | Chuyên mục: C/C++ | Chia sẻ: tuando | Lượt xem: 478 | Lượt tải: 0download
Tóm tắt nội dung Lập trình hướng đối tượng - Chương 3: Thực hiện ẩn khởi tạo và hủy bỏ đối tượng - Huỳnh Quyết Thắng, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 // Return -1 to indicate failure
}
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 36
Phương thức Get (Truy vấn)
 Các phương thức truy vấn (query method, 
accessor) là các phương thức dùng để hỏi về giá
trị của các thành viên dữ liệu của một đối tượng
 Có nhiều loại câu hỏi truy vấn có thể:
– truy vấn đơn giản (“giá trị của x là bao nhiêu?”)
– truy vấn điều kiện (“thành viên x có lớn hơn 10 
không?”)
– truy vấn dẫn xuất (“tổng giá trị của các thành viên x 
và y là bao nhiêu?”)
 Đặc điểm quan trọng của phương thức truy vấn 
là nó không nên thay đổi trạng thái hiện tại của 
đối tượng
– không thay đổi giá trị của thành viên dữ liệu nào.
19
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 37
Phương thức Get
 Đối với các truy vấn đơn giản, quy ước đặt tên 
phương thức: tiền tố “get”, tiếp theo là tên của 
thành viên
// query returns value of member x
int getX();
// query returns value of member size
int getSize();
 Các loại truy vấn khác nên có tên có tính mô tả
 Truy vấn điều kiện nên có tiền tố “is”
int Foo::getXPlusY() { return x + y; }
bool Foo::isXPositive() { return x > 0; }
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 38
Khởi tạo và hủy bỏ đối tượng
1. Ý nghĩa của quá trình khởi tạo và huỷ bỏ đối
tượng
2. Quá trình khởi tạo: các hàm thiết lập
(constructor)
3. Quá trình huỷ đối tượng: hàm huỷ (destructor)
4. Các đặc điểm của hàm khởi tạo và hàm huỷ
5. Hàm khởi tạo mặc định
6. Các trường hợp đối tượng được tao ra và giải
phóng
20
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 39
Ý nghĩa
 Mỗi đối tượng khi tồn tại và hoạt động được hệ
điều hành cấp pháp một vùng nhớ (theo giao
diện của lớp) để lưu lại các giá trị của dữ liệu
thành phần
 Khi tạo ra đối tượng hệ điều hành sẽ gán luôn
cho các dữ liệu thành phần này các giá trị khởi
tạo tuỳ theo mong muốn của LTV quy định bằng
các lệnh khai báo biến-đối tượng
 Ngược lại khi kết thúc vòng đời của đối tượng
cần phải giải phóng hợp lý tất cả các bộ nhớ đã
cấp phát cho đối tượng (do LTV hoặc Trình BD)
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 40
Quá trình khởi tạo: Các hàm thiết 
lập Constructor
 Các quá trình gán dữ liệu hay huỷ dữ liệu này
phải được thực hiện tự động trước khi người lập
trình có thể tác động lên đối tượng
 Hàm thiết lập là một hàm đặc biệt. Hàm này
được gọi tự động mỗi khi có một đối tượng mới
được tạo ra. Chức năng của hàm thiết lập là
khởi tạo các giá trị của các thành phần dữ liệu
của đối tượng hay xin cấp phát bộ nhớ cho các
thành phần bộ nhớ động.
21
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 41
Ví dụ constructor
 class Square
{
public:
Square(); // prototype
...
};
Square::Square() // heading
{
side = 1;
}
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 42
Constructor
 Constructor có vai trò đảm bảo thành phần dữ
liệu của một đối tượng được khởi tạo, không ở
trạng thái chưa xác định.
 Các trường hợp Constructor được gọi:
– Khi khai báo đối tượng
– Truyền đối tượng dưới dạng tham trị
– Cấp phát động 
 Không có tham số: Constructor mặc định
 Có tham số: Có nhiều constructor trùng tên. Cần 
phân biệt qua danh sách tham số
22
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 43
c++ constructor
class Foo {
public:
Foo(); // Default constructor
Foo(int x); // Overloaded constructor
Foo(string s); // Overloaded constructor
};
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 44
Hàm hủy: Destructor (C++)
 Ngược lại với quá trình khởi tạo đối tượng, khi
giải phóng đối tượng chúng ta phải giải phóng
toàn bộ bộ nhớ đã được cấp phát cho đối tượng. 
Chức năng của hàm huỷ sẽ thực hiện vai trò
này:
 Ví dụ: class A {
int n;
public:
A(); //constructor
~A(); // destructor
};
 Java: không dùng hàm hủy. 
23
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 45
Hàm hủy
 Trước khi HDH giải phóng bộ nhớ đã cấp phát
để lưu trữ các dữ liệu thành phần của đối tượng, 
sẽ thực hiện hàm huỷ. Vì vậy chúng ta lưu ý khi
xây dựng các lớp, trong hàm huỷ chỉ cần giải
phóng những gì mà HDH không tự động giải
phóng cho chúng ta.
 Nguyên tắc cần lưu ý ở đây là:
– Cần đặc biệt lưu ý tới các lớp trong đó có dữ liệu
thành phần là các con trỏ
– Không bỏ sót (không hiệu quả sử dụng bộ nhớ) và
không giải phóng các bộ nhớ cấp phát hai lần (sẽ báo
lỗi)
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 46
Quá trình hủy DT: hàm hủy
A::A(int m)
{
NA=m;
FA = new float [m];
for (int i=0; i<m; 
i++)
{ FA[i]=i*10.0; }
}
#include 
#include 
#include 
class A
{ int NA;
float *FA;
public:
A(int m);
void display();
};
24
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 47
Quá trình hủy DT: hàm hủy
NA
FA
Giải phóng A1, 
mảng vẫn còn?
Giải quyết triệt để giải phóng bộ nhớ?
void A::display() { 
for (int i=0; i<NA; i++)
{ cout << FA[i];
cout << " ";
}
}
void main()
{ A A1(5);
A1.display();
}
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 48
Hàm hủy
A::A(int m)
{
NA=m;
FA = new float 
[m];
for (int i=0; i<m; 
i++)
{ FA[i]=i*10.0; }
}
A::~A()
{ delete FA[];}
#include 
#include 
#include 
class A
{ int NA;
float *FA;
public:
A(int m);
void display();
~A();
};
25
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 49
Đặc điểm hàm thiết lập
 Hàm thiết lập có cùng tên với lớp.
 Hàm thiết lập phải có thuộc tính public
 Hàm thiết lập không có thuộc tính trả về
và không cần khai báo void
 Mỗi lớp có thể có nhiều hàm thiết lập
trong cùng một lớp
 Được tự động gọi trên cơ sở tìm thấy hàm
thiết đúng nhất với các đối số truyền vào
khi đăng ký đối tượng
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 50
Đặc điểm hàm hủy
 Tên hàm huỷ bỏ bắt đầu bằng dấu ~ theo
sau là tên lớp tương ứng.
 Hàm huỷ cần có thuộc tính public
 Mỗi lớp chỉ có duy nhất một hàm huỷ bỏ.
 Khi không định nghĩa hàm huỷ bỏ chương
dịch tự động sinh một hàm huỷ ngầm định
để lấp vào chỗ trống để đảm bảo nguyên
tắc luôn luôn thực hiện hàm huỷ.
 Hàm huỷ bỏ không có giá trị trả về.
26
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 51
Constructor và Destructor mặc định
 Trên thực tế tất cả các chương trình dịch khi
dịch các lớp nếu như trong các lớp này không
định nghĩa một hàm thiết lập nào cả thì sẽ tự
động thêm vào lớp đó một hàm khởi tạo mặc
định ngầm định (theo quy định của chương trình
dịch đó). Tương tự như vậy chương trình dịch sẽ
làm cả với hàm huỷ.
 Nếu trong lớp có định nghĩa ít nhất một hàm
thiết lập thì chương trình dịch sẽ tuân theo cách
định nghĩa lớp mà không thêm gì cả.
 Tuy nhiên, nếu ta không định nghĩa constructor 
mặc định nhưng lại có các constructor khác, 
trình biên dịch sẽ báo lỗi không tìm thấy
constructor mặc định nếu ta không cung cấp
tham số khi tạo thể hiện.
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 52
Quay lại lớp Automobile
class Automobile { 
public: 
Automobile( ); 
void Input( );
void set_NumDoors( int doors );
void Display( );
int get_NumDoors( );
private:
string Make;
int NumDoors;
int NumCylinders;
int EngineSize; 
};
27
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 53
Constructor mặc định
Automobile::Automobile( )
{
NumDoors = 0;
NumCylinders = 0;
EngineSize = 0;
}
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 54
Constructor định nghĩa chồng
class Automobile { 
public: 
Automobile( );
Automobile(int d, int c, int s);
Automobile(string m, int d, int c, 
int s);
28
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 55
Constructor với đối số ngầm định
class Automobile { 
public: 
Automobile(); 
Automobile( string make, int doors,
int cylinders = 4, int engineSize = 
2000 );
Automobile( const Automobile & A );
// copy constructor
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 56
Tự tham chiếu
 Chúng ta cần một phương tiện:
– Cho phép truy nhập đến đối tượng hiện hành 
của lớp. 
– Cho phép một đối tượng "tham chiếu" đến 
chính nó. Quan trọng khi hàm thành phần 
thao tác trên hai hay nhiều đối tượng.
– Xóa đi sự nhập nhằng giữa một biến cục bộ, 
tham số với thành phần dữ liệu của lớp
 Con trỏ this (trong C++), tham chiếu this 
(Java)
29
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 57
Tự tham chiếu: this
 Java: 
– this. hour = hour
 C++: 
– this->hour = hour
 Con trỏ this (C++) hay tham chiếu this có quan 
hệ mật thiết đến các phương thức Get Set và
các phương thức khởi tạo.
– C++: copy constructor, assignment operator
– Java: lời gọi đệ quy this()
 Không dùng bên trong các phương thức tĩnh
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 58
C++
int point::coincide(point pt) {
return(this->x==pt.x && this-
>y==pt.y);
}
void point::display() {
cout<<"Dia chi : "<<this<<"Toa do : 
"<<x<<" "<<y<<"\n";
}
30
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 59
Java
public class Person
{
...
public void setName(String name)
{
this.name = name;
}
...
private String name;
private int age;
}// end class Person
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 60
JAVA
31
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 61
Câu hỏi, bài tập
 Các câu hỏi:
 1. Ý nghĩa của thực hiện ẩn trong LTHDT
 2. Phân tích vai trò và ý nghĩa của các từ khóa public, 
private, protected
 3. Phân tích quá trình cấp phát bộ nhớ trong cho các
biến-đối tượng thuộc các lớp
 4. Nêu vai trò của các toán tử (ký pháp): ., ->, :: khi
nào thì sử dụng chúng
 5. Ý nghĩa của hàm bạn LTHDT. Nêu đặc điểm của hàm
bạn.
 6. Nêu các đặc điểm của các hàm khởi tạo.
 7. Nêu các đặc điểm của các hàm huỷ.
TS H.Q. Thắng - TS C.T. Dũng Bộ môn 
CNPM 62
Câu hỏi, bài tập
 Bài tập tuần 3:
 Chuyển đổi bài tập tuần 2 thành lớp trong đó dữ liệu
thành phần là mảng và số phần tử trong mảng. Các hàm
thành phần là các thao tác sắp xếp, tìm kiếm và thao tác
vào dữ liệu được khai báo như hàm khởi tạo
 Xây dựng lớp Stack mô phỏng cấu trúc Stack với các
hoạt động sau:
– Khởi tạo stack
– Thêm phần tử vào Stack
– Lấy phần tử khỏi Stack
– In danh sách các phần tử có trong Stack
– Hàm bạn Inmax in ra phần tử có giá trị lớn nhất trong Stack

File đính kèm:

  • pdflap_trinh_huong_doi_tuong_chuong_3_thuc_hien_an_khoi_tao_va.pdf