在解決實際問題(如書店銷售統計)前,我們需要理解如何用 C++ 定義數據結構。類(class)是 C++ 最核心的特性之一,設計初衷是讓自定義類型的操作像內置類型一樣自然。標準庫中的 istream、ostream 等皆為類類型,而非語言內置關鍵字。
Sales_item)Sales_item.h 頭文件)存儲 ISBN 並追蹤該書的銷售數量、總收入、平均售價。使用者無需關心內部實現細節,只需掌握其提供的操作介面。
#include <iostream>(尖括號)#include "Sales_item.h"(雙引號)| 操作 | 說明 |
|---|---|
item1 + item2 | 加法運算符:合併兩筆相同 ISBN 的銷售記錄 |
cin >> item | 輸入運算符:讀取 ISBN、銷量、單價 |
cout << item | 輸出運算符:輸出 ISBN、銷量、總收入、平均價 |
item1 = item2 | 賦值運算符 |
item1.same_isbn(item2) | 成員函數:檢查 ISBN 是否相同 |
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item book;
// 輸入格式:ISBN 銷量 單價
// 例:0-201-70353-X 4 24.99
std::cin >> book;
// 輸出:ISBN 銷量 總收入 平均價
// 例:0-201-70353-X 4 99.96 24.99
std::cout << book << std::endl;
return 0;
}
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item item1, item2;
std::cin >> item1 >> item2; // 讀取兩筆記錄
std::cout << item1 + item2 << std::endl; // 輸出合併結果
return 0;
}
輸入:
0-201-78345-X 3 20.00
0-201-78345-X 2 25.00
輸出:
0-201-78345-X 5 110 22
注意:相加要求 ISBN 相同,結果反映合併後的銷量、總收入與平均價。
為處理不同 ISBN 記錄,需先判斷是否可合併:
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item item1, item2;
std::cin >> item1 >> item2;
// 調用成員函數檢查 ISBN
if (item1.same_isbn(item2)) {
std::cout << item1 + item2 << std::endl;
return 0; // 成功
} else {
std::cerr << "Data must refer to same ISBN" << std::endl;
return -1; // 失敗
}
}
item1.same_isbn(item2):點運算符(.)訪問對象成員。() 傳遞參數:same_isbn(item2)。same_isbn 將參數 item2 的 ISBN 與調用對象 item1 的 ISBN 比較,返回 bool 結果。若相同則執行合併輸出,否則輸出錯誤信息並返回非零狀態碼。
類的作者定義了對象的所有合法操作(構造、賦值、運算符、成員函數等)。使用者只能通過類公開的介面操作對象,內部實現細節完全隱藏。這正是封裝的精髓:介面與實現分離。