TểM TẮT CHƯƠNG II : C++/CLI HƯỚNG ĐỐI TƯỢNG
4) Phương thức thành viên (Member Method)
Cũng giống như biến thành viên, phương thức thành viên đơn giản là các hàm được khai báo bên trong class. Cú pháp khai báo các phương thức thành viên cũng tương t ự như khi khai báo các hàm thông thường.
VD :
ref class Hinh_tron {
public :
// Variable : UInt16 R;
// Method : UInt16 Chu_vi() {
return 2*(Math::PI)*R;
}
UInt16 Dien_tich() {
return (Math::PI)*R*R;
} };
Trong ví dụ trên, có hai phương thức thành viên là Chu_vi() và Dien_tich(). Lưuý là các biến thành viên là các biến toàn cục, do đó ta có thểsửdụng các biến này trong khi khai báo các
R).
Các phương thức thành viên chỉ có thể được truy xuất thông qua đối tượng bằng toán tử
“->”.
Lưuý : Class cũng cho phép khai báo các phương thức quá tải (overload method) giống như việc khai báo các hàm quá tải (overload function).
Phương thức tĩnh (static method):
Phương thức tĩnh cũng tương tự nhưbiến tĩnh : khi khai báo phương th ức tĩnh thì thêm từ khóa static, phương thức tĩnh cũng có thểtruy xuất trực tiếp qua tên class và toán tử “::” . Tất cả các biến hay tham sốsửdụng trong phương thức tĩnh bắt buộc phải là các biến tĩnh.
VD :
ref class Sinh_vien {
public:
// các biến thành viên tĩnh.
static String^ Ho_ten = “Nguyen Van A”;
static UInt32 MSSV = 8111111;
static String^ Nganh_hoc = “Co dien tu” ;
// Phương thức tĩnh
static void Show(Sinh_vien^ A) {
Console ::WriteLine(“Ho va ten : ”+A->Ho_ten);
Console ::WriteLine(“MSSV : ”+A->MSSV);
Console ::WriteLine(“Nganh hoc : ”+A->Nganh_hoc);
} };
void main(void) {
Sinh_vien^ A;
A->Ho_ten = “Nguyen VanB”;
Sinh_vien::Show(A);
Console::ReadKey();
}
Kết quảin ra màn hình : Ho va ten : Nguyen Van B MSSV : 8111111
Nganh hoc : Co dien tu
Các phương thức WriteLine(), Write(), ReadLine() … trong class Console hay Concat() trong class String là các phương thức tĩnh.
Constructor :
Constructor là một phương thức đặc biệt của class cho phép chúng ta khởi tạo giá trị cho các biến của class khi khai báo. Constructor được khai báo bên trong Class
Cú pháp : Class_name( argument1 , argument 2, …) {
Statement;
}
Trong đó, argument là các tham sốcủa constructor, các tham số này dùng đểtruyền giá trị cho các biến của class khi khởi tạo.
VD : khai báo Constructor cho class Hinh_tron.
ref class Hinh_tron {
public :
// Constructor : Hinh_tron (UInt16 r) {
R = r; // truyền giá trịcho biến R của class.
}
// Variable : UInt16 R;
… };
Khi tạo đối tượng, ta có thể khởi tạo các thuộc tính ban đầu của đối tượng thông qua constructor thay vì phải gán trực tiếp. Vì có 2 cách tạo đối tượng nên tương ứng cũng có hai cách gọi constructor.
VD : tạo và khởi tạo giá trị cho đối tượng A.
Kiểu Handle : Hinh_tron^ A = gcnew Hinh_tron(5) ; Kiểu Stack : Hinh_tron A (5);
Trong ví dụ trên, đối tượng A sau khi được tạo thì giá trịbiến R của A được gán giá trị5.
Lưu ý : Nếu trong class đã có khai báo constructor, khi tạo đối tượng ta phải theo đúng cấu trúc của constructor.
VD : Nếu trong class Hinh_tron đã có khai báo constructor, dòng lệnh sau khi tạo đối tượng sẽ báo lỗi :
Kiểu Stack : Hinh_tron A ; // Error Lí do là ta chưa truyền giá trịcho tham sốcủa constructor khi khai báo.
Kiểu Handle : Hinh_tron^ A = gcnew Hinh_tron(0) ; // OK
Kiểu Stack : Hinh_tron A (0); // OK
Copy constructor :
Copy constructor là phương thức cho phép gán lẫn nhau giữa các đối tượng khác nhau của cùng một class được tạo ra.
Cú pháp : Class_name ( const Class_name %p) {
Val1 = p.Val1;
Val2 = p.Val2;
….
Valn = p.Valn }
Trong đó const là từ khóa khai báo; Val1, Val2, …Valn là các biến của class.
VD : xét lại ví dụclass Hinh_tron.
ref class Hinh_tron {
public :
// Variable : UInt16 R;
// Constructor : Hinh_tron (UInt16 r) {
R = r; // truyền giá trịcho biến R của class.
}
// Copy constructor :
Hinh_tron (const Hinh_tron %p) {
R = p.R;
}
… };
Trong chương trình chính, nếu như có hai đối tượng Hinh_tron được tạo ra, ta có thể gán lẫn nhau giữa hai đối tượng này.
VD :
void main(void) {
Hinh_tron B = A; // Gán giá trị cho đối tượng B Console::WriteLine(“Chu vi hinh tron B = {0}”,B.Chu_vi());
Console::ReadKey();
}
Kết quảin ra màn hình : Chu vi hinh tron B = 62 Destructor :
Destructor là một phương thức đặc biệt của class cho phép chúng ta xóa các đối tượng hay phương thức đã được tạo trước đó. Mục đích của destructor là giúp giải phóng bộnhớ đãđược cấp phát khi khởi tạo đối tượng đồng thời giải phóng các tài nguyên hệ thống đãđược cung cấp cho đối tượng. Destructor được khai báo bên trong Class.
Cú pháp : ~Class_name () {
Statement;
}
Lưuý, chỉ nên khai báo destructor khi trong class có các biến kiểu con trỏ (array, string).
Đểgiải phóng bộnhớ, ta dùng lệnh delete với các biến này.
VD :
ref class Sinh_vien {
public :
// Variable : String^ Ho_ten;
String^ Que_quan;
String^ Nganh_hoc;
// Destructor :
~Sinh_vien () {
delete Ho_ten;
delete Que_quan;
delete Nganh_hoc;
}
… };