用戶提供兩張圖片(代碼截圖),提示「錯字哪裡啊」。根據最佳回答提示:
add 函數的參數復制方式,不會修改原對象,看看書上的交換值的例子就清楚了。
友元函數雖能訪問私有成員,但參數傳遞機制遵循普通函數規則。典型錯誤代碼:
// 錯誤示範:參數按值傳遞
friend void add(MyClass obj); // 或實現時 void add(MyClass obj)
void add(MyClass obj) { // 這裡 obj 是副本
obj.data += 10; // 修改的是副本,原對象不變
}
// 正確聲明
friend void add(MyClass& obj); // 注意 &
void add(MyClass& obj) { // 引用綁定原對象
obj.data += 10; // 真正修改原對象
}
swap(int &a, int &b) 強調引用修改實參,友元函數同理。const MyClass&;需修改則用非 const 引用。#include <iostream>
using namespace std;
class Counter {
int count;
public:
Counter(int c = 0) : count(c) {}
void print() const { cout << "count = " << count << endl; }
// 友元函數聲明:使用引用參數
friend void increment(Counter& c, int delta);
friend void safeRead(const Counter& c); // 僅讀取,用 const 引用
};
// 修改原對象
void increment(Counter& c, int delta) {
c.count += delta;
}
// 僅讀取
void safeRead(const Counter& c) {
cout << "safeRead: " << c.count << endl;
// c.count = 100; // 編譯錯誤:const 引用不可修改
}
int main() {
Counter obj(5);
obj.print(); // count = 5
increment(obj, 3); // 通過友元修改
obj.print(); // count = 8
safeRead(obj); // safeRead: 8
return 0;
}
重載 operator+、operator<< 等時同樣適用:
operator+ 通常返回新對象,參數用 const T&。operator<< 第二參數用 const T&。operator>> 第二參數用 T&(需修改目標對象)。operator=、operator+= 等修改左操作數,參數用 T& 返回 T&。友元函數不是魔法,參數傳遞遵循 C++ 基礎規則。需要修改原對象 → 非 const 引用;僅讀取 → const 引用;絕不按值傳遞大對象(除非刻意複製)。下次寫友元時,先問自己:「這裡要改原對象嗎?」再決定加不加 &。