คลาสและออบเจ็ค

C++ classes

ในการเขียนโปรแกรมเชิงวัตถุ คลาสเป็น program-code-template สำหรับสร้างออบเจ็ค

ในภาษา C++ ให้เราสามารถสร้างคลาสที่มีแนวคิดขยายมากจากโครงสร้างข้อมูล คลาสสามารถถูกกำหนดโดยการใช้คำสั่ง class และมีรูปแบบดังนี้:

class class_name {
access_specifier_1:
member1;
access_specifier_2:
member2;
...
} object_names;

การสร้างคลาสคล้ายกับ structure ความแตกต่างคือคลาสสามารถมีฟังก์ชันเป็นสมาชิกของมันได้ และคลาสสามารถมีตัวกำหนดการเข้าถึง (access specifier) เพื่อควบคุมการเข้าถึงสมากชิกในออบเจ็คได้

ในภาษา C++ นี่เป็นกำหนดการเข้าถึง

  • private: member ประเภทนี้สามารถเข้าถึงได้โดยคลาสและออบเจ็คเดียวกัน และนี่เป็นค่าเริ่มต้นเมื่อเราปล่อยให้ว่าง
  • protected: member ประเภทนี้สามารถเข้าถึงได้ในคลาสเดียวกัน (friends) และ extended classes
  • public: member ประเภทนี้สามารถเข้าถึงได้ทุกส่วนของโปรแกรม

เพื่อทำให้คุณเข้าใจดีขึ้น มาดูตัวอย่างเกี่ยวกับการสร้างโดยการใช้คลาส

class Circle {
private:
int r;
public:
void setRadius (int n) { r = n;};
float area (void) { return 3.14*r*r; };
float girth (void) { return 3.14*2*r; };
} cir1;

ในตัวอย่างนี้ เราได้สร้างคลาสชื่อว่า Circle ซึ่งมันมีสมาชิกที่เป็นตัวแปรหนึ่งตัว และสมาชิกที่เป็นฟังก์ชัน 3 ตัว สมาชิกหรือตัวแปร r มีตัวกำหนดการเข้าถึงเป็น private นั้นหมายความว่าตัวแปรนี้ไม่สามารถเข้าถึงได้จากภายนอกคลาส สมาชิกสามตัวต่อมาเป็นเมธอด (หรือฟังก์ชัน) ซึ่งเป็นเหมือนกับฟังก์ชันในภาษา C++ แต่ภายในคลาสเราเรียกว่าเมธอด เมธอดเหล่านี้มีตัวควบคุมการเข้าถึงเป็นแบบ public นั่นหมายความว่ามันสามารถเข้าถึงได้จากนอกคลาส

มาดูตัวอย่างของโปรแกรมที่สร้างจากคลาสนี้

#include <iostream>
using namespace std;

class Circle {
private:
int r;
public:
void setRadius (int n) { r = n;};
float area (void) { return 3.14*r*r; };
float girth (void) { return 3.14*2*r; };
} cir1;

int main () {
int n;
cout << "Enter circle radius: ";
cin >> n;
cir1.setRadius(n);
cout << "Area " << cir1.area() << endl;
cout << "Girth " << cir1.girth() << endl;
return 0;
}

ในตัวอย่าง เราได้สร้างออบเจ็คชื่อว่าcir1 จากคลาสCircle ออบเจ็คนี้จะมีสมากชิกทุกอย่างเหมือนกับคลาสที่มันสร้างในตัวมันทั้งตัวแปรและฟังก์ชัน นั่นหมายความว่าคุณสามารถที่จะสร้างกราออบเจ็คก้ได้โดยใช้คลาสนี้ เมื่อออบเจ็คถูกสร้างแล้ว เราสามารถเข้าถึงข้อมูลภายในได้ตามของเหมาะสมตาม access specifier ของมัน มาดูตัวอย่างเมื่อเรารันโปรแกรมนี้

Enter circle radius: 8
Area 200.96
Girth 50.24

อีกตัวอย่างหนึ่งจะแนะนำให้คุณรู้จักกับตัวดำเนินการขอบเขต (::) ซึ่งเป็นเครื่องหมายเซมิโคลอนสองอัน ตัวดำเนินการนี้จะอนุญาติให้เราสามารถสร้างฟังก์ชันข้างนอกคลาสได้ เพราะว่าในคลาสนั้นเราสามารถสร้างฟังก์ชันได้เพียงหนึ่งบรรทัด เหมือนที่คุณเห็นในคลาส Circle

#include <iostream>
#include <string>
using namespace std;

class Person {
public:
string first_name, last_name;
public:
string getFullname();
string getCountry(int);
};

string Person::getFullname () {
return first_name + " " + last_name;
}

string Person::getCountry (int n) {
if (n == 1)
return "US";
else if (n == 2)
return "Canada";
else if (n == 3)
return "Ukraine";
else
return "Unknown country";}

int main() {
Person p1;
p1.first_name = "Mateo";
p1.last_name = "Marcus";

Person p2;
p2.first_name = "Thomas";
p2.last_name = "Monte";

Person p3;
p3.first_name = "Dennis";
p3.last_name = "Ritchie";

cout << p1.getFullname() << " is in " << p1.getCountry(3) << endl;
cout << p2.getFullname() << " is in " << p2.getCountry(2) << endl;
cout << p3.getFullname() << " is in " << p3.getCountry(5) << endl;
return 0;
}

ในตัวอย่างนี้ เรามีคลาส Person ซึ่งมีสมาชิกแบบตัวแปรสองตัวคือ first_name และ last_name และมีสมาชิกที่เป็นฟังก์ชันสองฟังก์ชันคือ getFullname และ getCountry สังเกตุกว่าเราไม่ได้สร้างฟังก์ชันไว้ในคลาส แต่เราย้ายมันออกมาข้างนอกคลาส เพราะว่ามันจะทำให้ง่ายกว่าในการสร้างภายในคลาสของมันเอง เพื่ออ้างถึงสมากใดๆ ข้างนอกคลาส Person เราจะใช้ตัวดำเนินการขอบเขต Persion::getFullname และ Persion::getCountry เพื่อบอกให้คอมไพเลอร์รู้ และโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้

Mateo Marcus is in Ukraine
Thomas Monte is in Canada
Dennis Ritchie is in Unknown country

คอนสตรัคเตอร์

คอนสตรัคเตอร์เป็นฟังก์ชันพิเศษที่จะถูกเรียกใช้เมื่อออบเจ็คถูกสร้าง เป้าหมายของมันเพื่อสำหรับกำหนดค่าเริ่มต้นให้กับออบเจ็ค คอนสตรัคเตอร์ใช้ชื่อเดียวกับคลาส มาดูตัวอย่างคลาสที่มีคอนสตรัคเตอร์

#include <iostream>
using namespace std;

class Circle {
public:
int r;
public:
Circle(int);
float area (void);
};

Circle::Circle(int a) {
r = a;
}

float Circle::area() {
return 3.14*r*r;
};

int main () {
Circle c1(2);
Circle c2(5);
cout << "Circle 1's area = " << c1.area() << endl;
cout << "Circle 2's area = " << c2.area() << endl;
return 0;
}

ในตัวอย่าง เราได้เปลี่ยนแปลงโค้ดบางส่วนของคลาส Circle จากตัวอย่างก่อนหน้า ในตัวอย่างนี้เราได้เพิ่มคอนสตรัคเตอร์เข้ามา คอนสตรัคเตอร์เป็นฟังก์ชันพิเศษที่มีชื่อเหมือนคลาสของมัน มันสามารถมีพารามิเตอร์จำนวนเท่าไหร่ก็ได้เหมือนฟังก์ชันทั่วไป ในตัวอย่างจะเห็นว่าเรามี 1 พารามิเตอร์คือรัศมีของวงกลมที่จะถูกกำหนดเมื่อออบเจ็คถูกสร้าง และนี่เป็นผลลัพธ์ของโปรแกรม

Circle 1's area = 12.56p
Circle 2's area = 78.5

Overloading constructors

Overloading constructors เป็นคอนสตรัคเตอร์ที่มีชื่อเดียวกันแต่มีพารามิเตอร์หรือประเภทข้อมูลที่แตกต่างกัน คอมไพเลอร์จะตัดสินใจอัตโนมัติที่จะเลือกใช้ที่มีพารามิเตอร์และประเภทข้อมูลตรงกันเมื่อออบเจ็คถูกสร้าง มาดูตัวอย่าง

Circle::Circle() {
}

Circle::Circle(float a) {
r = (int) a;}

Circle::Circle(int a) {
r = a;
}
Circle::Circle(int a, int b) {
r = a + b;
}

ในตัวอย่างเรามี 4 overloading constructors แต่ละคอนสตรัคเตอร์จะมีจำนวนพารามิเตอร์และประเภทข้อมูลที่ต่างกัน

ในบทนี้ เราได้ครอบคลุมถึงพื้นฐานเกี่ยวกับคลาสในภาษา C++ อย่างไรก็ตาม คลาสยังมีเนื้อหามากกว่านี้ ที่ยังไม่ได้กล่าวถึง


บทความเกี่ยวกับ คลาสและออบเจ็ค

String ในภาษา Java

ในบทนี้ คุณจะได้เรียนเกี่ยวกับประเภทข้อมูล String และคลาสของ String โดยละเอียด และนอกจากนี้ยังเรียนรู้ถึงวิธีการใช้เมธอดเพื่อจัดการ String ในภาษา Java String เป...

String ในภาษา Visual Basic

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับ string ในภาษา Visual Basic เพราะว่า string นั้นมีเนื้อหาและรายละเอียดค่อนข้างมากสำหรับการเขียนโปรแกรม ดังนั้นเราจึงแบ่งเนื้อหา...

คลาส ในภาษา C#

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

ออบเจ็ค ในภาษา C#

ในก่อนหน้านี้ คุณได้เรียนรู้วิธีการสร้างคลาสในภาษา C# ซึ่งเป็นพื้นฐานที่สำคัญในภาษา C# ในบทนี้คุณจะได้เรียนรู้เกี่ยวกับการนำคลาสมาสร้างออบเจ็ค คลาสจะสามารถทำงาน...

คลาสและออบเจ็ค ในภาษา Java

ในบทนี้ คุณจะได้เรียนรู้วิธีการสร้างคลาส และนำคลาสไปสร้างออบเจ็คในภาษา Java มันก็คือการเขียนโปรแกรมเชิงวัตุถุที่เราได้พูดถึงในบทก่อนหน้าการเขียนโปรแกรมเชิงวัตถุ...