1/ Chỉ định truy cập

Trong bài "Lớp và đối tượng trong C++", chỉ định truy cập được đề cập là publicprivate hoặc protected. Chỉ định truy cập (access specifier) xác định giới hạn có thể truy cập và sửa đổi các thành phần (phương thức và thuộc tính) của lớp.

  • public: các thành phần của lớp có thể truy cập từ bên ngoài lớp
  • private: không thể truy cập (hoặc xem) các thành phần từ bên ngoài lớp
  • protected: các thành phần không thể được truy cập từ bên ngoài lớp, tuy nhiên, chúng có thể được truy cập trong các lớp kế thừa (các em sẽ học ở bài sau)

Lưu ý:

  • Cụm từ "truy cập từ bên ngoài lớp" ở đây các em có thể hiểu là tạo một đối tượng từ lớp, rồi thao tác với các phương thức và thuộc tính mà đối tượng vừa tạo được kế thừa từ lớp.
  • Cụm từ "thành phần của lớp" có nghĩa là các phương thức và thuộc tính thuộc lớp

Ví dụ về chỉ định truy cập là private

#include <iostream>
using namespace std;

class TraiCay {
  private:
    string ten;
};

int main() {
  TraiCay mit;
  mit.ten = "Xoai ne";
  return 0;
}

Khi chạy, chương trình sẽ báo lỗi vì truy cập thuộc tính private từ bên ngoài lớp

‘std::string TraiCay::ten’ is private

Mặc định, tất cả các thành phần của lớp đều là private nếu chỉ định truy cập không được khai báo.

Ví dụ:

class TinhTong {
  int x;   // thuoc tinh private
  int y;   // thuoc tinh private
};

sẽ tương đương

class TinhTong {
 private:
  int x;   // thuoc tinh private
  int y;   // thuoc tinh private
};

2/ Tính đóng gói

Tính đóng gói được thể hiện qua chỉ định truy cập private như các em đã học ở phần trên, tức không thể truy cập (hoặc xem) các thành phần của lớp từ bên ngoài lớp. Ở đây, các em sẽ học cách truy cập (hoặc xem) các phương thức và thuộc tính là private.

Để truy cập phương thức hoặc thuộc tính private, hãy sử dụng các phương thức public bên trong lớp.

*Ví dụ truy cập thuộc tính là private

#include <iostream>
using namespace std;

class TraiCay {
  private:
    string ten;
  public:
    // Setter
    void setTen(string s) {
      ten = s;
    }
    // Getter
    string getTen() {
      return ten;
    }
};

int main() {
  TraiCay mit;
  mit.setTen("Xoai ne");
  cout << "Toi ten: " << mit.getTen();
  return 0;
}

Như vậy thuộc tính tenprivate có thể truy cập thông qua phương thức setTengetTenpublic.

*Ví dụ truy cập thuộc tính và phương thức là private

#include <iostream>
using namespace std;

class TraiCay {
  private:
    string ten;
    void inTen() {
      cout << ten;
    }
  public:
    int soLuong;  
    void inDsTraiCay() {
      cout << "Toi ten la ";
      inTen();
      cout << "\n";
      cout << "So luong con lai tren canh la ";
      cout << soLuong;
    }
  public:
    // Setter
    void setTen(string s) {
      ten = s;
    }
};

int main() {
  TraiCay mit;
  mit.setTen("Xoai"); // ten la private
  mit.soLuong = 1; // soLuong la public
  mit.inDsTraiCay();
  return 0;
}

Như vậy

  • Thuộc tính tenprivate có thể truy cập thông qua phương thức setTenpublic
  • Phương thức inTenprivate có thể truy cập thông qua phương thức inDsTraiCaypublic

Tại sao lại sử dụng tính đóng gói?

Trong thực tế, các ứng dụng lớn được viết không phải bởi một lập trình viên mà bởi một nhóm lập trình viên, không chỉ có một lớp mà có nhiều lớp khác nhau rồi kết hợp lại thành một ứng dụng hoàn chỉnh. Tính đóng gói giúp các lập trình viên kiểm soát dữ liệu trong lớp tốt hơn, giảm thiểu sự phụ thuộc lẫn nhau giữa các lớp được viết riêng.

Nếu đến đây các em vẫn chưa hiểu thì cũng không sao,
vì OOP khá trừu tượng và khó hiểu các em nhé!
cứ mạnh dạn qua bài tiếp theo nào ?