首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 學習手札(三):Friend、Operator Overloading 與堆疊實作

     編輯:關於C++

透過一個「運動隊伍管理」的完整範例,示範 friend 關鍵字讓非成員函式存取私有成員、輸入/輸出運算子重載(operator>>/operator<<)實現直觀的物件序列化、以及指標陣列實作固定容量堆疊的完整邏輯。

類別設計

1. Competitor(隊員)

  • 私有成員:char name[20]、int id
  • 公開存取器:getId/setId、getName/setName(strcpy 複製字串)
  • 友元運算子重載:
    • friend istream& operator>>(istream&, Competitor&):互動式輸入提示
    • friend ostream& operator<<(ostream&, Competitor&):格式化輸出

2. Team(隊伍/堆疊)

  • 資料結構:Competitor *c[5] 指標陣列(固定容量 5)
  • 狀態變數:pointer(棧頂索引)、MAX/MIN、empty/full 旗標
  • 操作:
    • push():new Competitor → cin >> *com → 存入陣列 → pointer++ → 滿檢查
    • pop():取出 c[pointer] → cout << *com → 設 NULL → pointer-- → 空檢查
    • isEmpty()/isFull()/getPointer()

完整可執行程式碼

#include <iostream>
using namespace std;

class Competitor {
    char name[20]; int id;
public:
    int getId() { return id; }
    void setId(int id) { this->id = id; }
    char* getName() { return name; }
    void setName(char *n) { strcpy(this->name, n); }

    friend istream& operator>>(istream& is, Competitor& c) {
        cout << "請輸入編號: "; is >> c.id;
        cout << "請輸入姓名: "; is >> c.name;
        return is;
    }
    friend ostream& operator<<(ostream& os, Competitor& c) {
        os << "編號: " << c.id << endl;
        os << "姓名: " << c.name << endl;
        return os;
    }
};

class Team {
    Competitor *c[5];
    int pointer, MAX, MIN;
    bool empty, full;
public:
    Team() : MAX(5), MIN(0), pointer(0), empty(false), full(false) {}
    int getPointer() { return pointer; }
    void push() {
        Competitor *com = new Competitor;
        cin >> *com;
        c[pointer] = com;
        if (++pointer >= MAX) { pointer = MAX - 1; full = true; }
    }
    void pop() {
        Competitor *com = c[pointer];
        cout << *com;
        c[pointer] = nullptr;
        if (--pointer < MIN) { pointer = MIN; empty = true; }
    }
    bool isEmpty() { return empty; }
    bool isFull() { return full; }
};

int main() {
    Team t;
    cout << "=== 隊員資料輸入 ===" << endl;
    for (int i = 1; !t.isFull(); i++) {
        cout << "第 " << i << " 位:" << endl;
        t.push();
    }
    cout << "\n=== 隊員資料輸出 (LIFO) ===" << endl;
    for (int j = t.getPointer() + 1; !t.isEmpty(); j--) {
        cout << "第 " << j << " 位:" << endl;
        t.pop();
    }
    return 0;
}

執行結果範例

=== 隊員資料輸入 ===
第 1 位:
請輸入編號: 1
請輸入姓名: a
第 2 位:
請輸入編號: 2
請輸入姓名: b
...
第 5 位:
請輸入編號: 5
請輸入姓名: e

=== 隊員資料輸出 (LIFO) ===
第 5 位:
編號: 5
姓名: e
第 4 位:
編號: 4
姓名: d
...
第 1 位:
編號: 1
姓名: a

關鍵技術點總結

  1. friend + 運算子重載:非成員函式也能存取私有資料,且語法與內建型別一致(cin >> obj)。
  2. 參考傳回:istream&/ostream& 支援鏈式呼叫(cin >> a >> b)。
  3. 指標陣列堆疊:手動 new/delete 管理物件生命週期,pointer 索引模擬棧頂。
  4. 邊界旗標:empty/full 避免上溢/下溢,pointer 歸極值而非繼續移動。
  5. 記憶體洩漏提醒:範例中 pop 未 delete com,實務應補上或改用 unique_ptr。

此範例串聯了封裝、友元、運算子重載、動態記憶體、資料結構等核心 C++ 概念,是進階入門的優良練習。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved