C++,友元的基本概念以及友元的创建

一、友元

1.1 友元的基本概念

        C++控制对类对象私有部分的访问,通常公有类方法提供唯一的访问途径,但是有时候这种限制太严格,以致于不适合特定的编程问题,在这种情况下,C++提供了另一种形式的访问权限,即友元

友元的种类:

  • 友元函数
  • 友元类
  • 友元成员函数

1.2  创建友元

1.2.1 友元函数

        创建友元函数的第一步是将其原型放在类中声明,并在原型声明前加上关键字friend,第二步是编写函数定义。友元函数作为非成员函数不能直接访问类对象的私有数据成员,例如,你去朋友家玩,你可以参观朋友家客厅,但作为相对私密的卧室则不方便参观。而友元函数则类似于比朋友更加要好的关系,此时你去好朋友家玩,好朋友允许你参观他的所有房间。

示例:

#include 
using namespace std;

//封装 房间 类
class Room
{
    friend void goodfriend(Room &r);//goodfriend函数是本类的好朋友,可以访问本类的所有成员
private:
    string m_BedRoom;  //卧室
public:
    string m_SittingRoom; //客厅
public:
    //无参
    Room()
    {
        m_BedRoom = "卧室";
        m_SittingRoom = "客厅";
    }
};

//全局函数做友元
void goodfriend(Room &r)
{
    cout << "好朋友函数正在访问。。"  << r.m_SittingRoom << endl;
    cout << "好朋友函数正在访问。。"  << r.m_BedRoom << endl;
}

int main()
{
    Room r;
    goodfriend(r);
    return 0;
}

1.2.2 友元类

        类做友元,称为友元类,想要访问哪个类的所有成员,只要在该类中声明类并在声明前加上关键字friend即可。 

#include 
using namespace std;

//封装 房间 类
class Room
{
    friend class GoodFriend;  //GoodFriend这个类是本类的好朋友。可以访问本类的所有成员
private:
    string m_BedRoom;  //卧室
public:
    string m_SittingRoom; //客厅
public:
    //无参
    Room()
    {
        m_BedRoom = "卧室";
        m_SittingRoom = "客厅";
    }
};
//类做友元
class GoodFriend
{
public:
    Room *r;
    void visit()
    {
        cout << "好朋友类正在访问。。" << r->m_SittingRoom << endl;
        cout << "好朋友类正在访问。。"  << r->m_BedRoom << endl;
    }
    GoodFriend()
    {
        r = new Room;
    }
};
int main()
{
    GoodFriend g;
    g.visit();
    return 0;
}

1.2.3 友元成员函数

         友元成员函数的创建与友元类的创建类似,但是需要注意,在类中声明前需要确保友元成员函数所在的类在需访问的类之前定义。并使用域限定符修饰。

#include 
using namespace std;
class Room;//声明有这样的类
//类做友元
class GoodFriend
{
public:
    Room *r;
    void visit();//在类内声明
    GoodFriend();
};
//封装 房间 类
class Room
{
    friend void GoodFriend::visit();  //这个类的成员函数是本类的好朋友。可以访问本类所有成员
private:
    string m_BedRoom;  //卧室
public:
    string m_SittingRoom; //客厅
public:
    //无参
    Room()
    {
        m_BedRoom = "卧室";
        m_SittingRoom = "客厅";
    }
};
void GoodFriend::visit()  //在类外定义成员函数
{
     cout << "好基友类正在访问。。" << r->m_SittingRoom << endl;
     cout << "好基友类正在访问。。"  << r->m_BedRoom << endl;
}
GoodFriend::GoodFriend()
{
    r = new Room;
}
int main()
{
    GoodFriend g;
    g.visit();
    return 0;
}

1.3 友元注意事项

 1)友元不具有交换性。例如友元函数中的示例,A把B当作好朋友让他参观任何房间,但B不一定把A当作好朋友。

2)友元不具有传递性。例如A是B的好朋友,B是C的好朋友,但是A不一定是C的好朋友。

3)友元不具有继承性。

4)尽可能的不使用友元,因为友元破坏了类的封装性,使得类的私有权限变成摆设,所有不到万不得已的情况,不要使用友元。

你可能感兴趣的:(C++,c++,开发语言)