@TOC今天记录的是c++中的友元函数的主要用法,话不多说,直接看正文!
一、全局函数做友元
#include <iostream>
using namespace std;
#include <string>
//首先定义一个Building类
class Building
{
friend void gooodFriend(Building &Build);
//对全局函数进行friend表示,这就可以进行访问了
public:
//构造函数对其元素进行赋值
Building()
{
sittingRoom="客厅";
bedRoom="卧室";
}
//里面有两个元素:卧室和客厅
public:
string sittingRoom;
private:
string bedRoom;
};
//创建一个全局函数
void gooodFriend(Building &Build)//传入的是Building的类,以引用的方式接收
{
cout<<"gooodFriend 全局函数正在访问"<<Build.sittingRoom<<endl;
//要访问里面的私有变量
cout<<"gooodFriend 全局函数正在访问"<<Build.bedRoom<<endl;
//显然这个是行不通的,要想访问到怎么办呢?
}
void test01()
{
//创建一个Building的对象
Building Build;
gooodFriend(Build);
}
int main()
{
test01();
system("pause");
return 0;
}
二、类做友元
#include <iostream>
using namespace std;
#include <string>
//创建一个friend的类
class Building;
class goodfriend
{
public:
//创建一个构造函数
goodfriend();
//创建了一个visit的成员函数,希望成员函数可以访问Building的私有成员内容
void visit();
void visit2();//访问不到Building的私有内容
//Building类作为friend类的成员
private:
Building *building;
//相当于int m_A; int对应的是Building,m_A对应的是*building;
};
class Building
{
friend class goodfriend;
public:
Building();
//
public:
string sittingRoom;
private:
string bedRoom;
};
Building::Building()
{
sittingRoom = "客厅";
bedRoom = "卧室";
}
goodfriend::goodfriend()
{
//创建一个building的对象,
building = new Building ;//返回的是指针,而上面定义的就是 Buildind *building
}
void goodfriend::visit()
{
cout << "goodfriend中的visit正在访问" << building->sittingRoom << endl;
cout << "goodfriend中的visit正在访问" << building->bedRoom << endl;
}
void goodfriend::visit2()
{
cout << "goodfriend中的visit2正在访问" << building->sittingRoom << endl;
}
void test01()
{
//创建一个goodFriend的对象
goodfriend goodfriend1;
goodfriend1.visit();
goodfriend1.visit2();
}
int main()
{
test01();
system("pause");
return 0;
}
三、成员函数做友元
#include <iostream>
using namespace std;
#include <string>
//创建一个friend的类
class Building;
class goodfriend
{
public:
//创建一个构造函数
goodfriend();
//创建了一个visit的成员函数,希望成员函数可以访问Building的私有成员内容
void visit();
void visit2();//访问不到Building的私有内容
//Building类作为friend类的成员
private:
Building *building;
//相当于int m_A; int对应的是Building,m_A对应的是*building;
};
class Building
{
friend void goodfriend::visit();
public:
Building();
//
public:
string sittingRoom;
private:
string bedRoom;
};
Building::Building()
{
sittingRoom = "客厅";
bedRoom = "卧室";
}
goodfriend::goodfriend()
{
//创建一个building的对象,
building = new Building ;//返回的是指针,而上面定义的就是 Buildind *building
}
void goodfriend::visit()
{
cout << "goodfriend中的visit正在访问" << building->sittingRoom << endl;
cout << "goodfriend中的visit正在访问" << building->bedRoom << endl;
}
void goodfriend::visit2()
{
cout << "goodfriend中的visit2正在访问" << building->sittingRoom << endl;
}
void test01()
{
//创建一个goodFriend的对象
goodfriend goodfriend1;
goodfriend1.visit();
goodfriend1.visit2();
}
int main()
{
test01();
system("pause");
return 0;
}
//这样goodfriend中的visit可以访问到Building的私有成员和公共成员,而visit2只能访问Building中的公共成员
总结:友元函数的主要用法一般有全局函数做友元,这时全局函数就可以直接访问到所要访问的类的所有成员,包括私有成员。
其次是类做友元,比如例子中一共有两个类goodfriend 类和Building类,其中若goodfriend类做为Building类的友元的话,那么goodfriend的所有成员函数都可以对其进行访问,注意这与下面的成员函数做友元是有相似之处。
成员函数做友元,即某个成员函数作为友元可以访问到某一类的所有成员,而不是友元成员函数只能访问到公共成员,所以连个有包含和被包含的关系。这就是我的理解,哈哈。