C++友元

友元包括友元函數和又元類

友元函數

友元函數是指某些雖然不是類成員卻能夠訪問類的所有成員的函數。類授予它的友元特別的訪問權。通常同一個開發者會出於技術和非技術的原因,控制類的友元和成員函數(否則當你想更新你的類時,還要徵得其它部分的擁有者的同意)。

普通友元函數

語法:
聲明位置:公有私有均可,常寫爲公有
聲明形式: friend + 普通函數聲明
實現位置:可以在類外或類中
實現代碼:在類外實現與普通函數相同(不加friend和類::)
一般特性:類似普通函數,可直接調用

如下面代碼所示:

class Boy
{
    private:
       string name;
       int age;
    public:
       Boy(string sName, int iAge)
       {
           name = sName;
           age = iAge;
       }
       //內部聲明需要加friend
       friend void makefriend(const Boy&b1,const Boy&b2);
};
void makefriend(const Boy&b1, const Boy&b2)
{
    cout<< "One boy's name is "<<b1.name<<", age is "<<b1.age<<endl;//訪問對象中的private成員暢通無阻
    cout << "The other boy's name is "<<b2.name<<", age is "<<b2.age<<endl;
    cout << b1.name<<" and "<<b2.name<<" will make friends with each other."<<endl;
}

void testNormalFriend()
{
    Boy b1("Positive",23);
    Boy b2("persist",22);
    makefriend(b1, b2);//直接調用友元函數
}

其它類的成員函數作友元

語法:
聲明位置:聲明在公有域裏
聲明形式:friend + 成員函數的聲明

如下面的代碼

class Girl;
class Boy
{
    private:
       string name;
       int age;
    public:
       Boy(string sName, int iAge)
       {
           name = sName;
           age = iAge;
       }
       //成員函數
       void makeCouple(const Girl&);
};
class Girl
{ 
    private:
        string name;
        int age;
    public:
        Girl(string sName, int Iage)
        {
            name = sName;
            age = Iage;
        }
        //在Girl類裏聲明Boy的成員函數makeCouple爲友元函數
        friend void Boy::makeCouple(const Girl&);
};


void Boy::makeCouple(const Girl&g)
{
    cout << "Boy's name is "<<name<<", age is "<<age<<endl;
    //友元函數訪問Girl中的私有成員
    cout << "Girl's name is "<<g.name<<", age is "<<g.age<<endl;
    cout << "They become couple."<<endl;
}
void testMemberFuncFriend()
{
    Boy b("Positive",23);
    Girl g("Nice",21);
    b.makeCouple(g);
}

運算符重載友元函數

語法:
聲明位置:公私有域均可
聲明形式:friend 類名 函數名(參數),參數中必須有一個是對應類名的類型的
如下面的代碼:

class Boy
{
    private:
       string name;
       int age;
    public:
       Boy(string sName, int iAge)
       {
           name = sName;
           age = iAge;
       }
       //友元函數重載運算符
       friend Boy operator ++(Boy&);
       void showMe()
       {
           cout<< "Boy's name is "<<name<<", age is "<<age<<endl;
       }
};

//運算符重載
Boy operator++(Boy &b)
{
    b.age++;
    return b;
}
void testOperatorFriend()
{
    Boy b("Positive",26);
    b.showMe();
    ++b;
    b.showMe();
}

友元類

聲明A是B的友元類後,A中的成員函數就是B的友元函數了
語法:
聲明位置:私有區域或公有區域均可
聲明形式:friend + class + 類名
調用:作爲友元類的成員函數來調用

如下面的代碼:

class Girl;
class Boy
{
    private:
       string name;
       int age;
    public:
       Boy(string sName, int iAge)
       {
           name = sName;
           age = iAge;
       }
       void makeCouple(const Girl&);//Boy類的所有成員函數都可以作爲Girl的友元來訪問Girl
};
class Girl
{ 
    private:
        string name;
        int age;
        friend class Boy;//聲明Boy爲Girl的友元類
    public:
        Girl(string sName, int Iage)
        {
            name = sName;
            age = Iage;
        }
};
//makeCouple既是Boy的成員函數,也是Girl的友元函數
void Boy::makeCouple(const Girl&g)
{
    cout << "Boy's name is "<<name<<", age is "<<age<<endl;
    cout << "Girl's name is "<<g.name<<", age is "<<g.age<<endl;//可訪問Girl的私有成員,正常情況只有Girl的成員函數纔可以訪問其私有成員
    cout << "They become couple."<<endl;
}
void testClassFriend()
{
    Boy b("Positive",23);
    Girl g("Nice",21);
    b.makeCouple(g);
}
發佈了24 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章