日韩在线免费播放-日韩在线免费av-日韩在线免费-日韩在线毛片-国产高清不卡视频-国产高清不卡

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 關于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號

回到頂部

主站蜘蛛池模板: 韩国电影闵度允主演电影| 电影《donselya》在线观看| 爱奴记| 少妇的诱惑电影| 低糖食物一览表| 戴夫·巴蒂斯塔| 实力主义教室第三季| 金猴降妖 动漫| 749局演员表| 少年的奇幻漂流记| 台湾李丽萍十部必看电影| 招聘女服务员2| 正发生电影| 茶馆妈妈韩剧| 黄婉伶| 美国禁事| 免费微信账号密码| 实力主义教室第三季| 奇门遁甲电影免费观看完整版| 卢宇静| 美女自尉视频| 权威照片| 四大美人之貂蝉香港剧| 视频污| 黄网站免费在线播放| qq经典声音| 一路向东电影| 汪汪队100集全免费| 根在中原| 阿莫西林原研药| 除暴2 电影| 爱爱内含光在线播放| 美女写真视频网站| 九狐| 中华英雄何润东| 山上的小屋 残雪原文| 张天爱三级露全乳hd电影| 虞书欣新剧永夜星河免费观看| 林丹出轨视频| 四个月宝宝几斤才达标| 小淘气尼古拉|