类和对象-友元project6
友元的三中实现
全局函数做友元
类做友元
成员函数做友元
友员的目的就是让一个函数或者是类,访问另一个类中私有成员
友员关键字friend
全局函数做友元
include
using namespace std;
class Building {
friend void GoodGay(Building& building);
public:
Building() {
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom;
private:
string m_BedRoom;
};
//全局函数 值传递会创建新对象,新对象不继承友元关系
void GoodGay(Building &building) {
cout << building.m_SittingRoom << endl;
cout << building.m_BedRoom << endl;
}
void test01(){
Building b;
GoodGay(b);
}
int main() {
test01();
system("pause");
return 0;
}
类和对象-友元-友元类
// 栈上创建(自动管理,函数结束自动销毁)
Building building;
// 堆上创建(手动管理,需要delete)
Building *building = new Building;
include
using namespace std;
//类做友元
class Building;
/*为什么需要这个声明?
在GoodGay类中使用了Building * building;(Building指针)
但此时Building类的完整定义还没有出现
前向声明告诉编译器:"Building是一个类,具体定义在后面"
这样编译器就知道Building 是一个有效的指针类型/
class GoodGay {
public:
GoodGay(); // 添加构造函数声明
void visit();//参观函数 访问Building中的属性
Building* building;
};
class Building {
friend class GoodGay;
public:
Building(); // 添加构造函数声明
string m_SittingRoom;
private:
string m_BedRoom;
};
//类外写成员函数
Building::Building() {
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay() {
//创建建筑物对象
building = new Building;
}
void GoodGay::visit() {
cout << building->m_SittingRoom << endl;
cout << building->m_BedRoom << endl;
}
void test02() {
GoodGay gg;
gg.visit();
}
int main() {
test02(); // 添加函数调用
system("pause");
return 0;
}
类和对象-友元-成员函数做友元(project6 filename03)
include
using namespace std;
class Building;
class GoodGay {
public:
GoodGay(); // 构造函数声明
void visit01(); // 参观函数声明
void visit02(); // 参观函数声明
Building* building;
};
class Building {
// 必须在GoodGay类完全定义后才能声明友元成员函数
friend void GoodGay::visit01();
public:
Building(); // 构造函数声明
string m_SittingRoom;
private:
string m_BedRoom;
};
// 类外写成员函数
Building::Building() {
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay() {
// 创建建筑物对象
building = new Building;
}
void GoodGay::visit01() {
cout << building->m_SittingRoom << endl;
cout << building->m_BedRoom << endl; // 可以访问私有成员
}
void GoodGay::visit02() {
cout << building->m_SittingRoom << endl;
// cout << building->m_BedRoom << endl; // 这行如果取消注释会编译错误
}
void test03() {
GoodGay gg;
gg.visit01();
gg.visit02();
}
int main() {
test03();
system("pause");
return 0;
}
浙公网安备 33010602011771号