C++核心编程学习--对象特性--友元
全局函数做友元
声明一些特殊的类,让其可以访问私有的属性。
#include <iostream>
using namespace std;class Building {//全局函数访问类中的私有属性 friend void goodGay(Building* building); //全局函数放在类的最上方,然后写个friendpublic:string m_SittingRoom; // 客厅Building() {this -> m_Bedroom = "卧室";this -> m_SittingRoom = "客厅";}private:string m_Bedroom; // 卧室
};void goodGay(Building* building) {cout << "好基友正在访问:" << building -> m_Bedroom << endl;cout << "好基友正在访问:" << building -> m_SittingRoom << endl;
}void test01() {Building b;goodGay(&b);
}
int main() {
test01();return 0;
}
友元类
声明一些特殊的类,让其可以访问私有的属性。
#include <iostream>
using namespace std;// 由于别的类中会使用Building类对象,所以先声明 Building类
class Building;
class GoodGay{
public:GoodGay();void visit(); // 参观函数访问building中的属性private:Building *building;
};class Building {// 告诉编译器GoodGay类是 building类的好朋友,可以访问Building类中的私有内容friend GoodGay;
public:Building(); // 构造函数类内声明,类外实现string m_SittingRoom; //客厅
private:string m_BedRoom; //卧室
};// 类外实现成员函数
// Building::的意思是告诉编译器 ,Building类中的成员函数
Building::Building() {this -> m_SittingRoom = "客厅";this -> m_BedRoom = "卧室";
}GoodGay::GoodGay() {// 创建Building对象building = new Building; //初始化指针成员并分配内存,类似于执行 Building* p = new Building;
}// visit函数类外实现
void GoodGay::visit() {cout << "好基友正在访问" << building -> m_SittingRoom << endl;cout << "好基友正在访问" << building -> m_BedRoom << endl;
}void test() {GoodGay g;g.visit();
}
int main() {test();return 0;
}
成员函数做友元
#include <iostream>
using namespace std;class Building;
class goodGay
{
public:goodGay();void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容void visit2();private:Building *building;
};class Building
{//告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容friend void goodGay::visit();public:Building();public:string m_SittingRoom; //客厅
private:string m_BedRoom;//卧室
};Building::Building()
{this->m_SittingRoom = "客厅";this->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;
}void test01()
{goodGay gg;gg.visit();}int main() {test01();return 0;
}