Constructor Destructor

3.1. ตัวสร้าง Constructor

Constructor คือฟังก์ชันที่ถูกเรียกขณะทำการสร้าง instance (หรือ object) โดยชื่อฟังก์ชันจะต้องชื่อเดียวกับคลาสและไม่มีการ return

        class Rect{
            public:
                int width,height;
                Rect(int w, int h){
                    width=w; height=h;
                }
                int getArea(){
                    return width*height;
                }
        };

        int main(){
            Rect myrect(2,3);
            cout<<"myrect.area() is "<<myrect.getArea();
            return 0;
        }

output

myrect.area() is 6

3.2. ตัวทำลาย Destructor

Deconstructor คือฟังก์ชันขณะที่ทำลายคลาสและคืนหน่วยความจำ(deallocation)

        class Rect{
            public:
                int width,height;
                Rect(int w, int h){ width=w; height=h; }
                ~Rect(){ 
                    cout<<"Removing\n";
                }
                int getArea(){ return width*height; }
        };

        int main(){
            Rect myrect(2,3);
            cout<<"myrect.area() is "<<myrect.getArea()<<endl;
            return 0;
        }

output

myrect.area() is 6
Removing

3.3. ตัวเข้าถึงและตัวแก้ไข Accessors and Modifiers (Setter/Getter)

  • Accessors (หรือบ้างครั้งเรียกว่า Getter) ใช้เพื่ออ่านค่า Attributes จากภายนอกคลาส

  • Modifiers (หรือบ้างครั้งเรียกว่า Setter หรือ Mutator) ใช้เพื่อกำหนดค่าของ Attributes จากภายนอกคลาส

        class Obj{
            public:
                float getMass(){
                    return mass;
                }
                void setMass(float m){
                    mass=m;
                }
            private:
                float mass;
        };
        int main(){
            Obj stone;
            stone.setMass(5);
            cout<<"Mass is "<<stone.getMass()<<endl; //cannot access getArea()
            return 0;
        }

output

Mass is 5

3.4 Static

static เขียนหน้าตัวแปรเมื่อต้องการ allocation เพียงครั้งเดียว ซึ่งจะให้ผลเฉพาะเมื่อใช้ใน function และ class

3.4.1 Static variable in function

เมื่อใช้เขียนหน้าตัวแปรใน function ตัวแปรนั้นจะจำค่าเดิมไว้สำหรับการเรียกใช้ครั้งหน้า

        #include<iostream>
        using namespace std;
        int myFunc();
        int main(){
            cout<<myFunc()<<endl;
            cout<<myFunc()<<endl;
            cout<<myFunc()<<endl;
            cout<<myFunc()<<endl;
        }
        int myFunc(){
            static int x=0;
            return x++;
        }

output

0
1
2
3

3.4.2 static data member in class

เมื่อใช้เขียนหน้าตัวแปรในคลาส ตัวแปรนั้นจะแชร์ให้ทุก instances ที่เป็นคลาสประเภทเดียวกันเข้าถึงได้ สังเกตการกำหนดค่าเริ่มต้น int Obj::x=5; อยู่นอกคลาส

        #include<iostream>
        using namespace std;
        class Obj{
          public:
            static int x;
            void setX(int _x){
                x=_x;
            }
            int getX();
        };
        int Obj::x=5;
        int main(){
            Obj myobj1;
            Obj myobj2;
            myobj1.setX(7);
            cout<<"myobj1.x: "<<myobj1.x<<endl;
            cout<<"myobj2.x: "<<myobj2.x<<endl;

            myobj1.setX(13);
            cout<<"myobj1.x: "<<myobj1.x<<endl;
            cout<<"myobj2.x: "<<myobj2.x<<endl;
            return 0;
        }
        int Obj::getX(){
            return x;
        }

output

Running /home/ubuntu/workspace/code32_static_class.cpp
myobj1.x: 7
myobj2.x: 7
myobj1.x: 13
myobj2.x: 13

3.5 Constant function

const หลังฟังก์ชันเพื่อไม่ให้แก้ไข data member ในคลาส

        #include<iostream>
        using namespace std;

        class Obj{
          public:
            int x;
            mutable int y;
            //const int z=4; wont compile
            void setX(int _x) {
                x=_x;
            }
            void setY(int _y) const{
                y=_y;
                const int beta=8;
            }
        };
        int main(){
            Obj obj1;
            obj1.setX(5);
            obj1.setY(7);
            const int alpha=4;
            cout<<"x,y :"<<obj1.x<<","<<obj1.y<<endl;
            cout<<"alpha: "<<alpha<<endl;
            return 0;
        }

output

Running /home/ubuntu/workspace/code33_mutable.cpp
x,y :5,7
alpha: 4

results matching ""

    No results matching ""