Phương thức thành viên (Member Method ):

Một phần của tài liệu Lập Trình C++ (Trang 35)

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 : 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); (adsbygoogle = window.adsbygoogle || []).push({});

Console::ReadKey(); }

Kết quảin ra màn hình : Ho va ten : Nguyen Van B MSSV : 8111111

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ẽ (adsbygoogle = window.adsbygoogle || []).push({});

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 : 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 ()

{ (adsbygoogle = window.adsbygoogle || []).push({});

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 : public : // Variable : String^ Ho_ten; String^ Que_quan; String^ Nganh_hoc; // Destructor : ~Sinh_vien () { delete Ho_ten; delete Que_quan; delete Nganh_hoc; } … }; 5) Toán tử(Operator) :

Ta cũng có thể định nghĩa các toán tử (operator) trong class để thực hiện các tính toán trên

các đối tượng của class.C++/CLI cho phép định nghĩa các toán tử một ngôi (unary) và hai ngôi (Binary) trong class

{

Statement; }

Trong đó “*” là kí hiệu của toán tử được định nghĩavà A là tên của toán hạng. C++/CLI hỗ

trợcác kí hiệu toán tửsau : + - * / % ^ & | ~ ! = < > += *= /= %= ^= |= << >> <<= >>= == != <= >= && || ++ -- ,

VD : Đoạn mã sau sẽxây dựng Class Complex quản lí các đối tượng là các sốphức (có dạng a + bj). Mỗi đối tượng được đặc trưng bởi 2 biến : Re (phần thực) và Im (phần ảo). Trong Class có

định nghĩa toán tử “-” một tham số trên sốphức A (a + bj) có chức năng trảvềsố phức liên hợp của A (a–bj).

ref class Complex

{public : public : // Variable : float Re; float Im; // Constructor :

Complex (float a, float b)

{ Re = a; Re = a; Im = b; } //Method : void Show() { Console::WriteLine(Re+ “ + ” + Im); } //Operator :

Complex^ B = gcnew Complex(0,0); //Khởi tạo đối tượng B. B->Re = A->Re; B->Im = -(B->Im); return B; } };

void main (void)

{

Complex^ A = gcnew Complex(5,10); //Khởi tạo sốphức A = 5 + 10j.

Complex^ B = -A; // Khởi tạo sốphức B là sốphức liên hợp của A nhờtoán tử- A->Show();

B->Show(); }

Kết quảin ra màn hình : 5 + 10j. 5 + -10j.

Toán tửhai ngôi (Binary Operator) :

Cú pháp : static Class_name^ operator *(const Class_name ^ A, const Class_name ^ B)

{

Statement; }

Trong đó “*” là kí hiệu của toán tử được định nghĩa; A, B là các toán hạng của phép toán. (adsbygoogle = window.adsbygoogle || []).push({});

+ - * / % ^ &

| ~ ! = < > +=

*= /= %= ^= |= << >>

<<= >>= == != <= >= &&

|| ++ -- ,

VD : Đoạn mã sau sẽ định nghĩa toán tử “+” cho Class Complex có chức năng cộng hai sốphức.

ref class Complex

{

public :

// Variable :

// Constructor :

Complex (float a, float b)

{ Re = a; Re = a; Im = b; } //Method : void Show() { Console::WriteLine(Re+ “ + ” + Im); } //Operator :

static Complex^ operator + (const Complex^ A, const Complex^ B)

{

Complex^ C = gcnew Complex(0,0); //Khởi tạo đối tượng C.

C->Re = A->Re + B->Re; C->Im = A->Im + B->Im;

return C; }

};

void main (void)

{

Complex^ A = gcnew Complex(5,10); //Khởi tạo sốphức A = 5 + 10j.

Complex^ B = gcnew Complex(7,-10);

Complex^ C = A + B; A->Show(); B->Show(); C->Show(); } Kết quảin ra màn hình : 5 + 10j 7 + -10j 12 + 0j

Một phần của tài liệu Lập Trình C++ (Trang 35)