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.member | Dot Operator | stu1.display() |
ptr->member | Arrow Operator | Student* p = &stu1; p->display(); |
Class::staticMember | Scope Resolution | Student::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