2011/10/03

C++ - Classes

จาก Data Structure ที่ผมได้กล่าวไปเมื่อคราวที่แล้ว ยังจำกันได้ไหมเอ่ย

Data Structure คือ กลุ่มของข้อมูลหลาย ๆ ชนิดมารวมอยู่ด้วยกัน
และ Class ก็เหมือน Structure คือกลุ่มของข้อมูลหลาย ๆ ชนิด แต่ยังมี Method อีกด้วย

สรุปคือ
    Data Structure = Data
    Class = Data + Methods

เพื่อความเข้าใจ ผมจะขอยกตัวอย่าง

ยังจำกันได้ไหมว่า structure ประกาศยังไง ?

struct human {
    char name[255];
    int age;
};

ถ้าเราต้องการที่จะประกาศ class เราก็แค่เปลี่ยนคำว่า struct เป็น class

class human {
    char name[255];
    int age;
};

เหมือนกันเลย แค่เปลี่ยนตัวหน้านิดเดียว

แต่ !! เมื่อเราสร้าง object (ตัวแปรของ class เราจะไม่เรียกว่าตัวแปร แต่จะเรียกว่า object แทน) ของ class human เราไม่สามารถที่จะเรียกสมาชิกในนั้นได้...

อย่างเช่น

human a;

เราจะไม่สามารถเรียก

a.name = "Name";

ได้ ทำไมถึงเป็นแบบนี้ ?

คำตอบคือ เพราะว่า class มีการปกป้องข้อมูลของตนเอง เพื่อจำกัดสิทธิ์ในการเข้าถึง

ในภาษา C++ รูปแบบสิทธิ์ของการเข้าถึงข้อมูลจะมี 3 แบบ (ใน Object Pascal มี 4 แบบ)
ได้แก่
    - private
    - public
    - protected

เมื่อเราสร้างตัวแปรใน class แล้วไม่ได้กำหนดขอบเขตการเข้าถึง มันจะถูกกำหนดให้เป็น private โดยอัตโนมัติ

เมื่อขอบเขตถูกกำหนดเป็น private ตัวแปรนั้น ๆ จะไม่สามารถถูกเข้าถึงจากภายนอกได้ เราจึงไม่สามารถเรียก a.name ได้

ถ้าเราต้องการให้ตัวแปรนั้น ๆ สามารถถูกเรียกจากภายนอกได้ เราต้องกำหนดสิทธิ์เป็น public
เราจะได้หน้าตาของ class human แบบใหม่

class human {
    public:
        char name[255];
        int age;
};

คราวนี้เราก็สามารถเรียก a.name ได้แล้ว

ถ้าเราต้องการกำหนดขอบเขตเป็น private ก็แค่ใส่ private: เข้าไป

ส่วน protected ผมขอยังไม่พูดถึงตอนนี้


แล้ว Method คืออะไร ?

ถ้าจะให้พูดง่าย ๆ เลย มันก็คือฟังก์ชันนั่นแหละ

ของดูตัวอย่าง class นี้

class triangle {
    private:
        float b, h;
    public:
        void setBase(float base)
        {
            b = base;
        }
        void setHight(float hight)
        {
            h = hight;
        }
        float getArea()
        {
            return 0.5 * b * h;
        }
};

จะเห็นว่า เราไม่สามารถจะเรียกใช้ตัวแปร b กับ h ใน class นี้ได้
แต่เราสามารถเข้าถึงผ่านทาง function ที่อยู่ใน class แทน

ทำไมถึงต้องทำแบบนี้ ?
ก็เพราะ เพื่อไม่ให้ข้อมูลถูกแก้ไขตามใจชอบ สามารถป้องกันการเปลี่ยนข้อมูลแล้วเกิดข้อผิดพลาดได้อีกด้วย

เมื่อเราจะใช้เราก็เรียกผ่านฟังก์ชันพวกนี้ เช่น

triangle s;
s.setBase(4.2);
s.setHight(6.0);
cout << s.getArea() << endl;

class จะช่วยให้การเขียนโปรแกรมมีความยืดหยุดมากขึ้น
ยังเหลืออีกหลาย ๆ เรื่องเกี่ยวกับ class ที่ผมไม่ได้ยกมาพูดตอนนี้
แต่ผมจะมาพูดให้ฟังในคราวหน้า หวังว่าทุกท่านจะสนุกกับการสร้าง class นะครับ ^_^

No comments:

Post a Comment