原代碼主要錯誤
- 移位運算符輸入錯誤:
<<、>> 被輸入为全角「<<」「>>」,導致編譯失敗。
- 友元函數類外定義保留
friend:類外實現時不能加 friend 關鍵字。
- 賦值運算符
operator= 缺少類名限定:應為 Array<T>& Array<T>::operator=(const Array<T>&)。
- 加法運算符越界風險:兩數組長度不等時,按最大長度循環會訪問短數組越界下標。
修正要點
1. 友元函數正確寫法
// 類內聲明
friend Array<T> operator+(const Array<T>& a, const Array<T>& b);
// 類外定義(無 friend)
template <typename T>
Array<T> operator+(const Array<T>& a, const Array<T>& b) { ... }
2. 賦值運算符返回引用并處理自賦值
template <typename T>
Array<T>& Array<T>::operator=(const Array<T>& rhs) {
if (this == &rhs) return *this; // 自賦值檢查
delete[] A;
L = rhs.L;
A = new T[L];
for (int i=0; i<L; i++) A[i] = rhs.A[i];
return *this;
}
3. 加法運算符處理不同長度
template <typename T>
Array<T> operator+(const Array<T>& a, const Array<T>& b) {
Array<T> c;
int maxLen = (a.L > b.L) ? a.L : b.L;
c.L = maxLen;
c.A = new T[maxLen];
for (int i=0; i
其他建議
- 使用
std::vector<T> 替代手動 new[]/delete[],自動管理內存、避免泄漏。
- 拷貝構造函數參數應為
const 引用:Array(const Array<T>&)。
- 輸出運算符
operator<< 也應重載为友元。