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

C++學習筆記之 友元

友元

目錄

概念

類的友元函式是定義在類外部,但有權訪問類的所有私有(private)成員和保護(protected)成員。儘管友元函式的原型有在類的定義中出現過,但是友元函式並不是成員函式

全域性函式做友元

#include <iostream>
#include <string>

using namespace std;

class Building
{
    friend void goodGay(Building &b); // 讓全域性函式goodGay作為本類的友元函式
public:
    string m_SittingRoom;
    Building()
    {
        m_SittingRoom = "客廳";
        m_BedRoom = "臥室";
    }
private:
    string m_BedRoom;
};

// 好基友 全域性函式 可以訪問客廳 也可以訪問臥室
void goodGay(Building &b)
{
    cout << "好基友正在訪問:" << b.m_SittingRoom << endl;
    cout << "好基友正在訪問:" << b.m_BedRoom << endl;
}

// 普通朋友 只能訪問客廳
void friend_(Building &b)
{
    cout << "朋友正在訪問:" << b.m_SittingRoom << endl;
    // cout << "朋友正在訪問:" << b.m_BedRoom << endl; // error: 'std::__cxx11::string Building::m_BedRoom' is private
}

int main()
{
    Building b;
    goodGay(b);
    friend_(b);

    return 0;
}
好基友正在訪問:客廳
好基友正在訪問:臥室
朋友正在訪問:客廳

類做友元

#include <iostream>
#include <string>

using namespace std;

class Building;

class GoodGay
{
public:
    GoodGay();
    void visit();
    Building *building;
};

class Building
{
    friend class GoodGay; // 讓GoodGay類成為友元
public:
    string m_SittingRoom;
    Building()
    {
        m_SittingRoom = "客廳";
        m_BedRoom = "臥室";
    }
private:
    string m_BedRoom;
};

GoodGay::GoodGay()
{
    building = new Building;
}

void GoodGay::visit()
{
    cout << "好基友類正在訪問:" << building->m_SittingRoom << endl;
    cout << "好基友類正在訪問:" << building->m_BedRoom << endl;
}

int main()
{
    GoodGay goodGay;
    goodGay.visit();

    return 0;
}
好基友類正在訪問:客廳
好基友類正在訪問:臥室

類中成員函式做友元

#include <iostream>
#include <string>

using namespace std;

class Building;

class GoodGay
{
public:
    GoodGay();
    void visit();
    Building *building;
    void visit2();
};

class Building
{
    friend void GoodGay::visit(); // 讓GoodGay類中的 visit函式 成為友元
public:
    string m_SittingRoom;
    Building()
    {
        m_SittingRoom = "客廳";
        m_BedRoom = "臥室";
    }
private:
    string m_BedRoom;
};

GoodGay::GoodGay()
{
    building = new Building;
}

void GoodGay::visit()
{
    cout << "好基友類正在訪問:" << building->m_SittingRoom << endl;
    cout << "好基友類正在訪問:" << building->m_BedRoom << endl;
}

void GoodGay::visit2()
{
    cout << "好基友類正在訪問:" << building->m_SittingRoom << endl;
    cout << "好基友類正在訪問:" << building->m_BedRoom << endl;
}

int main()
{
    GoodGay goodGay;
    goodGay.visit(); // 只有visit可以訪問
    goodGay.visit2(); // error

    return 0;
}