透過一個「運動隊伍管理」的完整範例,示範 friend 關鍵字讓非成員函式存取私有成員、輸入/輸出運算子重載(operator>>/operator<<)實現直觀的物件序列化、以及指標陣列實作固定容量堆疊的完整邏輯。
char name[20]、int idgetId/setId、getName/setName(strcpy 複製字串)friend istream& operator>>(istream&, Competitor&):互動式輸入提示friend ostream& operator<<(ostream&, Competitor&):格式化輸出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
cin >> obj)。istream&/ostream& 支援鏈式呼叫(cin >> a >> b)。new/delete 管理物件生命週期,pointer 索引模擬棧頂。empty/full 避免上溢/下溢,pointer 歸極值而非繼續移動。pop 未 delete com,實務應補上或改用 unique_ptr。此範例串聯了封裝、友元、運算子重載、動態記憶體、資料結構等核心 C++ 概念,是進階入門的優良練習。