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