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

ฟังก์ชันที่ Overload ไม่ได้ใน C++: กฎและตัวอย่าง

ใน C++ Function Overloading ต้องการ Parameter List ที่แตกต่างกัน (Signature) โดย Return Type ไม่รวมอยู่ใน Signature บทความนี้สรุปกรณีที่ Overload ไม่ได้ แม้ Parameter ดูต่างกัน

กรณีที่ Overload ไม่ได้ (Compile Error: Redefinition)

1. แตกต่างกันแค่ Return Type

int func() { return 5; }
char func() { return 'd'; } // Error: Redefinition
// Signature เหมือนกัน: func()

2. Member Function: Static vs Non-static เหมือน Parameter


class MyClass {
    static void func(int x);  // Error
    void func(int x);         // Error: Same signature
};
// Static ไม่ใช่ส่วนหนึ่งของ Signature สำหรับ Overloading

3. Pointer vs Array Parameter (Decay to Pointer)


void func(int* arr) { }      // int* 
void func(int arr[]) { }     // Error: int[] Decay เป็น int* ใน Parameter
void func(int arr[10]) { }   // Error: ขนาด Array ถูก Ignore
// ทั้งสาม Signature เหมือนกัน: func(int*)

4. Top-level CV-Qualifiers (const/volatile บน Parameter โดยตรง)


void func(int x) { }
void func(const int x) { }   // Error: Top-level const ถูก Ignore
void func(volatile int x) { } // Error
// Parameter Passing By Value: const/volatile บน Parameter เอง ไม่ส่งผลต่อ Signature

แต่: const int& vs int& ต่างกัน (Reference to Const vs Non-const)

5. Default Arguments


void func(int a, int b) { }
void func(int a, int b = 50) { } // Error: Default Arg ไม่อยู่ใน Signature
// เรียก func(10) -> Ambiguous

กรณีที่ Overload ได้ (เพื่อเปรียบเทียบ)

กรณีตัวอย่างเหตุผล
Parameter Type ต่างกันf(int) vs f(double)Type ต่างกันจริง
จำนวน Parameter ต่างกันf(int) vs f(int, int)Arity ต่างกัน
Reference Qualifier (C++11)f() & vs f() &&Ref-Qualifier ต่างกัน
Const/Volatile บน Reference/Pointerf(const int&) vs f(int&)Qualifier บน Pointee/Referred Type
Array ขนาดต่างกัน (Reference to Array)f(int (&)[10]) vs f(int (&)[20])Type ของ Array Reference ต่างกัน

สรุป

Function Overloading ใน C++ ใช้ Parameter Type List (Signature) เพื่อแยกแยะ ไม่ได้ดู Return Type, Storage Class (static), Top-level CV-Qualifiers, Default Arguments, หรือ Array/Pointer Decay การเข้าใจกฎเหล่านี้ช่วยหลีกเลี่ยง Compile Error และออกแบบ API ที่ชัดเจน