總覺得應該寫一些c++方面的文章,總不能讓自己生疏了些,就先聊聊友元吧。在談到友元之前,我們先來看一下以下的程式段。
class point
private:
double x;
double y;
};
這是乙個點的類,其具有橫座標x和縱座標y兩個私有的成員變數,如果我們想要計算兩個點的距離,在不使用友元的前提下,我們只能為x和y設定兩個獲取對應變數值的介面,無疑這增加了程式的開銷。那麼,可不可以用一種方案,使得乙個函式可以直接使用到類的私有/保護的成員變數呢?這就是友元函式,我們可以將程式進行如下的修改:
class point
friend double distance(point &p1, point &p2)
private:
double x;
double y;
};
這時,我們可以順利使用distance函式計算兩點間的距離,這便是友元函式的用法。那麼,我們可以做一下猜想,可不可以讓類也使用友元這個方案呢?答案是肯定的,這便是友元類。接下來我們可以先看一下如下例子:
class tv
private:
int volume;
int channel;};
class tele
void volumeup(tv &tv)
void volumedown(tv &tv)
void channelup(tv &tv)
void channeldown(tv &tv)
};
上面這段**是錯誤的,為什麼呢?因為volume和channel是tv的私有成員變數,無法直接被tele訪問,最為簡單的方法就是將tele設定為tv的友元類,在tv類中加入
friend class tele;
這樣就可以使類tele直接訪問到tv的私有成員變數了。
當然,友元關係有一些必須要注意的地方,這是非常重要的,因為好多人混淆了它的使用範圍及約束,這裡提一下一些經常被忽略的易錯點:
1、 友元關係是單向的,而不是雙向的。
2、 友元關係不具備傳遞性,如類a是類b的友元類,類b是類c的友元類,不能證明類a是類c的友元類。
3、 友元關係無法繼承。
最後,還有一點需要強調一下,由於友元這種機制破壞了類的封裝性,所以若不是必須使用,則盡可能少用,或者用其他手段保證其封裝性。
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
C 友元 友元函式 友元類和友元成員函式
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...