从“追求尽量不出错”,到正视“出错是必然”的|

如此而已~~~

园龄:3年3个月粉丝:0关注:12

C++友元

C++友元

关键词:friend

生活中你的家有客厅(public),有你的卧室(private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

但是,你也可以允许你的好友进去

在程序里,有些私有属性 也想让类外特殊的一些函数或者进行访问,就需要用到友元的技术

友元的目的就是让一个函数或者说类 访问另一个类中私有成员

友元关键字为 friend

友元的三种实现:

全局函数做友元:

核心语句:

friend void goodGay(Building *building); //位于一个类的最顶端,无需说明此语句所属的权限

参考代码:

#include <iostream> //友元是一个全局函数
#include <string>
using namespace std;
//建筑物的一个类
class Building
{
//此处未声明权限(就是写到最上边就可以了后续相同)
//核心语句:
//goodGay全局函数是 Building的好朋友,可以访问Building中私有变量
friend void goodGay(Building *building); //语法 friend + 全局函数声明
public:
Building()//创建一个默认构造函数进行初值的构造
{
m_SittingRoom = "客厅";
m_BeRoom = "卧室";
}
public:
string m_SittingRoom;//客厅
private:
string m_BeRoom;//卧室
};
//全局函数做友元
void goodGay(Building *building)
{
cout << "好基友的全局函数 正在访问:" << building->m_SittingRoom << endl;
cout << "好基友的全局函数 正在访问:" << building->m_BeRoom<< endl;
}
void test01()
{
Building building;//创建一个对象 同时调用默认构造函数
goodGay(&building);
}
int main()
{
test01();
system("pause");
return 0;
}

类做友元:

核心语句:

friend class GoodGay; //同样位于类中的最上方,无需说明其所处的权限

参考代码:

#include <iostream> //友元是一个类,此处成员函数在类外进行实现。
#include <string>
using namespace std;//顺带实现了一下类外写成员函数
//类做友元
class Building;//类的声明
class GoodGay
{
public:
GoodGay();
void visit();//参观函数 访问Building中的属性
Building * building;
};
class Building
{
//核心语句:
//GoodGay类是本类的好朋友类,可以访问本类中私有的成员
friend class GoodGay; //语法 friend + 类的声明
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BeRoom; //卧室
};
//类外写成员函数
Building::Building()//默认构造函数
{
m_SittingRoom = "客厅";
m_BeRoom = "卧室";
}
GoodGay::GoodGay()//默认构造函数
{
//创建建筑物对象
building = new Building;
}
void GoodGay::visit()
{
cout << "好基友类正在访问:" << building->m_SittingRoom << endl;
cout << "好基友类正在访问:" << building->m_BeRoom << endl;
}
void test01()
{
GoodGay G; //调用两个类的构造函数 (先是GoodGay的,然后由于在GoodGay中有创建一个Building的指针变量)
G.visit();
}
int main()
{
test01();
system("pause");
return 0;
}

成员函数做友元:

核心语句:

friend void GoodGay::visit(); //相比于上一个类做友元,这里是类中的一个成员函数可以对另一个类的私有成员进行访问
//所以为了区别 使用了类中的另一个成员函数来与之进行比较。

参考代码:

#include <iostream> //使用类中的成员函数来作为友元
#include <string>
using namespace std;
class Building; //类的声明,防止编译器运行时未看到此类定义而报错
class GoodGay //定义一个好基友的类
{
public:
GoodGay();
void visit(); //让visit函数可以访问Building中的私有成员
void visit2(); //让visit2函数无法访问Building中的私有成员
Building *building;
};
class Building //定义一个建筑物的类,想要通过
{
//核心语句:
//基友类GoodGay中的成员函数visit是Building的好朋友,可以访问Building中的私有变量
friend void GoodGay::visit(); //语法:friend+"成员函数的声明"
//(即要表明这个成员函数是在哪一个类的作用域下)
public:
Building();
public:
string m_SittingRoom;
private:
string m_BeRoom;
};
//在类外实现成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BeRoom = "卧室";
}
GoodGay::GoodGay()
{
building = new Building;
}
void GoodGay::visit()//此成员函数可以访问私有变量
{
cout << "好基友visit正在访问:" << building->m_SittingRoom << endl;
cout << "好基友visit正在访问:" << building->m_BeRoom << endl;
}
void GoodGay::visit2()//此成员函数不可以访问私有变量
{
cout << "visit2正在访问:" << building->m_SittingRoom << endl;
//cout << "好基友正在访问:" << building->m_BeRoom << endl; //由于没有设置为友元所以不能访问
}
int main()
{
GoodGay G;
G.visit();
G.visit2();
system("pause");
return 0;
}

本文作者:编程初学者求大佬指点

本文链接:https://www.cnblogs.com/fragmentary/p/16396497.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   如此而已~~~  阅读(37)  评论(0编辑  收藏  举报
//雪花飘落效果
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起