1. 程式人生 > 實用技巧 >C++之友元

C++之友元

友元

類裡面的私有屬性,可以讓類外一些特殊的函式或者類進行訪問

關鍵字:friend

友元三種實現:

  1. 全域性函式做友元
  2. 類做友元
  3. 成員函式做友元

成員函式為友元

#include <iostream>
using namespace  std;
#include <string>
class Building
{
    //告訴編譯器,goodGay是全域性函式,是BUIling類的好朋友,可以訪問私有
    friend  void goodGay(Building *building);
public:
    Building(){
        m_SittingRoom = "客廳";
        m_BedRoom = "臥室";
    }
    string m_SittingRoom;
private:
    string m_BedRoom;
};

void goodGay(Building *building){
    cout<< building->m_SittingRoom <<building->m_BedRoom << endl;
}
void test01(){
    Building b;
    goodGay(&b);
}
int main(){
    test01();
    return  0;
}

類做友元

#include <iostream>
using namespace  std;
#include <string>
class Building{
    //告訴編譯器,goodgay類是building類的好朋友,可以訪問裡面的私有內容
    friend class Goodgay;
public:
    Building();
public:
    string m_Sit;
private:

    string m_Bed;
};
class Goodgay{
public:
    Goodgay();
    void visit();

private:
    Building *building;
};

//建構函式無需返回值,直接在前面加上作用域
Building ::Building() {
    m_Sit = "客廳";
    m_Bed = "臥室";
}
Goodgay ::Goodgay() {
    building = new Building;//宣告物件僅定義,需要給另一個類一個空間
}
//在返回值後面加上作用域
void Goodgay::visit() {
    cout<<building->m_Sit<<building->m_Bed<<endl;
}


void test(){
    Goodgay gg;
    gg.visit();
}
int main(){
    test();
    return  0;
}

成員函式做友元

#include <iostream>
using namespace  std;
#include <string>

class Building;
class Goodgay{
public:
    Goodgay();
    void visit();//讓visit可以訪問builing中私有成員
    void visit2();//不可以訪問

private:
    //用到該類,必須在其前面宣告類,可以虛假宣告class Building
    Building *building;//私有部分可以用visit同類訪問
};
class Building{
    //告訴編譯器,goodgay類下的visit成員函式是該類的好朋友,可以訪問裡面的私有內容
    friend void Goodgay::visit();//用到該類,必須在其前面宣告類,可以虛假宣告class Goodgay;
public:
    Building();
public:
    string m_Sit;
private:

    string m_Bed;
};


//建構函式無需返回值,直接在前面加上作用域
Building ::Building() {
    m_Sit = "客廳";
    m_Bed = "臥室";
}
Goodgay ::Goodgay() {
    building = new Building;
}
//在返回值後面加上作用域
void Goodgay::visit() {
    cout<<building->m_Sit<<building->m_Bed<<endl;
}
void Goodgay::visit2() {
    cout<<building->m_Sit<<endl;
}

void test(){
    Goodgay gg;
    gg.visit();
    gg.visit2();
}
int main(){
    test();
    return  0;
}