C++类与对象--4 友元
友元的目的,是让一个函数或一个类,可以访问另一个类的私有成员
友元的三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元
4.1 全局函数做友元
- 全局函数访问类的私有成员
class Build
{friend void g_func(Build & build); // 在类中做全局函数的声明,并在前面加关键字friendpublic:std::string m_SittingRoom;
private:std::string m_BedRoom;
};
void g_func(Build & build) // 全局函数定义
{std::cout << build->m_BedRoom << std::endl; // 访问类的私有成员
}
4.2 类做友元
- 类访问另一个类的私有成员-->类中所有成员函数可以访问另一个类的私有属性
class Build; // 类声明,在类FriendOfBuild中使用Build类型
class FriendOfBuild
{
public:Build * build; // Build对象做成员属性FriendOfBuild();void visit();
};
FriendOfBuild::FriendOfBuild()
{build = new Build;
}
class Build // Build类定义在FriendOfBuild类后,使“friend class FriendOfBuild;”不报错
{friend class FriendOfBuild; // 表示FriendOfBuild类可以访问Build类的私有成员
public:std::string m_SittingRoom = "客厅";Build();
private:std::string m_BedRoom = "卧室";
};
void FriendOfBuild::visit() // 成员函数的类外实现
{std::cout << build->m_SittingRoom << std::endl;std::cout << build->m_BedRoom << std::endl; // FriendOfBuild类访问Build类的私有成员
}
4.3 成员函数做友元
- 一个类的成员函数访问另一个类的私有成员-->其他成员函数不能访问另一个类的私有属性
class Build; // 类声明,在类FriendOfBuild中使用Build类型
class FriendOfBuild
{
public:Build * build; // Build对象做成员属性FriendOfBuild();void visit();void visit2();
};
FriendOfBuild::FriendOfBuild()
{build = new Build;
}
class Build // Build类定义在FriendOfBuild类后,使“friend class FriendOfBuild;”不报错
{friend void FriendOfBuild::visit(); // 表示FriendOfBuild类的成员函数visit()// 可以访问Build类的私有成员,但成员函数// visit2()不能访问Build类的私有成员。
public:std::string m_SittingRoom = "客厅";Build();
private:std::string m_BedRoom = "卧室";
};
void FriendOfBuild::visit()
{std::cout << build->m_SittingRoom << std::endl;std::cout << build->m_BedRoom << std::endl; // FriendOfBuild类访问Build类的私有成员
}