C++ Programming – Public và private members


Tiếp tục loạt bài hướng dẫn OOP C++.
Hãy theo dõi struct dưới đây:

struct DateStruct // members are public by default
{
    int month; // public by default, can be accessed by anyone
    int day; // public by default, can be accessed by anyone
    int year; // public by default, can be accessed by anyone
};
 
int main()
{
    DateStruct date;
    date.month = 10;
    date.day = 14;
    date.year= 2020;
 
    return 0;
}

Trong chương trình trên, chúng ta khởi tạo một DateStruct và sau đó chúng ta có thể truy cập trực tiếp vào các thành viên của nó để gán giá trị. Trong struct thì đây là một điều bình thường vì tất cả thành viên trong struct mặc định là public. Public members là thành viên của struct hay class mà chúng ta có thể truy cập bên ngoài struct hoặc class đó. Trong đoạn code trên, hàm main() là bên ngoài struct và chúng ta có thể truy cập trực tiếp vào các biến month, day, year bởi vì chúng public.

Hãy xem đoạn code dưới:

class DateClass // members are private by default
{
    int m_month; // private by default, can only be accessed by other members
    int m_day; // private by default, can only be accessed by other members
    int m_year; // private by default, can only be accessed by other members
};
 
int main()
{
    DateClass date;
    date.m_month = 10; // error
    date.m_day = 14; // error
    date.m_year = 2020; // error
 
    return 0;
}

Nếu bạn biên dịch đoạn code này, chương trình sẽ báo lỗi. Nguyên nhân là bởi vì tất cả thành viên của class mặc định sẽ là private. Vậy Private members là gì? Chúng là các thành viên của class mà chỉ có thể truy cập bởi các thành viên khác trong class. Hãy xem lại đoạn code trên, hàm main() không phải là thành viên của DateClass, do vậy nó không có quyền truy cập vào các thành viên private.

Mặc dù mặc định thì các thành viên của Class là private, tuy nhiên chúng ta có thể biến chúng thành public bởi một từ khóa đơn giản “public:

class DateClass
{
public: // note use of public keyword here, and the colon
    int m_month; // public, can be accessed by anyone
    int m_day; // public, can be accessed by anyone
    int m_year; // public, can be accessed by anyone
};
 
int main()
{
    DateClass date;
    date.m_month = 10; // okay because m_month is public
    date.m_day = 14;  // okay because m_day is public
    date.m_year = 2020;  // okay because m_year is public
 
    return 0;
}

Bởi vì các thành viên của DateClass lúc này đã trở thành public, nên chúng có thể được truy cập qua hàm main().

Từ khóa “public:” được gọi là Access specifiers, nó xác định quyền truy cập của các thành viên. Trong C++ có 3 access specifiers với 3 từ khóa tương ứng: public, private, protected (các bạn nhớ dấu có hai chấm “:” sau mỗi từ khóa này nhé). Trong bài viết này chúng tôi chỉ đề cập tới public và private, từ khóa protected sẽ được chúng tôi đề cập trong các bài viết sau trong phần Inheritance (kế thừa) , nhớ đón đọc nha các bạn.

Class có thể multiple access specifiers, tức là có thể có cả public, private và protected, thực tế thì 99,99% là như thế.

Nhìn chung, các biến thành viên thường được đặt là biến private, các hàm thành viên thì thường được sử dụng là public.

Hãy cùng xem đoạn code dưới, nó có cả public và private trong đó:

#include <iostream>
 
class DateClass // members are private by default
{
    int m_month; // private by default, can only be accessed by other members
    int m_day; // private by default, can only be accessed by other members
    int m_year; // private by default, can only be accessed by other members
 
public:
    void setDate(int month, int day, int year) // public, can be accessed by anyone
    {
        // setDate() can access the private members of the class because it is a member of the class itself
        m_month = month;
        m_day = day;
        m_year = year;
    }
 
    void print() // public, can be accessed by anyone
    {
        std::cout << m_month << "/" << m_day << "/" << m_year;
    }
};
 
int main()
{
    DateClass date;
    date.setDate(10, 14, 2020); // okay, because setDate() is public
    date.print(); // okay, because print() is public
 
    return 0;
}

Chương trình sẽ in ra:

10/14/2020

Chú ý rằng chúng ta không thể truy cập vào các biến m_month, m_day, m_year một cách trực tiếp từ hàm main bởi vì chúng là private.; chúng ta chỉ có thể truy cập vào chúng gián tiếp thông qua hàm public thành viên là setDate() và print().

Các thành viên public thường được gọi là public interface. Bởi vì chỉ có các thành viên public mới có thể được truy cập bên ngoài class. Các thành viên public sẽ định nghĩa cách mà chương trình sử dụng và giao tiếp với class đó. Chú ý rằng hàm main() không thể trực tiếp thiết lập giá trị và in ngày tháng năm. Class đã bảo vệ các biến private của nó rất chặt chẽ

Rất nhiều lập trình viên ưa thích việc khai báo các thành viên private trước, bởi vì các thành viên public khai báo sau sẽ sử dụng được chúng.

Tham khảo: learncpp.com

Tác giả: Boong gà

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s