void foutput(ofstream fout, int m) { ... } // 編譯錯誤
void foutput(ofstream &fout, int m) { ... } // 正確
`ofstream` 繼承自 `basic_ostream` → `basic_ios`。在 `
basic_ios(const basic_ios&) = delete; // C++11 刪除
basic_ios& operator=(const basic_ios&) = delete;
早期標準庫將其聲明為 `private` 未實現,效果相同:**禁止拷貝**。
| 場景 | 參數類型 | 說明 |
|---|---|---|
| 只讀操作(輸入流) | `istream&` / `ifstream&` | 保持流狀態同步 |
| 寫入操作(輸出流) | `ostream&` / `ofstream&` | 避免拷貝,保證寫入同一目標 |
| 需轉移所有權(C++11) | `ofstream&&` + `std::move` | 罕見,通常不需要 |
// 通用:接受任意輸出流(文件、字符串、標準輸出)
void writeData(ostream& out, const vector<int>& data) {
for (int v : data) out << v << ' ';
out << '\n';
}
// 調用
ofstream fout("data.txt");
writeData(fout, vec); // 寫文件
writeData(cout, vec); // 寫控制台
ostringstream oss;
writeData(oss, vec); // 寫內存字符串
**流對象不可拷貝**,函數參數**必須用引用**(`&`)。這既是語法要求,也是資源管理正確性的體現。掌握此規則,能避免 90% 的流相關編譯錯誤與運行時崩潰。