S SmartDocs
Serie: C++ cpp 132 líneas · Actualizado 2026-04-03

overloading.cpp

C++/Part1_基礎入門/Ch04_函式/overloading.cpp

// ============================================================
// Ch04 — 函式多載(Function Overloading)
// 編譯:g++ -std=c++17 -Wall -o overloading overloading.cpp
// ============================================================

#include <iostream>
#include <string>
#include <cmath>

// ── 1. print() 多載:不同型別 ──
void print(int value) {
    std::cout << "[int]    " << value << "\n";
}

void print(double value) {
    std::cout << "[double] " << value << "\n";
}

void print(const std::string& value) {
    std::cout << "[string] " << value << "\n";
}

void print(char value) {
    std::cout << "[char]   " << value << "\n";
}

void print(bool value) {
    std::cout << "[bool]   " << (value ? "true" : "false") << "\n";
}

// ── 2. add() 多載:不同型別與參數數量 ──
int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

int add(int a, int b, int c) {
    return a + b + c;
}

std::string add(const std::string& a, const std::string& b) {
    return a + b;  // 字串串接
}

// ── 3. area() 多載:不同形狀 ──

// 圓形面積:只需半徑
double area(double radius) {
    return M_PI * radius * radius;
}

// 長方形面積:需要寬和高
double area(double width, double height) {
    return width * height;
}

// 三角形面積:底和高(用第三個參數區分)
double area(double base, double height, bool isTriangle) {
    if (isTriangle) {
        return 0.5 * base * height;
    }
    return base * height;  // 非三角形就當長方形
}

// ── 4. max() 多載 ──
int max(int a, int b) {
    return (a > b) ? a : b;
}

double max(double a, double b) {
    return (a > b) ? a : b;
}

int max(int a, int b, int c) {
    return max(max(a, b), c);  // 呼叫兩參數版本
}

// ── 主程式 ────────────────────────────────────────
int main() {
    std::cout << "===== Ch04:函式多載 =====\n\n";

    // ── 1. print() 多載示範 ──
    std::cout << "【1】print() — 不同型別的多載\n";
    print(42);
    print(3.14);
    print(std::string("你好世界"));
    print('A');
    print(true);
    std::cout << "\n";

    // ── 2. add() 多載示範 ──
    std::cout << "【2】add() — 不同型別和參數數量\n";
    std::cout << "add(3, 5)       = " << add(3, 5) << "\n";
    std::cout << "add(2.5, 3.7)   = " << add(2.5, 3.7) << "\n";
    std::cout << "add(1, 2, 3)    = " << add(1, 2, 3) << "\n";

    std::string s1 = "C++";
    std::string s2 = "真好玩";
    std::cout << "add(\"C++\", \"真好玩\") = " << add(s1, s2) << "\n\n";

    // ── 3. area() 多載示範 ──
    std::cout << "【3】area() — 不同形狀的面積計算\n";
    std::cout << "圓形(半徑 5)    = " << area(5.0) << "\n";
    std::cout << "長方形(4 x 6)   = " << area(4.0, 6.0) << "\n";
    std::cout << "三角形(底 8 高 3)= " << area(8.0, 3.0, true) << "\n\n";

    // ── 4. max() 多載示範 ──
    std::cout << "【4】max() — 不同型別和參數數量\n";
    std::cout << "max(10, 20)       = " << max(10, 20) << "\n";
    std::cout << "max(3.14, 2.72)   = " << max(3.14, 2.72) << "\n";
    std::cout << "max(5, 12, 8)     = " << max(5, 12, 8) << "\n\n";

    // ── 5. 多載的解析過程說明 ──
    std::cout << "【5】多載解析說明\n";
    std::cout << "編譯器根據以下順序選擇最佳匹配:\n";
    std::cout << "  1. 精確匹配\n";
    std::cout << "  2. 型別提升(如 char→int, float→double)\n";
    std::cout << "  3. 標準轉換(如 int→double)\n";
    std::cout << "  4. 使用者定義轉換\n\n";

    // 型別提升範例
    std::cout << "print('A') 呼叫 print(char) 而非 print(int):\n";
    print('A');

    std::cout << "\n注意:僅靠回傳型別不同無法構成多載!\n";
    std::cout << "例如 int f() 和 double f() 會造成編譯錯誤。\n";

    return 0;
}

Artículos relacionados