/ OOP

[365 วันแห่งโปรแกรม #day15] Struct

วันที่สิบห้าของ ‪#‎365วันแห่งโปรแกรม‬ วันนี้เราจะมีคุยกันเรื่อง Struct


Struct

สำหรับคนที่เคยเขียนโปรแกรมในภาษา C มาน่าจะรู้กับกับ Struct ดีอยู่แล้ว มันก็คือข้อมูลชนิด complex ซึ่งมีส่วนประกอบเป็นกลุ่มของตัวแปร โดยเราสามารถเข้าถึงตัวแปรใน struct ได้โดยตรง เพราะมันไม่มีการกำหนด access modifier ให้ยุ่งยากซับซ้อน

ตัวอย่างของ struct สำหรับเก็บค่า GeoPoint

struct GeoPointStruct{
	int x;
	int y;
	int z; 
};

int main(){
	GeoPointStruct g;
	g.x = 10;
	g.y = 15;
	g.z = -2;
	printf("%d\n", g.x);
	printf("%d\n", g.y);
	printf("%d\n", g.z);
    
    return 0;
}

==output==
10
15
-2

ในสมัยต่อมา strcut ถูกพัฒนาขึ้นมาก โดยมันไม่ได้เป็นแค่กลุ่มของข้อมูลอีกต่อไปแล้ว เราสามารถสร้าง function ให้ struct สามารถสร้าง constructor ให้ struct ก็ยังได้

ตัวอย่างของ struct สำหรับเก็บค่า GeoPoint แบบมี constructor และ method

struct GeoPointStruct{
private:
	string name;
public:
	int x;
	int y;
	int z; 
	void setName(string _name) { 
		name = _name;
	}
	string getName() {
		return name;
	}
	GeoPointStruct(int _x, int _y, int _z){
		x = _x;
		y = _y;
		z = _z;
	}
	GeoPointStruct(){
	}
};

int main(){
	GeoPointStruct* g = new GeoPointStruct(10, 15, -2);
	g->setName("test");
	cout << g->x << endl;
	cout << g->y << endl;
	cout << g->z << endl;
	cout << g->getName().c_str() << endl;
	delete g;
    
    return 0;
}

==output==
10
15
-2
test

Struct vs Class

เมื่อเราดูตัวอย่างของ struct ที่ถูกเพิ่มความสามารถแล้ว จะพบว่ามันเหมือนกัน class ใน OO เลย!!

Class เป็นส่วนขยายของคอนซ็ปต์ data structures ใน class สามารถมี data member และ function ได้ ใน OO เราถือว่าคลาสเป็นแม่แบบของวัตถุ เราเลยเรียกสิ่งที่สร้างขึ้นจากคลาส (instantiation of a class) ว่า object (วัตถุ)

แล้วงี้ class จะต่างกับ struct ยังไง ในเมื่อทำได้เหมือนๆ กันแป๊ะ ผมพยายามแสวงหาความต่างที่ชัดเจนแล้วก็เจอนิดนึงคือ

  1. ทุก member ใน struct จะเป็น public ถ้าไม่มีการกำหนด ส่วน member ของ class จะเป็น private หรือแล้วแต่ภาษากำหนด

  2. instance ของ struct จะถูกเก็บลงบน memory ในส่วนของ stack แต่ object ของ class จะถูกเก็บลงใน heap*

*ในบางภาษา instance ของ struct และ object ของ class สามารถเก็บลงบน stack หรือ heap ก็ได้ เช่น ใน C++ ถ้า instance ไม่ได้ถูกสร้างด้วย keyword new ก็จะเก็บลง stack แต่ถ้าถูกสร้างด้วย new แล้ว ก็จะเก็บลงใน heap แทน (ถ้า instance อยู่ใน heap แล้ว หมายความว่าตัวแปรของมันจะเป็น reference-type แต่ถ้า instance อยู่ใน stack ก็จะถือเป็น value-type )

งั้นควรใช้ Struct เมื่อไหร่?

ในการเขียนโปรแกรมสมัยใหม่ ไม่มีความจำเป็นที่จะใช้ struct ด้วยประการทั้งปวง ดังนั้น struct จึงเหมาะกับการใช้งานเมื่อต้องทำงานร่วมกับระบบเก่า (plain-old-data) โดยจะใช้ได้แค่ความสามารถเรื่อง data sturcture เท่านั้น

‪#‎day15 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...