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++ อย่างไรก็ตาม คลาสยังมีเนื้อหามากกว่านี้ ที่ยังไม่ได้กล่าวถึง
ไม่มีความคิดเห็น:
แสดงความคิดเห็น