色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 關于C++中的友元

關于C++中的友元 時間:2017-10-26      來源:未知

1. 起源:

類實現了數據的隱藏與封裝,類的數據成員一般定義為私有成員,僅能通過類的成員函數才能讀寫。如果數據成員定義為公共的,則又破壞了封裝性。但是某些情況下,需要頻繁讀寫類的數據成員,特別是在對某些成員函數多次調用時,由于參數傳遞、類型檢查和安全性檢查等都需要時間開銷,而影響程序的運行效率。

2. 概念:

友元是一種定義在類外部的普通函數,但他需要在類體內進行說明,為了和該類的成員函數加以區別,在說明時前面加以關鍵字friend。友元不是成員函數,但是他能夠訪問類中的私有成員。友元的作用在于提高程序的運行效率,但是,他破壞了類的封裝性和隱藏性,使得非成員函數能夠訪問類的私有成員。導致程序維護性變差,因此使用友元要慎用。

友元較為實際的應用是在運算符重載,這種應用可以提高軟件系統的靈活性

3. 分類:友元函數、友元成員、友元類

4. 友元函數:

1)概念:是一種說明在類定義體內的非成員函數

2)格式:friend 返回值類型 函數名(參數表){ 函數體 }

3)說明:

A. 友元函數是在類中說明的一個函數,它不是該類的成員函數,但可以訪問該類的所有成員,它是獨立于任何類的一般的外界函數。

B. 由于不是類的成員,所以沒有this指針,訪問該類的對象的成員時必須使用對象名,而不能直接使用類的成員名。

C. 雖然友元函數是在類中說明的,但其名字的作用域在類外,作用域的開始點在說明點,結束點和類名相同

【案例1】

#include <iostream>

#include <string.h>

//普通函數可以訪問類中的私有成員

using namespace std;

class Grade

{

public:

    Grade(int ch, int ma):chinese(ch), math(ma){}

    friend void show(Grade &gr);//友元函數的說明

private:

    int chinese;

    int math;

};

void show(Grade &gr)//友元函數的實現

{

    cout << "chinese: " << gr.chinese << endl;//沒有this,只能用對象調用

    cout << "math: " << gr.math << endl;

}

int main()

{

    Grade gr(89, 90);

    show(gr);//友元函數的調用

    return 0;

}

5. 友元類:

1)概念:某個類可以是另一個類的友元,這樣作為友元的類中的所有成員函數都可以訪問另一個類中的私有成員。

2)格式:friend class 類名;

【案例2】

#include <iostream>

#include <string.h>

//其他類的所有成員函數都可以訪問此類的私有成員:Boy類中的成員函數disp可以訪問Girl類中的成員

using namespace std;

class Boy;//在類Name中需要使用類Grade,so先聲明

class Girl

{

public:

    Girl(char *n)

    {

        strcpy(name, n);

    }

private:

    char name[32];

    friend class Boy;//類Grade是類Name的友元,so在類grade中可以使用類Name的成員

};

class Boy

{

public:

    void disp(Girl &);

};

void Boy :: disp(Girl &g)

{

    cout << "name: " << g.name << endl;

}

int main()

{

    Boy b;

    Girl g("lily");

    b.disp(g);

    return 0;

}

 

3)特點:

A. 友元關系不能被繼承。

B. 友元關系是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的聲明。

C. 友元關系不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明

6. 友元成員函數:

1)概念:另一個類的成員函數可以作為某個類的友元,只是在聲明友元函數時要加上成員函數所在的類名。

2)格式:friend 類名 :: 成員函數名;

【案例3】

#include <iostream>

#include <string.h>

//其他類的一個成員函數都可以訪問此類的私有成員:Boy類中的成員函數disp可以訪問Girl類中的成員

using namespace std;

class Girl;//在類Name中需要使用類Grade,so先聲明

class Boy

{

public:

    Boy(int a):age(a){}

    void disp(Girl &);

private:

    int age;

};

class Girl

{

public:

    Girl(char *n)

    {

        strcpy(name, n);

    }

    friend void Boy :: disp(Girl &);//聲明Boy類中的成員函數為友元函數

                                   //可以訪問Girl類中的成員

private:

    char name[32];

};

void Boy :: disp(Girl &g)

{

    cout << "girl's name: " << g.name << endl;

    cout << "boy's age: " << age << endl;

}

int main()

{

    Boy b(22);

    Girl g("lily");

    b.disp(g);

    return 0;

}

上一篇:epoll的使用

下一篇:匿名共享內存

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5,京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 性饥渴的农村熟妇 | 亚洲久久超碰无码色中文字幕 | 欧美一二三四五六七区 | 18禁网站免费无遮挡无码中文 | 久久久久国产亚洲AV麻豆 | 美女高潮无遮挡免费视频 | 免费视频在线播放啪 | 四虎在线免费观看视频 | 国产精品免费久久久久软件 | 大地资源第二页中文高清版 | 老人内射视频代码免费视频 | 国产粗话肉麻对白在线播放 | 亚洲精品无码AV人在线播放 | 冲田杏梨AV一区二区三区 | 自拍视频在线播放 | 少妇做爰高潮呻吟A片免费 放荡少妇张开双腿任人玩 嫩草网站 | 国产极品熟女沙发内射AV | 最新国产成人AB网站 | 中文字幕九色自拍 | 亚洲国产成人va在线观看 | 男女啪啪激烈高潮免费动态图 | 成年美女黄网站色大全 | 国产CHINESE男男GAYGAY免费网站 | 中文精品久久久久鬼色 | 一出一进一爽一粗一大视频免费的 | 日韩不卡1卡2卡三卡免费网站2021 | 中文字幕二区人妻熟女三区 | 黑人无套内谢中国少妇杂交 | 久久久久亚洲AV无码网站 | 色六月婷婷亚洲婷婷六月 | 国内揄拍国内精品少妇国语 | 国语精品自产拍在线观看网站 | 精品乱码一区内射人妻无码 | 久久国产vs | 15小男生gay自慰脱裤子 | 西西大胆无码视频免费 | 久久精品国产色蜜蜜麻豆 | 最新69成人国产精品视频免费 | 国产精品美女一区二区视频 | 中文字幕 亚洲精品 第1页 | 国产精品久久久久久人妻精品 |