C++ คลาสและวัตถุพร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
คลาสและอ็อบเจ็กต์ใน C++ เป็นรากฐานของการเขียนโปรแกรมเชิงวัตถุ โดยที่คลาสจะกำหนดแบบแผนของข้อมูลและฟังก์ชันสมาชิก และวัตถุคืออินสแตนซ์ที่เป็นรูปธรรมที่สร้างขึ้นจากแบบแผนนั้น

คลาสคืออะไร?
A C++ คลาสรวมข้อมูลและวิธีการจัดการข้อมูลให้เป็นหนึ่งเดียว ชั้นเรียนยังกำหนดรูปแบบของวัตถุอีกด้วย ข้อมูลและวิธีการที่มีอยู่ในชั้นเรียนเรียกว่าสมาชิกของชั้นเรียน คลาสเป็นประเภทข้อมูลที่ผู้ใช้กำหนด ในการเข้าถึงสมาชิกชั้นเรียน เราใช้อินสแตนซ์ของชั้นเรียน คุณสามารถเห็นคลาสเป็นแบบพิมพ์เขียวสำหรับออบเจ็กต์ได้
คลาสสามารถเป็นต้นแบบของบ้านได้ มันแสดงตำแหน่งและขนาดของประตู หน้าต่าง พื้น ฯลฯ จากคำอธิบายเหล่านี้ เราสามารถสร้างบ้านได้ บ้านจึงกลายเป็นวัตถุ เราสามารถสร้างบ้านได้หลายหลังจากต้นแบบนี้ นอกจากนี้ เรายังสามารถสร้างวัตถุได้หลายชิ้นจากคลาสเดียว
ในรูปด้านบน เรามีแบบบ้านเดี่ยว จากต้นแบบนี้ เราได้สร้างบ้านสองหลังที่มีคุณสมบัติที่แตกต่างกัน
เมื่อมีแนวคิดเรื่องคลาสเป็นเหมือนพิมพ์เขียวแล้ว ขั้นตอนต่อไปคือการดูวิธีการประกาศคลาสในโค้ด
ประกาศชั้นเรียน
In C++คลาสจะถูกกำหนดโดยใช้คีย์เวิร์ด `class` ตามด้วยชื่อคลาส จากนั้นจึงเพิ่มส่วนเนื้อหาของคลาสไว้ระหว่างวงเล็บปีกกา `{ }`
วากยสัมพันธ์
class class-name { // data // functions };
- การขอ ชื่อคลาส คือชื่อที่จะใช้กำหนดให้กับคลาส
- การขอ ข้อมูล คือข้อมูลสำหรับคลาส ซึ่งโดยปกติจะประกาศเป็นตัวแปร
- การขอ ฟังก์ชั่น คือฟังก์ชันของคลาส
การประกาศชื่อคลาสและโครงสร้างคลาสย่อมทำให้เกิดคำถามว่า ใครบ้างที่จะสามารถใช้งานสมาชิกแต่ละตัวได้
คำหลักส่วนตัวและสาธารณะ
คุณต้องเจอคำหลักทั้งสองนี้ พวกมันเป็นตัวดัดแปลงการเข้าถึง
ส่วนตัว:
เมื่อใช้คีย์เวิร์ดส่วนตัวเพื่อกำหนดฟังก์ชันหรือคลาส คำสำคัญจะกลายเป็นคีย์เวิร์ดส่วนตัว สามารถเข้าถึงได้จากภายในชั้นเรียนเท่านั้น
สาธารณะ:
ในทางกลับกัน คีย์เวิร์ดสาธารณะจะทำให้ข้อมูล/ฟังก์ชันเป็นแบบสาธารณะ สิ่งเหล่านี้สามารถเข้าถึงได้จากนอกชั้นเรียน
หลังจากสร้างคลาสแล้ว สามารถสร้างอ็อบเจ็กต์จากคลาสนั้นได้ เช่นเดียวกับการสร้างตัวแปรจากชนิดข้อมูล
นิยามวัตถุ
อ็อบเจ็กต์ถูกสร้างขึ้นจากคลาส อ็อบเจ็กต์ของคลาสจะถูกประกาศในลักษณะเดียวกับการประกาศตัวแปร โดยชื่อคลาสต้องมาก่อน ตามด้วยชื่ออ็อบเจ็กต์ อ็อบเจ็กต์นั้นจะมีประเภทตามคลาส
วากยสัมพันธ์
class-name object-name;
- การขอ ชื่อคลาส คือชื่อของคลาสที่จะใช้สร้างอ็อบเจ็กต์
- การขอ วัตถุชื่อ คือชื่อที่จะกำหนดให้กับวัตถุใหม่
กระบวนการสร้างวัตถุจากคลาสนี้เรียกว่าการสร้างอินสแตนซ์
เมื่อสร้างอ็อบเจ็กต์แล้ว สมาชิกสาธารณะของอ็อบเจ็กต์นั้นสามารถเข้าถึงได้โดยตรงผ่านตัวดำเนินการอย่างง่าย
การเข้าถึงข้อมูลสมาชิก
ในการเข้าถึงสมาชิกสาธารณะของคลาส เราใช้ตัวดำเนินการ (.)dot สมาชิกเหล่านี้ถูกทำเครื่องหมายด้วยตัวปรับแต่งการเข้าถึงสาธารณะ
1 ตัวอย่าง
#include <iostream> using namespace std; class Phone { public: double cost; int slots; }; int main() { Phone Y6; Phone Y7; Y6.cost = 100.0; Y6.slots = 2; Y7.cost = 200.0; Y7.slots = 2; cout << "Cost of Huawei Y6 : " << Y6.cost << endl; cout << "Cost of Huawei Y7 : " << Y7.cost << endl; cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl; cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl; return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- ประกาศคลาสชื่อ Phone
- การใช้ตัวแก้ไขการเข้าถึงสาธารณะเพื่อทำเครื่องหมายตัวแปรที่เรากำลังจะสร้างว่าเข้าถึงได้แบบสาธารณะ
- ประกาศต้นทุนตัวแปรของชนิดข้อมูล double
- ประกาศตัวแปรจำนวนเต็มชื่อสล็อต
- จุดสิ้นสุดของเนื้อหาชั้นเรียน
- การเรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหา
- สร้างวัตถุชื่อ Y6 ประเภท Phone สิ่งนี้เรียกว่าการสร้างอินสแตนซ์
- สร้างวัตถุชื่อ Y7 ประเภท Phone สิ่งนี้เรียกว่าการสร้างอินสแตนซ์
- เข้าถึงต้นทุนตัวแปร/สมาชิกของคลาส Phone โดยใช้อ็อบเจ็กต์ Y6 ค่านี้ตั้งไว้ที่ 100.0 ตอนนี้ราคาของ Y6 ตั้งไว้ที่ 100.0
- เข้าถึงสล็อตตัวแปร/สมาชิกของคลาส Phone โดยใช้อ็อบเจ็กต์ Y6 ค่านี้ตั้งไว้ที่ 2 ช่องสำหรับ Y6 ตอนนี้ตั้งเป็น 2
- เข้าถึงต้นทุนตัวแปร/สมาชิกของคลาส Phone โดยใช้อ็อบเจ็กต์ Y7 ค่านี้ตั้งไว้ที่ 200.0 ตอนนี้ราคาของ Y7 ตั้งไว้ที่ 200.0
- เข้าถึงสล็อตตัวแปร/สมาชิกของคลาส Phone โดยใช้อ็อบเจ็กต์ Y7 ค่านี้ตั้งไว้ที่ 2 ช่องสำหรับ Y7 ตอนนี้ตั้งเป็น 2
- พิมพ์ราคา Y6 บนคอนโซลพร้อมกับข้อความอื่นๆ
- พิมพ์ราคา Y7 บนคอนโซลพร้อมกับข้อความอื่นๆ
- พิมพ์จำนวนช่องสำหรับ Y6 ควบคู่ไปกับข้อความอื่น
- พิมพ์จำนวนช่องสำหรับ Y7 ควบคู่ไปกับข้อความอื่น
- โปรแกรมจะต้องส่งคืนค่าเมื่อดำเนินการเสร็จสิ้น
- ส่วนท้ายของฟังก์ชัน main()
สมาชิกสาธารณะสามารถเข้าถึงโค้ดจากภายนอกได้ แต่สมาชิกส่วนตัวต้องปฏิบัติตามกฎการเข้าถึงที่เข้มงวดกว่ามาก
ชั้นเรียนส่วนตัวคืออะไร?
สมาชิกคลาสที่ทำเครื่องหมายว่าเป็นส่วนตัวสามารถเข้าถึงได้โดยฟังก์ชันที่กำหนดไว้ภายในคลาสเท่านั้น วัตถุหรือฟังก์ชันใด ๆ ที่กำหนดไว้นอกคลาสไม่สามารถเข้าถึงสมาชิกดังกล่าวได้โดยตรง สมาชิกคลาสส่วนตัวสามารถเข้าถึงได้โดยฟังก์ชันสมาชิกและเพื่อนเท่านั้น
2 ตัวอย่าง
#include <iostream> using namespace std; class ClassA { public: void set_a(int val); int get_a(void); private: int a; }; int ClassA::get_a(void) { return a; } void ClassA::set_a(int val) { a = val; } int main() { ClassA a; a.set_a(20); cout << "Value of a is: " << a.get_a(); return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างคลาสชื่อ ClassA
- ใช้ตัวแก้ไขการเข้าถึงสาธารณะเพื่อทำเครื่องหมายสมาชิกชั้นเรียนที่จะสร้างให้เข้าถึงได้แบบสาธารณะ
- สร้างฟังก์ชันชื่อ set_a() ที่รับค่า val จำนวนเต็มหนึ่งค่า
- สร้างฟังก์ชันชื่อ get_a()
- ใช้ตัวแก้ไขการเข้าถึงส่วนตัวเพื่อทำเครื่องหมายสมาชิกคลาสที่จะสร้างว่าสามารถเข้าถึงได้แบบส่วนตัว
- ประกาศตัวแปรจำนวนเต็มชื่อ a
- จุดสิ้นสุดของเนื้อหาชั้นเรียน
- ใช้ชื่อคลาสและตัวดำเนินการการแก้ไขขอบเขตเพื่อเข้าถึงฟังก์ชัน get_a() เราต้องการกำหนดว่าฟังก์ชันทำอะไรเมื่อเรียกใช้
- ฟังก์ชัน get_a() ควรส่งคืนค่าของตัวแปร a เมื่อถูกเรียกใช้
- สิ้นสุดคำจำกัดความของฟังก์ชัน get_a()
- ใช้ชื่อคลาสและตัวดำเนินการการแก้ไขขอบเขตเพื่อเข้าถึงฟังก์ชัน set_a() เราต้องการกำหนดว่าฟังก์ชันทำอะไรเมื่อเรียกใช้
- การกำหนดค่าของตัวแปร val ให้กับตัวแปร a
- สิ้นสุดคำจำกัดความของฟังก์ชัน set_a()
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างอินสแตนซ์ของ ClassA และตั้งชื่อให้ว่า a
- ใช้อินสแตนซ์คลาสด้านบนและฟังก์ชัน set_a() เพื่อกำหนดค่า 20 ให้กับตัวแปร a
- พิมพ์ข้อความข้างค่าของตัวแปร a บนคอนโซล ค่าของตัวแปร a ได้มาจากการเรียกใช้ฟังก์ชัน get_a()
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
สมาชิกที่ได้รับการคุ้มครองอยู่ระหว่างสมาชิกส่วนตัวและสมาชิกสาธารณะ ซึ่งเป็นการเพิ่มขีดความสามารถที่สำคัญประการหนึ่งสำหรับการสืบทอดมรดก
คลาสที่ได้รับการคุ้มครองคืออะไร?
สมาชิกชั้นเรียนที่ทำเครื่องหมายว่าได้รับการคุ้มครองจะมีข้อได้เปรียบเหนือสมาชิกชั้นเรียนที่ทำเครื่องหมายว่าเป็นส่วนตัว สามารถเข้าถึงได้โดยฟังก์ชันภายในคลาสของคำจำกัดความ นอกจากนี้ยังสามารถเข้าถึงได้จากคลาสที่ได้รับ
3 ตัวอย่าง
#include <iostream> using namespace std; class ParentClass { protected: int value; }; class ChildClass : public ParentClass { public: void setId(int x) { value = x; } void displayValue() { cout << "Value is: " << value << endl; } }; int main() { ChildClass c; c.setId(21); c.displayValue(); return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างคลาสชื่อ ParentClass
- ใช้ตัวแก้ไขการเข้าถึงที่ได้รับการป้องกันเพื่อทำเครื่องหมายสมาชิกคลาสที่จะสร้างว่าได้รับการป้องกัน
- สร้างตัวแปรชื่อค่าจำนวนเต็ม
- จุดสิ้นสุดของเนื้อหาชั้นเรียน
- สร้างคลาสใหม่ชื่อ ChildClass ที่สืบทอด ParentClass
- ใช้ตัวแก้ไขการเข้าถึงที่ได้รับการป้องกันเพื่อทำเครื่องหมายสมาชิกคลาสที่จะสร้างให้เข้าถึงได้ในคลาสย่อย
- สร้างฟังก์ชันชื่อ setId() ซึ่งรับค่าจำนวนเต็ม x หนึ่งค่า
- การกำหนดค่าของตัวแปร x ให้กับค่าตัวแปร
- สิ้นสุดคำจำกัดความของฟังก์ชัน setId()
- สร้างฟังก์ชันชื่อ displayValue()
- พิมพ์ค่าของตัวแปรที่ระบุชื่อค่าบนคอนโซลควบคู่ไปกับข้อความอื่น
- ส่วนท้ายของฟังก์ชัน displayValue()
- ส่วนท้ายของคลาสชื่อ ChildClass
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างอินสแตนซ์ของ ChildClass และตั้งชื่อให้ว่า c
- ใช้อินสแตนซ์คลาสด้านบนและฟังก์ชัน setId() เพื่อกำหนดค่า 21 ให้กับตัวแปร x
- ใช้อินสแตนซ์คลาสข้างต้นเพื่อเรียกใช้ฟังก์ชันชื่อ displayValue()
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
นอกจากจะจัดเก็บข้อมูลแล้ว คลาสยังจัดกลุ่มฟังก์ชันที่ทำงานกับข้อมูลเหล่านั้นไว้ด้วย
ฟังก์ชั่นสมาชิกชั้นเรียน
ฟังก์ชันช่วยให้เราจัดการข้อมูลได้ ฟังก์ชันสมาชิกของคลาสสามารถกำหนดได้สองวิธี:
- ภายในคำจำกัดความของชั้นเรียน
- นอกคำจำกัดความของชั้นเรียน
หากต้องกำหนดฟังก์ชันภายนอกคำจำกัดความของคลาส เราต้องใช้ตัวดำเนินการการแก้ไขขอบเขต (::) โดยควรมาพร้อมกับชื่อคลาสและฟังก์ชัน
4 ตัวอย่าง
#include <iostream> #include <string> using namespace std; class Guru99 { public: string tutorial_name; int id; void printname(); void printid() { cout << "Tutorial id is: "<< id; } }; void Guru99::printname() { cout << "Tutorial name is: " << tutorial_name; } int main() { Guru99 guru99; guru99.tutorial_name = "C++"; guru99.id = 1001; guru99.printname(); cout << endl; guru99.printid(); return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ไว้ในโปรแกรมของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสตริงในโปรแกรมของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างคลาสชื่อ Guru99.
- ใช้ตัวแก้ไขการเข้าถึงสาธารณะเพื่อทำเครื่องหมายสมาชิกคลาสที่เรากำลังจะสร้างให้สามารถเข้าถึงได้จากภายนอก
- สร้างตัวแปรสตริงชื่อ Tutorial_name
- สร้างตัวแปรจำนวนเต็มชื่อ id
- สร้างฟังก์ชันชื่อ printname() ฟังก์ชันนี้ไม่ได้ถูกกำหนดไว้ภายในคำจำกัดความของคลาส
- สร้างฟังก์ชันชื่อ printid() ฟังก์ชันนี้ถูกกำหนดไว้ภายในนิยามของคลาส และส่วนเนื้อหาของฟังก์ชันก็ถูกเพิ่มไว้ภายในนิยามของคลาสเช่นกัน
- พิมพ์ค่าของตัวแปร id ควบคู่ไปกับข้อความอื่นๆ บนคอนโซล โปรดทราบว่าสิ่งนี้ได้ถูกเพิ่มเข้าไปในเนื้อหาของฟังก์ชัน printid() มันจะถูกดำเนินการเมื่อมีการเรียกใช้ฟังก์ชัน printid() เท่านั้น
- ส่วนท้ายของฟังก์ชัน printid()
- จบส่วนเนื้อหาของคลาส Guru99.
- จุดเริ่มต้นของคำจำกัดความของฟังก์ชัน printname()
- พิมพ์ค่าของตัวแปร Tutorial_name บนคอนโซลควบคู่ไปกับข้อความอื่นๆ โปรดทราบว่าสิ่งนี้ได้ถูกเพิ่มเข้าไปในเนื้อหาของฟังก์ชัน printname() มันจะถูกดำเนินการเมื่อมีการเรียกใช้ฟังก์ชัน printname() เท่านั้น
- สิ้นสุดคำจำกัดความของฟังก์ชัน printname()
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างอินสแตนซ์ของคลาส Guru99 และตั้งชื่อว่า guru99
- ใช้ตัวอย่างข้างต้นเพื่อกำหนดค่าเป็น C++ ไปที่ตัวแปร Tutorial_name
- ใช้อินสแตนซ์ guru99 เพื่อกำหนดค่า 1001 ให้กับรหัสตัวแปร
- ใช้อินสแตนซ์ guru99 เพื่อเรียกใช้ฟังก์ชัน printname()
- เรียกคำสั่ง end (end line) เพื่อพิมพ์บรรทัดว่างใหม่บนคอนโซล
- ใช้อินสแตนซ์ guru99 เพื่อเรียกใช้ฟังก์ชัน printid()
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
ฟังก์ชันสมาชิกพิเศษสองฟังก์ชันจะทำงานโดยอัตโนมัติเมื่อมีการสร้างวัตถุและเมื่อมีการทำลายวัตถุ
ตัวสร้างและผู้ทำลาย
ตัวสร้างคืออะไร?
คอนสตรัคเตอร์เป็นฟังก์ชันพิเศษที่ใช้ในการเริ่มต้นค่าให้กับอ็อบเจ็กต์ C++ คอมไพเลอร์ เมื่อสร้างอ็อบเจ็กต์ เราจะเรียกใช้คอนสตรัคเตอร์ คอนสตรัคเตอร์ช่วยในการกำหนดค่าให้กับสมาชิกของคลาส แน่นอนว่าหลังจากที่ได้จัดสรรพื้นที่หน่วยความจำให้กับสมาชิกเหล่านั้นแล้ว
ตัวทำลาย (Destructor) คืออะไร?
ในทางกลับกัน Destructors ช่วยในการทำลายวัตถุของคลาส
ชื่อ Constructor ต้องคล้ายกับชื่อคลาส ตัวสร้างไม่มีประเภทการส่งคืน
ตัวสร้างสามารถกำหนดได้ภายในหรือภายนอกตัวคลาส หากกำหนดไว้ภายนอกตัวคลาส ควรกำหนดด้วยชื่อคลาสและตัวดำเนินการแก้ไขขอบเขต (::)
5 ตัวอย่าง
#include <iostream> using namespace std; class ClassA { public: ClassA() { cout << "Class constructor called"<<endl; } ~ClassA() { cout << "Class destructor called"<<endl; } }; int main() { ClassA a; int p = 1; if (p) { ClassA b; } }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างคลาสชื่อ ClassA
- ใช้ตัวแก้ไขการเข้าถึงสาธารณะเพื่อทำเครื่องหมายสมาชิกที่เรากำลังจะสร้างว่าเข้าถึงได้แบบสาธารณะ
- สร้าง Constructor สำหรับชั้นเรียน
- ข้อความที่จะพิมพ์บนคอนโซลเมื่อมีการเรียกตัวสร้าง จุดสิ้นสุดคือ a C++ คำสำคัญซึ่งหมายถึงบรรทัดสิ้นสุด มันเลื่อนเคอร์เซอร์ของเมาส์ไปที่บรรทัดถัดไป
- ส่วนท้ายของตัวสร้างคลาส
- สร้างตัวทำลายล้างสำหรับชั้นเรียน
- ข้อความที่จะพิมพ์บนคอนโซลเมื่อมีการเรียก destructor จุดสิ้นสุดคือ a C++ คำสำคัญซึ่งหมายถึงบรรทัดสิ้นสุด มันเลื่อนเคอร์เซอร์ของเมาส์ไปที่บรรทัดถัดไป
- ส่วนปลายของตัวผู้ทำลายล้าง
- จุดสิ้นสุดของเนื้อหาชั้นเรียน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างคลาสอ็อบเจ็กต์และตั้งชื่อให้กับมันว่า a ตัวสร้างจะถูกเรียก
- สร้างตัวแปรจำนวนเต็มชื่อ p และกำหนดค่าเป็น 1
- สร้างบล็อกคำสั่ง if โดยใช้ตัวแปร p
- สร้างคลาสอ็อบเจ็กต์และตั้งชื่อให้ว่า b ผู้ทำลายล้างจะถูกเรียก
- ส่วนท้ายของคำสั่ง if
- ส่วนท้ายของฟังก์ชัน main()








