一、全局函数做友元
友元函数可以访问类内部的私有成员属性,在类中使用
friend
关键字定义友元函数,并在全局中实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <iostream> using namespace std; class Person{ // 定义 Person 类 friend void printField(Person *p); // 定义友元函数,并在类外面实现 public: Person(){ // 构造函数初始换成员值 name = "xiaokang"; age = 29; } public: string name; // 名字 private: int age; // 年龄 }; // 友元函数的实现 void printField(Person *p){ cout << "name:" << p->name << endl; cout << "age:" << p->age << endl; // 友元函数打印 `Person` 类的私有属性 age } // 主函数 int main() { Person p; // 实例化Person类 printField(&p); std::cout << "Hello, World!" << std::endl; return 0; }
打印结果如下:
name:xiaokang
age:29
Hello, World!
二、类做友元
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#include <iostream> using namespace std; class Building; // 定义建筑类 class GoodGay{ // 定义`好基友`类 public: Building *building; // 定义共有成员 GoodGay(); // 构造函数 void visit(); // 定义访问成员方法 }; class Building { // 实现建筑类 friend class GoodGay; // 定义`好基友`类为`友元`类 public: Building(); // 构造方法 string sittingRoom; // 客厅 private: string bedRoom; //卧室 }; // 实现 GoodGay 的构造函数 GoodGay::GoodGay() { // 实现构造方法 building = new Building; } void GoodGay::visit(){ // 访问 building对象内部的私有属性 cout << "好基友当前访问的地方是:"<< building->bedRoom << endl; } Building::Building() { this->sittingRoom = "客厅"; this->bedRoom = "卧室"; } void test01(){ GoodGay gg; gg.visit(); } int main() { test01(); std::cout << "Hello, World!" << std::endl; return 0; }
打印结果如下:
好基友当前访问的地方是:卧室
Hello, World!
三、类成员函数做友元
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#include <iostream> using namespace std; class Building; class GoodGay{ public: Building *building; GoodGay(); void visit(); }; class Building { friend void GoodGay::visit(); // 将成员函数定义为友元 public: Building(); string sittingRoom; // 客厅 private: string bedRoom; //卧室 }; // 实现 GoodGay 的构造函数 GoodGay::GoodGay() { building = new Building; } void GoodGay::visit(){ cout << "好基友当前访问的地方是:"<< building->sittingRoom << endl; // 访问 building对象内部的私有属性 cout << "好基友当前访问的地方是:"<< building->bedRoom << endl; } Building::Building() { this->sittingRoom = "客厅"; this->bedRoom = "卧室"; } void test01(){ GoodGay gg; gg.visit(); } int main() { test01(); std::cout << "Hello, World!" << std::endl; return 0; }
打印结果如下: 好基友当前访问的地方是:客厅 好基友当前访问的地方是:卧室 Hello, World!