C++ 友元函數(shù)理解

先看代碼

// 友元函數(shù)

// 你是它的好朋友锌妻,那就可以拿私有成員給好朋友

#include <iostream>

using namespace std;

class Person {
private: // 私有的age,外界不能訪問(wèn)
    int age = 0;

public:
    Person(int age) {
        this->age = age;
    }

    int getAge() {
        return this->age;
    }

    // 定義友元函數(shù) (聲明旬牲,沒(méi)有實(shí)現(xiàn))
    friend void updateAge(Person * person, int age);
};

// 友元函數(shù)的實(shí)現(xiàn)仿粹,可以訪問(wèn)所以私有成員
void updateAge(Person* person, int age) {
    // 默認(rèn)情況下:不能修改 私有的age
    // 誰(shuí)有這個(gè)權(quán)限:友元(拿到所有私有成員)
    person->age = age;
}

int main() {
    Person person = Person(9);
    updateAge(&person, 88);

    cout << person.getAge() << endl;
    return 0;
}

【你是它的好朋友,那就可以拿私有成員給好朋友】
【定義友元函數(shù)原茅,然后吭历,友元函數(shù)的實(shí)現(xiàn),可以訪問(wèn)所以私有成員】

一個(gè)相對(duì)正規(guī)的例子

頭文件

#include <iostream>

using namespace std;


#ifndef PIG_H // 你有沒(méi)有這個(gè)宏(Java 宏==常量)
#define PIG_H // 定義這個(gè)宏

class Pig {
private:
    int age;
    char * name;

public:
    // 靜態(tài)成員聲明
    static int id;

    // 構(gòu)造函數(shù)的聲明系列
    Pig();
    Pig(char *);
    Pig(char *,int);

    // 析構(gòu)函數(shù)
    ~Pig();

    // 拷貝構(gòu)造函數(shù)
    Pig(const Pig & pig);

    // 普通函數(shù) set get
    int getAge();
    char * getName();
    void setAge(int);
    void setName(char *);

    void showPigInfo() const; // 常量指針常量 只讀

    // 靜態(tài)函數(shù)的聲明
    static void changeTag(int age);

    // 不要這樣干
    // void changeTag(int age);

    // 友元函數(shù)的聲明
    friend void changeAge(Pig * pig, int age);
};

#endif // 關(guān)閉/結(jié)尾

實(shí)現(xiàn)和使用

#include "Pig.h"

// TODO  ======================  下面是 普普通通 常規(guī)操作 對(duì)象::

// 實(shí)現(xiàn)構(gòu)造函數(shù)
Pig::Pig() {
    cout << "默認(rèn)構(gòu)造函數(shù)" << endl;
}

Pig::Pig(char * name) {
    cout << "1個(gè)參數(shù)構(gòu)造函數(shù)" << endl;
}

Pig::Pig(char * name, int age) {
    cout << "2個(gè)參數(shù)構(gòu)造函數(shù)" << endl;
}

// 實(shí)現(xiàn)析構(gòu)函數(shù)
Pig::~Pig() {
    cout << "析構(gòu)函數(shù)" << endl;
}

// 實(shí)現(xiàn) 拷貝構(gòu)造函數(shù)
Pig::Pig(const Pig &pig) {
    cout << "拷貝構(gòu)造函數(shù)" << endl;
}

int Pig::getAge() {
    return this->age;
}
char * Pig::getName() {
    return this->name;
}
void Pig::setAge(int age) {
    this->age = age;
}
void Pig::setName(char * name) {
    this->name = name;
}

void Pig::showPigInfo() const {

} // 常量指針常量 只讀

// ===============================  靜態(tài) 和 友元 

// 實(shí)現(xiàn) 靜態(tài)屬性【不需要增加 static關(guān)鍵字】
int Pig::id = 878;

// 實(shí)現(xiàn)靜態(tài)函數(shù)擂橘,【不需要增加 static關(guān)鍵字】
void Pig::changeTag(int age) {

}

// 友元的實(shí)現(xiàn)
// 友元特殊:不需要關(guān)鍵字毒涧,也不需要 對(duì)象:: ,只需要保證 函數(shù)名(參數(shù))
void changeAge(Pig * pig, int age) {

}

延伸思考

// 友元類(lèi) (ImageView 私有成員  可以通過(guò)Class來(lái)訪問(wèn),但是Class操作的native C++代碼)
// ImageView 私有成員  你能訪問(wèn)它的私有成員嗎 Class
#include <iostream>

using namespace std;

class ImageView {
private:
    int viewSize;
    friend class Class; // 友元類(lèi)
};

// Java每個(gè)類(lèi)贝室,都會(huì)有一個(gè)Class契讲,此Class可以操作 ImageView私有成員(感覺(jué)很神奇)
class Class {
public:
    ImageView imageView;

    void changeViewSize(int size) {
        imageView.viewSize = size;
    }

    int getViewSize() {
        return imageView.viewSize;
    }
};

int main() {
    Class mImageViewClass;

    mImageViewClass.changeViewSize(600);

    cout << mImageViewClass.getViewSize() << endl;

    return 0;
}

我們操作java代碼,有很多時(shí)候有native的方法聲明滑频,需要下載 JDK native代碼 才能看到捡偏,也是這個(gè)道理。
為什么java 能修改私有屬性峡迷,底層C++ 友元的相關(guān)類(lèi)似操作银伟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載你虹,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末彤避,一起剝皮案震驚了整個(gè)濱河市傅物,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琉预,老刑警劉巖董饰,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異圆米,居然都是意外死亡卒暂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)娄帖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)也祠,“玉大人,你說(shuō)我怎么就攤上這事近速≌┖伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵削葱,是天一觀的道長(zhǎng)奖亚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)佩耳,這世上最難降的妖魔是什么遂蛀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任谭跨,我火速辦了婚禮干厚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘螃宙。我一直安慰自己蛮瞄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布谆扎。 她就那樣靜靜地躺著挂捅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堂湖。 梳的紋絲不亂的頭發(fā)上闲先,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音无蜂,去河邊找鬼伺糠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斥季,可吹牛的內(nèi)容都是我干的训桶。 我是一名探鬼主播累驮,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舵揭!你這毒婦竟也來(lái)了谤专?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤午绳,失蹤者是張志新(化名)和其女友劉穎置侍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體箱叁,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墅垮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耕漱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片算色。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖螟够,靈堂內(nèi)的尸體忽然破棺而出灾梦,到底是詐尸還是另有隱情,我是刑警寧澤妓笙,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布若河,位于F島的核電站,受9級(jí)特大地震影響寞宫,放射性物質(zhì)發(fā)生泄漏萧福。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一辈赋、第九天 我趴在偏房一處隱蔽的房頂上張望鲫忍。 院中可真熱鬧,春花似錦钥屈、人聲如沸悟民。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)射亏。三九已至,卻和暖如春竭业,著一層夾襖步出監(jiān)牢的瞬間智润,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工未辆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窟绷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓鼎姐,卻偏偏與公主長(zhǎng)得像钾麸,于是被迫代替她去往敵國(guó)和親更振。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容