友元函数 目的访问类中的私有成员属性
friend关键字只出现在声明处
其他类、类成员函数、全局函数都可声明为友元
友元函数不是类的成员,不带this指针
友元函数可访问对象任意成员属性,包括私有属性
全局函数作为友元
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;
class Building
{
//让全局的好基友函数 变为我的好朋友 友元函数
friend void goodGay(Building * building);
public:
Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
//客厅 卧室
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
//全局函数 好基友
void goodGay( Building * building )
{
cout << "好基友正在访问 " << building->m_SittingRoom << endl;
cout << "好基友正在访问 " << building->m_BedRoom << endl;
}
//友元函数 目的访问类中的私有成员属性
void test01()
{
Building * building = new Building;
goodGay(building);
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
输出
好基友正在访问 客厅
好基友正在访问 卧室
类作为友元
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;
class Building;
class goodGay
{
public:
goodGay();
void visit();
private:
Building * building;
};
class Building
{
//让好基友类 作为 Building的好朋友
friend class goodGay;
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问: " << this->building->m_SittingRoom << endl;
cout << "好基友正在访问: " << this->building->m_BedRoom << endl;
}
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
void test01()
{
goodGay gg;
gg.visit();
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
输出
好基友正在访问: 客厅
好基友正在访问: 卧室
成员函数作为友元
只让 visit可以作Building的好朋友 visit2 不可以访问私有属性
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>
//只让 visit可以作Building的好朋友 visit2 不可以访问私有属性
class Building;
class goodGay
{
public:
goodGay();
void visit();
void visit2();
private:
Building * building;
};
class Building
{
//让成员函数 visit作为友元函数
friend void goodGay::visit();
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问: " << this->building->m_SittingRoom << endl;
cout << "好基友正在访问: " << this->building->m_BedRoom << endl;//友元可以访问私有成员
}
void goodGay::visit2()
{
cout << "好基友正在访问: " << this->building->m_SittingRoom << endl;
//cout << "好基友正在访问: " << this->building->m_BedRoom << endl;//不能访问私有成员
}
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
void test01()
{
goodGay gg;
gg.visit();
gg.visit2();
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
输出
好基友正在访问: 客厅
好基友正在访问: 卧室
好基友正在访问: 客厅