[OOP] Class và các thành phần trong class

Class

Class là kiểu dữ liệu người dùng tự định nghĩa. Class không chỉ giữ dữ liệu, nó còn cung cấp các hàm để xử lý các dữ liệu đó. Trong C++ ta định nghĩa một class thông qua từ khóa class.

Ví dụ:


class Person

{

private:

   string name;

   string address;

   int age;

};

Chú ý :

Không được quên dấu ‘;’ sau khai báo class.

Khi khai báo dữ liệu của class ta nên khai báo các kiểu dữ liệu có cùng kích thước gần nhau để tiết kiệm bộ nhớ.

Ví dụ:


#include <iostream>

using namespace std;

class Test1

{

private :

   char a;

   int b;

   char c;

};

class Test2

{

private:

   char a;

   char c;

   int b;

};

int main()

{

   cout << "sizeof T1 : " << sizeof(Test1) << endl;

   cout << "sizeof T2 : " << sizeof(Test2) << endl;

   return 0;

}

Kết quả:

sizeof T1 : 12

sizeof T2 : 8

Khi ta định nghĩa 1 biến của class.

Person person1;

Thì person1 được gọi là instance (1 thể hiện của lớp Person) hay cũng có thể gọi nó là 1 đối tượng (object) của lớp Person.

Hàm thành viên (Member function)

Hàm được khai báo trong class được gọi là member function của class đó. Khi khai báo hàm trong class ta có thể định nghĩa hàm ngay bên trong class đó hoặc cũng có thể có thể định nghĩa bên ngoài class. Ta truy cập đến member function thông qua đối tượng của class đó.

Ví dụ:


#include <iostream>

using namespace std;

class Person

{

public:

   void DisplayInClass()

   {

      cout << "This is function define in class" << endl;

   };

   void DisplayOutClass();

};

void Person::DisplayOutClass()

{

   cout << "This is function define out class" << endl;

}

int main()

{

   Person p1;

   p1.DisplayInClass();

   p1.DisplayOutClass();

   return 0;

}

Phạm vi truy cập

Phạm vi truy cập để xác định xem ta có thể truy cập các thành phần của class ở đâu.

Trong C++ cung cấp cho ta 3 từ khóa để xác định phạm vi truy cập : Public, ProtectedPrivate.

publicprotectedprivate
Biến, phương thức được khai báo là public thì ta có thể sử dụng ở mọi nơi.Biến, phương thức được khai báo là protected ta chỉ có thể sử sụng trong lớp đó và các lớp kế thừa từ lớp đóBiến, phương thức được khai báo là private thì chỉ có thể sử dụng trong lớp đó.
Trong C++ thì biến, phương thức mặc định được khai báo là private.

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

class Date

{

private : 

   int m_day;

   int m_month;

   int m_year;

public :

   Date(int day, int month, int year)

   {

      m_day = day;

      m_year = year;

      m_month = month;

   }

   //Cac bien m_day, m_month, m_year la private chi co the truy cap trong class

   void Display()

   {

      cout << m_day << "/" << m_month << "/" << m_year << endl;

   }

};

int main()

{

   Date D1(31, 5, 2018);

   //Ham display la public ta co the truy cap ngoai class thong qua doi tuong 
   D1.Display();

   return 0;

}

Tính đóng gói và che giấu thông tin.

Xem lại các tính chất của lập trình hướng đối tượng : Giới thiệu lập trình hướng đối tượng

Trong lập trình hướng đối tượng thì tính đóng gói (Encapsulation) và che giấu thông tin (Infomation Hiding) là người sử dụng đối tượng sẽ không biết chi tiết về đối tượng mà chỉ truy cập đối tượng thông qua các public function.

Trong C++ ta thực hiện tính đóng gói thông qua phạm vi truy cập.

Ta sẽ định nghĩa các biến thành viên của classprivate. Và cung cấp các hàm thành viên public. Người sử dụng đối tượng chỉ có thể sử dụng các hàm thành viên đã public mà không thể sử dụng trực tiếp dữ liệu của class.

Ví dụ:


#include <iostream>

using namespace std;

class Array

{

private:

   int m_arr[10];

public:

   void SetValue(int index, int value)

   {

      if (index < 0 || index >= 10)

         return;

      m_arr[index] = value;

   }

};

int main()

{

   Array arr;

   arr.SetValue(3, 4);

   return 0;

}

Trong ví dụ trên người sử dụng đối tượng muốn gán giá trị cho phần tử của mảng chỉ cần gọi hàm SetValue, không thể gán giá trị trực tiếp cho mảng và cũng không cần quan tâm hàm SetValue thực hiện như thế nào.

Những lợi ích mà tính đóng gói đem lại :

1. Các lớp được đóng gói dễ sử dụng hơn và giảm độ phức tạp của chương trình.

Ta chỉ cần quan tâm đến các hàm mà lớp đó public như kiểu dữ liệu trả về, đối số truyền vào.

2. Bảo vệ dữ liệu và ngăn chặn các lỗi có thể xảy ra khi sử dụng dữ liệu.

Như ví dụ trên khi người dùng gán giá trị trực tiếp cho

m_arr. arr.m_arr[20] = 20;

Khi đó sẽ xảy ra lỗi và cho ra kết quả không mong muốn. Ta có thể tránh điều đó bằng cách cung cấp hàm SetValue, trong hàm ta sẽ kiểm tra tính hợp lý của giá trị truyền vào.

3. Dễ debug khi xảy ra lỗi.

Cách debug trong Visual Studio : Hướng dẫn debug trong Visual Studio.

Khi chương trình xảy ra lỗi, có thể giá trị của các biến thành viên không đúng. Nếu mọi người có thể truy cập biến đó 1 cách trực tiếp thì ta rất khó debug và xem giá trị của biến đó (Vì có thể nó được dùng nhiều nơi). Nếu ta cung cấp 1 hàm public để modify giá trị cho biến đó thì ta chì cần đặt break point trong hàm đó để xem các giá trị thay đổi như nào sau mỗi lần gọi hàm.

Khi lập trình C++ ta thường dùng 2 hàm thành viên ngắn để gán và lấy giá trị của biến private là SetterGetter.

Ví dụ:


class Date

{

private:

   int m_month;

   int m_day;

   int m_year;

public:

   int getMonth()

   {

      return m_month;

   }

   void setMonth(int month)

   {

      m_month = month;

   }

   int getDay()

   {

      return m_day;

   }

   void setDay(int day)

   {

      m_day = day;

   }

   int getYear()

   {

      return m_year;

   }

   void setYear(int year)

   {

      m_year = year;

   }

};

Was this article helpful?

Leave A Comment?