Lecture 9 Class (คลาส) To do: Hand back assignments Give out handouts to anybody who missed them last class Quick comments on PS3 Quick comments on grades READING: S+S: Appendix C
OBJECTIVE 1. ทราบถึงการทำงานของ Class 2. ทราบถึงการเขียนโปรแกรมเชิงวัตถุ(OOP) (Object Oriented Programming) 3. ทราบถึงการกำหนดตัวแปรแบบโครงสร้างโดยใช้Class 4. สามารถนำเอา Class ไปประยุกต์ใช้งานในการเขียนโปแกรมได้
คลาส(Class)คืออะไร Class คล้ายๆ กับ Struct ในLecture 8 แต่ความสามารถของ class นั้นมีมากกว่า struct อยู่พอสมควร จะได้ศึกษาในส่วนต่อไป
ตัวอย่างการใช้งาน Class เรียก Rational ว่าเป็น class แม่ เพราะไม่ได้สืบทอดคุณสมบัติมาจาก class ใด public: เป็นการประกาศให้ตัวแปรนี้สามารถที่จะถูกเรียกใช้งานนอกฟังก์ชันของ class ได้ class Rational { public: double money; private: int age, den; }; private: เป็นการประกาศให้ตัวแปรนี้สามารถที่จะถูกเรียกใช้งานได้เฉพาะฟังก์ชันที่อยู่ภายใน class เท่านั้น protected: เป็นการประกาศให้ตัวแปรนี้สามารถที่จะให้ class ลูกสามารถเข้าถึง ฟังก์ชันสมาชิกของ class แม่ได้
วัตถุ(Object) 9.1แนวความคิดของ OOP Method (การกระทำเป็น)ความสามารถของวัตถุนั้น เช่น -ขับได้ เร่งความเร็วได้ เบรกได้ ชนได้ Properties(คุณสมบัติ) เป็นคุณสมบัติของวัตถุนั้นๆ เช่น รถมี 4 ล้อ รถมี สี รถมีเบรก มีพวงมาลัย ฯลฯ
การสืบทอด(Inheritance) แนวความคิดของ OOP(ต่อ) การสืบทอด(Inheritance) การสืบทอดก็คล้ายๆ กับการที่เรา ก๊อป ปี้เขามานั้นเอง แต่ เราสามารที่จะเพิ่ม ความสามารถใหม่ๆ ลงไปได้ ซึ่ง Class สามารถที่ จะสืบทอดกันได้
แนวความคิดของ OOP(ต่อ) การสืบทอด(Inheritance) วัตถุ2 วัตถุ1 วัตถุ 2 สืบ ทอดทุกอย่างมาจากวัตถุ 1 วัตถุ 2 สามารถเพิ่มลูกเล่นเข้าไปได้อีก คือ เพิ่ม Method ให้สามารถยกได้ด้วย วัตถุ 2 สามารถเพิ่มลูกคุณสมบัติ เข้าไปได้อีกคือมี 6 ล้อ
ตัวอย่างการสร้าง class class Human { public: double money; int add(int x,int y) { int result; result = x+y; return result; } }; Properties มีเงิน Method บวกเลขได้ ผมบวกเลขได้น่ะ วัตถุ(Object)ในที่นี้คือคนเราสร้างให้เขามีเงินและบวกเลขได้
ตัวอย่างการนำเอา class ไปใช้งาน #include "iostream.h" class Human{ public: int money; int add(int x,int y) { int result; result = x+y; return result; } }; void main(void){ int value; Human Ob1; Ob1.money=100; value=Ob1.add(5,6); cout<<Ob1.money<<"\t"<<dd<<endl; คล้ายๆ กับเราสามารถเสก ให้ใครเป็นอะไรก็ได้ ประกาศ Object ภายใน main main อยากจะเอาไปใช้ ก็ต้องก็ต้องประกาศ คล้ายกับเรายืมของก็ต้องบอกก่อน ไม่งันยืมไม่ได้น่ะ! การใช้งานจะต้องมีเครื่องหมาย . คั่นระหว่าง object กับ สมาชิก(members)ภายใน class
ตัวอย่างการนำเอา class ไปใช้งาน #include "iostream.h" class Human{ public: int money; int add(int x,int y) { int result; result = x+y; return result; } }; void main(void){ int value; Human Ob1; Ob1.money=100; value=Ob1.add(5,6); cout<<Ob1.money<<"\t"<<dd<<endl; เรียก money และ add ว่าเป็นสมาชิก(members) ของ class ชื่อ Human แต่ money และ add ต่างกันคือ money เป็นตัวแปรส่วน add เป็นฟังก์ชัน เราเลยเรียก money ว่าเป็นตัวแปรสมาชิก(member variable) และเรียก add ว่าเป็นฟังก์ชันสมาชิก(member function)
ตัวอย่างการใช้ ClassWizard นักศึกษาจะได้รู้จักการ เพิ่ม members function และ member variable
ผมบวกเลขกับ ลบเลขได้น่ะ class Human { public: double money; int add(int x,int y) { int result; result = x+y; return result; } int sub(int x,int y) result = x-y; }; Properties มีเงิน Method บวกเลขได้ เพิ่มให้อีก ลบเลขได้ด้วย ผมบวกเลขกับ ลบเลขได้น่ะ วัตถุ(Object)ในที่นี้คือคนเราสร้างให้เขามีเงินบวกเลขและลบเลขได้
ผมยังบวกเลขกับลบเลขได้น่ะเหมือนเดิมน่ะครับ เพียงแต่เขียนอีกรูปแบบหนึ่ง เขียนให้ดูเรียบร้อยขึ้น และใช้งานง่ายขึ้นด้วย แยกออกไปไว้ต่างหาก class Human { public: double money; int add(int x,int y); int sub(int x,int y); }; int Human::add(int x,int y) { int result; result = x+y; return result; } int Human::sub(int x,int y) result = x-y; แต่จะต้องนำหน้าด้วย ชื่อ class และ เครื่องหมาย :: จะได้รู้ว่า class ใดเป็นเจ้าของ ผมยังบวกเลขกับลบเลขได้น่ะเหมือนเดิมน่ะครับ เพียงแต่เขียนอีกรูปแบบหนึ่ง
ตัวอย่างการประกาศตัวแปรแบบ private class Human { public: double money; void add(int x,int y); void sub(int x,int y); private: int x,y,result; }; void Human::add(int x,int y) { result = x+y; } void Human::sub(int x,int y) result = x-y; ตัวแปร x และ y และ result ใช้ร่วมกันได้นี่ ประกาศเป็น private แล้วกัน ลองดูว่า work ไหมน่ะ ไม่ work ก็ถาม อ.ผู้สอนแล้วกัน (ไม่ workหรอกครับ แต่เพราะอะไร) main อยู่หน้าถัดไป
ตัวอย่างการประกาศตัวแปรแบบ private void main(void) { int value; Human Ob1; Ob1.money=100; Ob1.add(5,6); cout<<Ob1.result<<"\t"<<endl; } ตัวแปร x และ y และ result ใช้ร่วมกันได้นี่ ประกาศเป็น private แล้วกัน ลองดูว่า work ไหมน่ะ ไม่ work ก็ถาม อ.ผู้สอนแล้วกัน (ไม่ workหรอกครับ แต่เพราะอะไร)
(ไม่ workหรอกครับ แต่เพราะอะไร) ทำไมแก้แบบนี้แล้ว work น่ะครับ class Human { public: double money; int result; void add(int x,int y); void sub(int x,int y); private: int x,y; }; void Human::add(int x,int y) { result = x+y; } void Human::sub(int x,int y) result = x-y; (ไม่ workหรอกครับ แต่เพราะอะไร) ทำไมแก้แบบนี้แล้ว work น่ะครับ
เพิ่มความสามารถ ของ Object เข้าไปอีก
เพิ่มให้ผมแสดงผลได้อีกด้วย class Human { public: double money; int result; void add(int x,int y); void sub(int x,int y); void print(); private: int x,y; }; void Human::add(int x,int y){ result = x+y; } void Human::sub(int x,int y){ result = x-y; void Human::print(){ cout<<“\n”<<result<<endl; เพิ่มให้ผมแสดงผลได้อีกด้วย
ส่วนการบวก ส่วนการแสดงผล void main(void) { int value; Human Ob1; Ob1.money=100; Ob1.add(5,6); Ob1.print(); } ส่วนการบวก ส่วนการแสดงผล
ถ้าไม่บวกแต่ให้แสดงผลเลยจะเกิดอะไรขึ้น void main(void) { int value; Human Ob1; Ob1.money=100; Ob1.print(); } ถ้าไม่บวกแต่ให้แสดงผลเลยจะเกิดอะไรขึ้น
คอนสตรัทเตอร์ และ เดสตรัทเตอร์ (Constructor and Destructor) Constructor เป็นฟังก์ชันหนึ่งที่มีชื่อเดียวกับชื่อ class และจะทำงานทุกๆ ครั้งเมื่อมีการประกาศ Object ส่วนใหญ่จะใช้เป็นฟังก์ชันกำหนดค่าเริ่มต้นให้กับวัตถุ Destructor เป็นฟังก์ชันหนึ่งที่มีชื่อเดียวกับชื่อ class และจะทำงานทุกๆ ครั้งเมื่อไม่มีการใช้ Object นั้นแล้ว ส่วนใหญ่จะใช้คืนค่าหน่วยความจะให้กับระบบ
#include "iostream.h" class Human{ public: int result; int money; void add(int x,int y); void sub(int x,int y); void print(); Human(){ money =0; } ~Human(){cout<<"Object is Date"<<"\n"; } private: int x,y; }; void Human::sub(int x,int y){ result = x-y; } void Human::add(int x,int y){ result = x+y; void Human::print(){ cout<<"\n"<<money<<"\n"; void main(void) { Human Ob1; Ob1.money=100; Ob1.print(); Ob1.money=200; Ob1.money=300; }
(class derive ) การสืบทอดคลาส การสืบทอดคลาส ก็กระทำได้โดยใช้คำสั่งดังต่อไปนี้ class myderivedclass:public myclass { private: int myweight; protected: int setmyweight(int newweight); public: int readmyweight(void); };
การสืบทอดคลาสใหม่ มาจากคลาสเดิม จะใช้วิธีการประกาศคลาสใหม่ แล้วตามด้วยเครื่องหมายโคลอน (:) แล้วตามด้วย คำว่า public แล้วตามด้วยชื่อคลาสเดิม ที่เราจะสืบทอดมา โดยที่คลาสใหม่ที่ได้นี้ จะคงลักษณะ ของคลาสเดิมทุกประการ และยังเพิ่ม ตัวแปร myweight และฟังก์ชั่นใหม่ ๆ คือ setmyweight() และ readmyweight() เข้าไปอีก
Inclass Lab1 ให้ทำใน โหมด Dos 1. ให้นักศึกษาเขียน Class ขึ้นมา 1 Class โดยเป็น class เกี่ยวกับสถาบัน และทดลองใช้งาน Class นั้นดูแล้วนำมาส่ง (ดูหน้า8) 2. จากข้อ 1 ให้กำหนดชนิดตัวแปรให้ต่างชนิดกัน private,public และให้แสดงการเข้าถึงตัวแปร แต่ละชนิดแล้วนำมาส่ง 3. ให้นักศึกษาเขียน ฟังก์ชันชื่อ void ShowHello()ให้อยู่ภายใน Class ข้อ1 และแสดงวิธีใช้งาน ฟังก์ชันที่อยู่ภายใน Class นั้น (โดยเมื่อเรียกใช้ฟังก์ชัน void ShowHello() ที่อยู่ภายใน class นั้นให้แสดงข้อความ “Hello KMITNB” ออกที่หน้าจอภาพ) แล้วนำมาส่ง 4. ให้นักศึกษาเขียนสืบทอด Class จากข้อ3 และทดลองใช้ฟังก์ชัน void ShowHello() ในข้อ3 (รายละเอียดเรื่องการสืบทอดดูในหน้า6,23,24) แล้วนำมาส่ง