#include<iostream>
using namespace std;
#include<string>
#include<time.h>
//友元 -----关键字:friend
//让一个 函数 或者是 类 访问另一个 类当中的私有成员!!!!!
//三种实现形式:1、全局函数做友元
// 2、类做友元
// 3、成员函数做友元
//1、全局函数做友元
//class Buliding //建筑物类
//
//{
//
// friend void goodFriend(Buliding &building);//!!!!!goodFriend这个函数可以访问 类当中的 私有成员!!!!!-----定义之后 只要写在类最上面即可!
//
//public:
// Buliding()//构造函数赋值
// {
// m_SittingRoom = "客厅";
// m_BedRoom = "卧室";
// }
//
//public:
// string m_SittingRoom;//客厅
//private:
// string m_BedRoom;//卧室
//};
//
////全局函数---创建一个好友可以访问 公共成员 也可以访问 私有成员
//void goodFriend(Buliding &building)
//{
// cout << "好基友的全局函数正在访问building的: " << building.m_SittingRoom << endl; //公共属性在类外是可以被访问到的!!!!!
//
// cout << "好基友的全局函数正在访问building的: " << building.m_BedRoom<< endl; //在类内注释后是可以访问类当中的私有元素的!!!!!
//}
//void test01()
//{
// Buliding p1;
// goodFriend(p1);
//
//}
//int main()
//{
// test01();
// system("pause");
// return 0;
//}
//2、类做友元
//class Building
//{
// friend class goodfriend; //goodfriend这个类是本类的 友好类 可以访问 Building 这个类当中的所有内容!!!!!
//public:
// Building(); //在类外给函数 赋值 操作!!!!!
//
//public:
// string m_SittingRoom;//客厅
//
//private:
// string m_BedRoom;//卧室
//
//};
//
//class goodfriend
//{
//public:
// goodfriend(); //创建goodfriend的构造函数 //在类外给函数 赋值 操作!!!!!
//public:
// void visit();//参观函数 访问Building当中的属性
//
// Building *building;//Building这个类的指针
//
//};
//
//
////在类外写成员函数!!!!! -----在 !函数名前面 ! 加上类的属于!!!!!
//Building::Building()//Building构造函数赋值
//{
// m_SittingRoom = "客厅";
// m_BedRoom = "卧室";
//}
//
//goodfriend::goodfriend() //goodfiend的构造函数外部操作
//{
// //创建建筑物的对象!
// building = new Building;//new堆区会返回相同 类型的数据指针! 所以用buildin内部的指针去维护堆区的对象!!!!!?????
// //这里 building 是指针变量!!!!!
// //调用了Building的类 所以调用了Building的构造函数
//}
//
//void goodfriend::visit() //要加上函数的返回类型
//{
// cout << "好基友的类正在访问 : " << building->m_SittingRoom << endl;
//
// cout << "好基友的类正在访问 : " << building->m_BedRoom << endl;
//}
//
//void test01()
//{
// goodfriend a;//创建对象 a
// a.visit();//调用visit函数 并且访问函数当中的building->m_SittingRoom 与 building->m_BedRoom!
//
//}
//int main()
//{
// test01();// -----调用这个函数的最终效果是 显示 正在访问 客厅 与 卧室!
// system("pause");
// return 0;
//}
//3、成员函数做友元
class Building
{
friend void goodFriend::visit1();//告诉编译器 goodFriend成员函数作为本类的好友 ,可以访问私有成员!!!!!public:
Building();//构造函数声明public:
string m_SittingRoom;//客厅
private:
string m_BedRoom;//卧室
};
class goodFriend
{
public:
goodFriend();//构造函数
void visit1();//让visit1函数可以访问Building当中私有的成员
void visit2();//人visit2函数不能访问Building当中私有的成员
Building *building;
};
//类外实现成员函数
Building::Building() //构造函数
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}goodFriend::goodFriend()
{
building = new Building;//创建Building对象的指针维护建筑物这个对象
}void goodFriend::visit1()
{
cout << "visit1 函数正在访问 : " << building->m_SittingRoom << endl;
}
void goodFriend::visit2()
{
cout << "visit2 函数正在访问 : " << building->m_SittingRoom << endl;
//报错 因为其不是特殊声明!!!!!cout << "visit2 函数正在访问 : " << building->m_BedRoom << endl;
}void test01()
{
goodFriend a;
a.visit1();
a.visit2();
}
int main()
{
test01();
system("pause");
return 0;
}