国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ 中友元函數與友元類詳解

2020-01-26 14:03:11
字體:
來源:轉載
供稿:網友

C++ 中友元函數與友元類詳解

總的來說,友元分為兩類:友元函數與友元類。友元是針對類而言,它提供了一種非類的成員函數來訪問類的非公有成員的一種機制。可以把一個函數指定為某類的友元,這個函數稱為這個類的友元函數。也可以將類A指定為類B的友元,則類A是類B的友元類,類A的所有成員函數均是類B的友元函數,均可以訪問類B的非公有成員。

        友元函數的注意事項:

        (1)友元函數不是類的成員函數,在函數體中訪問對象的成員,必須用“對象名.對象成員"方式來訪問, 友元函數可以訪問類中的所有成員(公有,私有,保護),而一般的函數只能訪問類的公有成員。

        (2)友元函數不受類中的訪問權限關鍵字的限制,可以將它放在類的公有,私有,保護部分,結果均一樣。

        (3)某類的友元函數的作用域并非該類作用域,如果該友元函數是另一類的成員函數,則其作用域為另一類的作用域,否則與一般函數相同。

        (4)友元函數破壞了面向對象設計的封裝特性。所以應該盡量少用。

        友元類

        如果某類B的成員函數會頻繁地訪問類A的數據成員,而類A的數據成員的private/protected限制造成了類B存取的麻煩,B只能通過A的Public的成員函數進行間接存取。這種情況下可以將類B作為類A的友元類,即類A向類B提供私有和保護成員的訪問權限,讓類B可以直接存取。

        友元類中的所有成員函數均可以看作是另一類的友元函數。

        友元類的聲明: friend chass 類名;

        下面是友元函數的例子

        友元函數可以在類中聲明,聲明時在函數前增加friend關鍵字,然后在類體外定義,也可以直接在類中聲明定義。這兩種方式均可。下面例子中采取的是類中聲明,類體外定義的方式。

class Point {   friend double Distance(const Point &p1, const Point &p2); //類體中聲明  public:   Point(int x, int y):x_(x), y_(y)   {};  private:   int x_;   int y_; };  //類體外定義友元函數 double Distance(const Point &p1, const Point &p2) {   double dx = p1.x_ - p2.x_; //直接訪問類的私有成員   double dy = p1.y_ - p2.y_;   return sqrt(dx*dx+dy*dy); }  int main() {   Point p1(3,4);   Point P2(6,8);   cout << Distance(p1,p2) << endl;    return 0; } 

        下面是友元類的例子:      

class Television //電視類 {   friend class TeleController;//友元類聲明    public:   Television(int volume, int chanel): volume_(volume), chanel_(chanel){}  private:   int volume_; //音量   int chanel_; //頻道 };  class TeleController //遙控器類 { public: //類中的每個成員函數都是電視類的友元函數,都可以訪問電視類的私有數據成員   void VolumeUp(Television &tv)   {     tv.volume_ += 1; //音量加1   }    void VolumeDown(Television &tv)   {     tv.volume_ -= 1;   }    void ChanelUp(Television &tv)   {     tv.chanel_ += 1; //頻道加1   }    void ChanelDown(Television &tv)   {     tv.chanel_ -= 1; //頻道減1   } };   int main() {   Television tv(1,1);   TeleController tc;   tc.ChanelUp(tv);   return 0; } 

        友元類需要注意以下幾點:

        (1)友元關系是單向的; 

        (2) 友元關系不能被傳遞: A是B的友元,B是C的友元,則A是C的友元,這種傳遞不成立

        (3) 友元關系不能繼承:   A是B的友元,A的派生類C也是B的友元,這是不成立的。

         感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宣城市| 都江堰市| 遵义县| 玛纳斯县| 丰台区| 安康市| 延长县| 资源县| 奉贤区| 扶沟县| 三穗县| 康乐县| 乌拉特后旗| 尉氏县| 伊通| 阿瓦提县| 塘沽区| 仲巴县| 兴国县| 昭苏县| 汪清县| 威远县| 灵寿县| 鱼台县| 伊金霍洛旗| 古交市| 十堰市| 陆丰市| 江川县| 浦北县| 耒阳市| 漠河县| 灌云县| 堆龙德庆县| 丽江市| 望都县| 济源市| 南雄市| 昭觉县| 横山县| 镇平县|