Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Classes และ Objects ใน C++ (พื้นฐาน OOP)

Class คือ Blueprint (แม่แบบ) หรือ User-Defined Data Type ที่รวม Data (Attributes) และ Functions (Methods) ไว้ด้วยกัน

Object คือ Instance (ตัวอย่าง) ของ Class - ตัวแปรจริงที่สร้างจาก Class มี Memory จริง

Class Definition Syntax

class ClassName {
    // Access Specifiers
    private:      // เข้าถึงได้แค่ในคลาส
        // Data Members (Attributes)
        int id;
        string name;
    
    protected:    // เข้าถึงได้ในคลาสและ Derived Class
        // ...
    
    public:       // เข้าถึงได้จากทุกที่
        // Member Functions (Methods)
        void setData(int i, string n);
        void display() const;
        
        // Constructors/Destructors
        ClassName();
        ~ClassName();
};

ตัวอย่างพื้นฐาน: Student Class

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

class Student {
private:
    int rollNo;
    string name;
    float marks;
    
public:
    // Default Constructor
    Student() : rollNo(0), name("Unknown"), marks(0.0f) {}
    
    // Parameterized Constructor
    Student(int r, string n, float m) : rollNo(r), name(std::move(n)), marks(m) {}
    
    // Setters
    void setRollNo(int r) { rollNo = r; }
    void setName(string n) { name = std::move(n); }
    void setMarks(float m) { 
        if (m >= 0 && m <= 100) marks = m;
    }
    
    // Getters
    int getRollNo() const { return rollNo; }
    string getName() const { return name; }
    float getMarks() const { return marks; }
    
    // Methods
    void display() const {
        cout << "Roll No: " << rollNo << endl;
        cout << "Name: " << name << endl;
        cout << "Marks: " << marks << endl;
    }
    
    char getGrade() const {
        if (marks >= 90) return 'A';
        if (marks >= 80) return 'B';
        if (marks >= 70) return 'C';
        if (marks >= 60) return 'D';
        return 'F';
    }
};

int main() {
    // สร้าง Objects (Instances)
    Student stu1;                    // Default Constructor
    Student stu2(1, "Harry", 91.5f); // Parameterized Constructor
    Student stu3 = stu2;             // Copy Constructor
    
    // ใช้งาน
    stu1.setRollNo(2);
    stu1.setName("Hermione");
    stu1.setMarks(95.0f);
    
    cout << "=== Student 1 ===" << endl;
    stu1.display();
    cout << "Grade: " << stu1.getGrade() << endl;
    
    cout << "\n=== Student 2 ===" << endl;
    stu2.display();
    
    cout << "\n=== Student 3 (Copy) ===" << endl;
    stu3.display();
    
    // Array of Objects
    Student classRoom[3] = {
        Student(10, "Alice", 85),
        Student(11, "Bob", 78),
        Student(12, "Charlie", 92)
    };
    
    cout << "\n=== Class Room ===" << endl;
    for (int i = 0; i < 3; i++)
        classRoom[i].display();
    
    return 0;
}

ผลลัพธ์

=== Student 1 ===
Roll No: 2
Name: Hermione
Marks: 95
Grade: A

=== Student 2 ===
Roll No: 1
Name: Harry
Marks: 91.5
Grade: A

=== Student 3 (Copy) ===
Roll No: 1
Name: Harry
Marks: 91.5
Grade: A

=== Class Room ===
Roll No: 10
Name: Alice
Marks: 85
...

Memory Layout

Stack (main):
┌─────────────────┐
│ Student stu1    │  ← Object 1 (sizeof(Student) bytes)
│  - rollNo: 2    │
│  - name: "..."  │
│  - marks: 95.0  │
├─────────────────┤
│ Student stu2    │  ← Object 2
│  - rollNo: 1    │
│  - name: "..."  │
│  - marks: 91.5  │
├─────────────────┤
│ Student stu3    │  ← Object 3 (Copy of stu2)
│  - rollNo: 1    │
│  - name: "..."  │
│  - marks: 91.5  │
└─────────────────┘

Code Segment:
  Student::display()  ← Shared by all objects (1 copy)
  Student::getGrade() ← Shared by all objects

Accessing Members

Syntax ชื่อ ตัวอย่าง
obj.memberDot Operatorstu1.display()
ptr->memberArrow OperatorStudent* p = &stu1; p->display();
Class::staticMemberScope ResolutionStudent::count

Static Members (Shared Across All Objects)


class Student {
private:
    static int count;  // Declaration
    int rollNo;
public:
    Student() { count++; rollNo = count; }
    static int getCount() { return count; }  // Static Method
};

int Student::count = 0;  // Definition (ใน Global Scope)

int main() {
    Student s1, s2, s3;
    cout << Student::getCount();  // 3
}

Const Member Functions


class Student {
    int marks;
public:
    // const แทนค่าหลัง parameter list = ไม่แก้ไข Member Variables ได้
    int getMarks() const { return marks; }  // ✓ OK
    void setMarks(int m) { marks = m; }     // Non-const
    // void setMarks(int m) const { marks = m; }  // ❌ Error
};

int main() {
    const Student cs;        // Const Object
    cs.getMarks();           // ✓ เรียก const method ได้
    // cs.setMarks(100);     // ❌ Error: ไม่สามารถเรียก non-const method
}

Best Practices

  • Encapsulation: Data Members = private, Methods = public
  • Constructor: Initialize ทุก Member (ใช้ Initializer List)
  • Const Correctness: ใส่ const ให้ Methods ที่ไม่แก้ไข State
  • Rule of 0/3/5: จัดการ Resource ให้ถูกต้อง
  • Single Responsibility: Class หนึ่งทำหน้าที่เดียว
  • Naming: Class = PascalCase, Methods/Variables = camelCase