5.2.8  Stack theo phương pháp hướng đối tượng (2)

Bây giờ là lúc cho hai hàm thực hiện chức năng push và pop. Trong ngôn ngữ C++, một hàm thuộc kiểu này (là một hàm của class) có thể được mô tả theo hai cách khác nhau:

  • Bên trong class: Thân class chứa toàn bộ code của hàm
  • Bên ngoài class: Thân class chỉ chứa các khai báo của hàm; thân hàm được đặt bên ngoài class

Chúng tôi muốn cho bạn thấy cả hai cách làm nên đã quyết định định nghĩa hàm pop bên trong thân class Stack, hàm push sẽ được định nghĩa bên ngoài thân class Stack. Chúng ta muốn gọi các hàm này để đưa các giá trị vào và lấy các giá trị ra. Điều đó có nghĩa là cả hai hàm đều có thể truy cập được tới người dùng của class. Loại thành phần này được gọi là “public” và chúng ta phải sử dụng từ khóa để nhấn mạnh yếu tố này. Hãy xem →

Khai báo class đã hoàn tất. Dường như tất cả các thành phần của nó (cả public lẫn private) đều đã được liệt kê. Bây giờ chúng ta phải code các hàm của nó. Hàm pop đã được code trong thân class rồi, bây giờ chúng ta sẽ code nốt hàm push. Hãy xem code sau đây →

Các hàm thực hiện các hoạt động của class và đặt bên ngoài class cần phải được mô tả theo một quy tắc. Tên của chúng phải được chỉ định với tiền tố là tên của class đi kèm với toán tử “::”. Bạn không thể quên điều đó. Nếu bạn bỏ qua tiền tố đó, hàm sẽ không được coi là một phần của class. Nó sẽ là một hàm bình thường.

Lưu ý một điều quan trọng: cả hai hàm truy cập vào các biến của class mà không có bất kỳ trở ngại nào. Ngoài ra, hãy nhớ nguyên tắc sau: các thành phần của một class hoàn toàn có thể được nhìn thấy bởi các thành phần khác trong cùng class đó.


Dường như class mới của chúng ta đã sẵn sàng để được sử dụng ?

Chưa, trên thực tế là chưa thể sử dụng. Chúng ta đã quên một cái gì đó thì phải. Hãy xem: giá trị ban đầu của SP là không xác định. Điều này có nghĩa là ngăn xếp sẽ không hoạt động đúng nếu giá trị SP không bằng 0 khi bắt đầu hoạt động. Có cách nào để đảm bảo rằng các hoạt động đầu tiên được thực hiện bởi ngăn xếp là gán SP  bằng 0 hay không ?

Yes, có.

Chúng ta phải thêm một hàm khác vào class của chúng ta. Đó là một hàm rất chuyên biệt được gọi ngầm mỗi khi một ngăn xếp mới được tạo ra. Chúng tôi gọi nó là một “hàm khởi tạo” (constructor) vì nó chịu trách nhiệm cho việc xây dựng mỗi đối tượng mới của class.

Thật không may, chúng ta không thể đặt tên cho hàm này một cách tùy ý được. Tên của nó được xác định theo yêu cầu ngôn ngữ C++. Nó phải được đặt tên giống như class của nó.

Có một thực tế quan trọng khác đáng nói đến: các constructor không phải là hàm thực. Nó không có kiểu trả về (không phải kiểu trả về là void mà là không có kiểu trả về).