类和对象-友元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;
}

posted @ 2025-10-31 13:59  MAY李  阅读(8)  评论(0)    收藏  举报