C++基础10-类和对象之友元函数
采用類的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時(shí)需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問(wèn)類的數(shù)據(jù)成員, 這時(shí)可以將這些函數(shù)定義為該 函數(shù)的友元函數(shù)。除了友元函數(shù)外,還有友元類, 兩者統(tǒng)稱為友元。友元的作用是提高了程序的運(yùn)行效率(即減少了類型檢查和 安全性檢查等都需要時(shí)間開(kāi)銷),但它破壞了類的封裝 性和隱藏性,使得非成員函數(shù)可以訪問(wèn)類的私有成員。 友元可以是一個(gè)函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類,該類被稱為友元 類。
友元函數(shù)沒(méi)有this指針。this指針是在指向類成員本身,但是友元函數(shù)并不在類里面,而是在類外面
1、友元函數(shù)
友元函數(shù)是可以直接訪問(wèn)類的私有成員的非成員函數(shù)。它是定義在類外的普通函數(shù),它不屬于任何類,但需要在類的定義中加以聲明,聲明時(shí)只需在友元的名稱前加上 關(guān)鍵字 friend,其格式如下:
friend 類型 函數(shù)名(形式參數(shù));
一個(gè)函數(shù)可以是多個(gè)類的友元函數(shù),只需要在各個(gè)類中分別聲明。
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的一個(gè)友元函數(shù)friend double PointDistance2(Point &p1, Point &p2); //寫(xiě)在哪個(gè)位置都o(jì)kfriend double PointManager::PointDistance3(Point &p1, Point &p2); //寫(xiě)在哪個(gè)位置都o(jì)kPoint(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; 編譯錯(cuò)誤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 //此種寫(xiě)法錯(cuò)誤 //改為友元函數(shù)類內(nèi)申明 類外實(shí)現(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 開(kāi)始,它只能出現(xiàn)在類定義中。因?yàn)橛言皇鞘跈?quán)類的成員,所以它不受其所在類的聲明區(qū)域 public private 和 protected 的影 響。通常我們選擇把所有友元聲明組織在一起并放在類頭之后.
友元的利弊:
友元不是類成員,但是它可以訪問(wèn)類中的私有成員。友元的作用在于提高程序的運(yùn)行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問(wèn) 類的私有成員。 不過(guò),類的訪問(wèn)權(quán)限確實(shí)在某些應(yīng)用場(chǎng)合顯得有些呆板,從而容 忍了友元這一特別語(yǔ)法 現(xiàn)象。
注意事項(xiàng):
(1) 友元關(guān)系不能被繼承。
(2) 友元關(guān)系是單向的,不具有交換性。若類 B 是類 A 的友元,類 A 不一定是類B 的友元,要看在類中是否有相應(yīng)的聲明。
(3) 友元關(guān)系不具有傳遞性。若類 B 是類 A 的友元,類 C 是 B 的友元,類 C 不一定 是類 A 的友元,同樣要看類中是否有相應(yīng)的聲明。
?
總結(jié)
以上是生活随笔為你收集整理的C++基础10-类和对象之友元函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++ 一个字符串只包含K和D。K表示杀
- 下一篇: C/C++混淆点-运算符短路