C++基础10-类和对象之友元函数
采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員, 這時可以將這些函數(shù)定義為該 函數(shù)的友元函數(shù)。除了友元函數(shù)外,還有友元類, 兩者統(tǒng)稱為友元。友元的作用是提高了程序的運行效率(即減少了類型檢查和 安全性檢查等都需要時間開銷),但它破壞了類的封裝 性和隱藏性,使得非成員函數(shù)可以訪問類的私有成員。 友元可以是一個函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個類,該類被稱為友元 類。
友元函數(shù)沒有this指針。this指針是在指向類成員本身,但是友元函數(shù)并不在類里面,而是在類外面
1、友元函數(shù)
友元函數(shù)是可以直接訪問類的私有成員的非成員函數(shù)。它是定義在類外的普通函數(shù),它不屬于任何類,但需要在類的定義中加以聲明,聲明時只需在友元的名稱前加上 關(guān)鍵字 friend,其格式如下:
friend 類型 函數(shù)名(形式參數(shù));
一個函數(shù)可以是多個類的友元函數(shù),只需要在各個類中分別聲明。
2、友元類
#if 1 #include<iostream> #include<math.h> using namespace std;class Point; class PointManager { public:double PointDistance3(Point &p1, Point &p2); };class Point { public://聲明全局函數(shù) PointDistance2 是我類Point的一個友元函數(shù)friend double PointDistance2(Point &p1, Point &p2); //寫在哪個位置都okfriend double PointManager::PointDistance3(Point &p1, Point &p2); //寫在哪個位置都okPoint(int x, int y) {this->m_x = x;this->m_y = y; }int get_x() {return m_x;}int get_y() {return m_y;}private:int m_x;int m_y;}; double PointDistance1(Point &p1, Point &p2) {double dis;//int dd_x = p1.m_x - p2.m_x; 編譯錯誤int dd_x = p1.get_x() - p2.get_x();int dd_y = p1.get_y() - p2.get_y();dis = sqrt(dd_x*dd_x + dd_y*dd_y);return dis; } double PointDistance2(Point &p1, Point &p2) { //聲明為友元函數(shù)double dis;int dd_x = p1.m_x - p2.m_x;int dd_y = p1.m_y - p2.m_y;dis = sqrt(dd_x*dd_x + dd_y*dd_y);return dis; } # if 0 //此種寫法錯誤 //改為友元函數(shù)類內(nèi)申明 類外實現(xiàn) class PointManager { public:double PointDistance3(Point &p1, Point &p2) {double dis;int dd_x = p1.m_x - p2.m_x;int dd_y = p1.m_y - p2.m_y;dis = sqrt(dd_x*dd_x + dd_y*dd_y);return dis;} }; #endif//類中友元函數(shù) double PointManager::PointDistance3(Point &p1, Point &p2) {double dis;int dd_x = p1.m_x - p2.m_x;int dd_y = p1.m_y - p2.m_y;dis = sqrt(dd_x*dd_x + dd_y*dd_y);return dis; }void test01() {Point p1(1, 2), p2(2, 2);int dis = PointDistance1(p1, p2);cout << "dis:" << dis << endl; //dis:1 }void test02() {Point p1(1, 2), p2(2, 2);PointManager pm;cout << pm.PointDistance3(p1, p2) << endl; //1 } int main(void) {//test01();test02();return 0; } #endif?
3、論友元
聲明位置:
友元聲明以關(guān)鍵字 friend 開始,它只能出現(xiàn)在類定義中。因為友元不是授權(quán)類的成員,所以它不受其所在類的聲明區(qū)域 public private 和 protected 的影 響。通常我們選擇把所有友元聲明組織在一起并放在類頭之后.
友元的利弊:
友元不是類成員,但是它可以訪問類中的私有成員。友元的作用在于提高程序的運行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問 類的私有成員。 不過,類的訪問權(quán)限確實在某些應用場合顯得有些呆板,從而容 忍了友元這一特別語法 現(xiàn)象。
注意事項:
(1) 友元關(guān)系不能被繼承。
(2) 友元關(guān)系是單向的,不具有交換性。若類 B 是類 A 的友元,類 A 不一定是類B 的友元,要看在類中是否有相應的聲明。
(3) 友元關(guān)系不具有傳遞性。若類 B 是類 A 的友元,類 C 是 B 的友元,類 C 不一定 是類 A 的友元,同樣要看類中是否有相應的聲明。
?
總結(jié)
以上是生活随笔為你收集整理的C++基础10-类和对象之友元函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 一个字符串只包含K和D。K表示杀
- 下一篇: sql语句 int(11)含义误区