friend 聲明this 指針,不能用對象調用(直接調用)class Point {
double x, y;
public:
friend double distance(Point, Point); // 僅聲明,加 friend
};
double distance(Point my1, Point my2) {
return sqrt((my1.x-my2.x)*(my1.x-my2.x) + (my1.y-my2.y)*(my1.y-my2.y));
// 直接訪問私有成員 x,y
}
friendmain 不能聲明為友元(只能被調用,不能調用他人)const 類名&(引用,避免無限遞歸)T obj2 = obj1;(初始化)、按值傳參、按值返回對象obj2 = obj1; 調用拷貝賦值運算符,非拷貝構造class Point {
int x, y;
public:
Point(Point &pf) { x = pf.x; y = pf.y; } // 類內可省略 類名::
// 或推薦 const 版本
Point(const Point &pf) { *this = pf; }
};
const 時,pf.x = 8 合法但危險(修改源對象)const 後,嘗試修改編譯報錯,保證源對象不變若未顯式定義,編譯器自動生成公有的逐成員拷貝構造(淺拷貝)。含指針/資源管理類必須自定義深拷貝。
| 特性 | 友元函數 | 拷貝構造函數 |
|---|---|---|
| 屬於類成員 | 否 | 是 |
| 訪問私有成員 | 是(需對象) | 是(隱含 this) |
| 調用方式 | 直接調用 | 隱式/顯式初始化 |
| 典型用途 | 運算符重載、跨類協作 | 對象複製、資源管理 |