文章目录
- 一、全局函数作友元
-
- 二、友元类
-
- 三、成员函数作友元
-
Note:
i.视频为
黑马程序员C++视频(118-120),系列文章为视频听课笔记;
ii.难度指数:+
iii.不论变量、函数名、标识符形式怎样复杂,只要我们考虑编程的本质是对内存的操作,对内存进行分析,一切逻辑都会变得清晰。
一、全局函数作友元
1.友元
通常情况下,一个类的私有成员,不论是成员变量还是成员函数,都只能在该类的成员函数内部才能被访问。
“友元”概念引入的目的就是让一个函数或者类可以访问另一类中的私有成员,其涉及到的新的标志符为friend
。
2.code格式
简单来说,就是在“另一类”中将全局函数的声明前加上friend
标识符,就可以实现在全局函数中访问“另一个类”的私有属性,代码示例如下,核心代码只有一句,即:
friend void goodgay(building &build);
#include<iostream>
#include<string>
using namespace std;
class building
{
friend void goodgay(building &build);
public:
building()
{
m_settingroom = "主客厅";
m_bedroom = "主卧室";
}
public:
string m_settingroom;
private:
string m_bedroom;
};
void goodgay(building &build)
{
cout << "好基友正在访问:" << build.m_settingroom << endl;
cout << "好基友正在访问:" << build.m_bedroom << endl;
}
int main()
{
building build;
goodgay(build);
}
从代码中可见,在类building
中,全局函数goodgay
的声明前加上了friend
标识符,因此在全局函数goodgay
中就可以访问building
类中的m_bedroom
这一私有属性。
3.作用
在上面的代码示例中,friend void goodgay(building &build)
代表定义全局函数goodgay()
作为类building
的友元,即在全局函数goodgay()
中既可以访问类building
中的公开成员属性m_settingroom
,也可以访问类building
中的私有属性m_bedroom
。
二、友元类
1.code格式
简单来说,就是在“另一个类”中将“类”的声明前加上friend
标识符,这样就可以实现在“类”中访问“另一个类”的私有属性,代码示例如下,核心代码只有一句,即:
friend class Goodgay;
#include<iostream>
#include<string>
using namespace std;
class Building
{
friend class Goodgay;
public:
Building()
{
m_sittingroom = "客厅";
m_bedroom = "卧室";
}
string m_sittingroom;
private:
string m_bedroom;
};
class Goodgay
{
public:
Building building;
void visit();
};
void Goodgay::visit()
{
cout << "好基友类正在访问:" << building.m_sittingroom << endl;
cout << "好基友类正在访问:" << building.m_bedroom << endl;
}
void test01()
{
Goodgay goodgay;
goodgay.visit();
}
int main()
{
test01();
}
从代码中可见,在另一个类Building
中,类Goodgay
的声明前加上了friend
标识符,因此在类Goodgay
中可以访问Building
类中的m_bedroom
这一私有属性。
2.作用
在上面的代码示例中,friend class Goodgay
代表定义类Goodgay
作为类Building
的友元,即在类Goodgay
中既可以访问类Building
中的公开成员属性m_settingroom
,也可以访问类Building
中的私有属性m_bedroom
。
3.拓展
(1)building = new Building;
指的是new指在堆区创建一个对象,new什么数据类型,就返回什么数据类型的指针;
(2)类外实现类中的构造或成员函数,code格式为返回值类型+作用域::函数名
,例如:void Goodgay::visit()
记得加返回值类型与作用域::
;
三、成员函数作友元
1.code格式
简单来说,就是在“类”中将“成员函数”的声明前加上friend
标识符,注意,要注明成员函数的作用域,即成员函数属于哪个类。这样就可以实现在“成员函数”中访问“类”的私有属性,代码示例如下,核心代码只有一句,即:
friend void Goodgay::visit();
#include<iostream>
#include<string>
using namespace std;
class Building;
class Goodgay
{
public:
Goodgay();
Building * building;
void visit();
void visit2();
};
class Building
{
friend void Goodgay::visit();
public:
string m_sittingroom;
Building();
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 Goodgay::visit2()
{
cout << "好基友正在访问:" << building->m_sittingroom << endl;
}
void test01()
{
Goodgay gg;
gg.visit();
gg.visit2();
}
int main()
{
test01();
}
从代码中可见,在类Building
中,类Goodgay
中的成员函数visit()
在声明前加上了friend
标识符,因此在类Goodgay
中的visit()
成员函数中可以访问Building
类中的m_bedroom
这一私有属性。
2.作用
在上面的代码示例中,friend void Goodgay::visit()
代表定义类Goodgay
中的成员函数visit()
作为类Building
的友元,即在类Goodgay
中的成员函数visit()
中既可以访问类Building
中的公开成员属性m_settingroom
,也可以访问类Building
中的私有属性m_bedroom
。类Goodgay
中的其他成员函数无此权限,例如代码示例中的visit2()
函数,其也属于类Goodgay
中的成员函数,但其不能访问类Building
中的私有属性。
【总结】
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9d6dc2dd5054a63bf9e374634536b47.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oao5oao5Yay6bit,size_20,color_FFFFFF,t_70,g_se,x_16)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)