- 一、全局函数作友元
- 1.友元
- 2.code格式
- 3.作用
- 二、友元类
- 1.code格式
- 2.作用
- 3.拓展
- 三、成员函数作友元
- 1.code格式
- 2.作用
- 【总结】
Note:
i.视频为 黑马程序员C++视频(118-120),系列文章为视频听课笔记;
ii.难度指数:+
iii.不论变量、函数名、标识符形式怎样复杂,只要我们考虑编程的本质是对内存的 *** 作,对内存进行分析,一切逻辑都会变得清晰。
一、全局函数作友元 1.友元
“友元”概念引入的目的就是让一个函数或者类可以访问另一类中的私有成员,其涉及到的新的标志符为friend
。
简单来说,就是在“另一类”中将全局函数的声明前加上friend
标识符,就可以实现在全局函数中访问“另一个类”的私有属性,代码示例如下,核心代码只有一句,即:
friend void goodgay(building &build);//全局函数作友元
//代码示例
#include
#include
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);
}
3.作用从代码中可见,在类
building
中,全局函数goodgay
的声明前加上了friend
标识符,因此在全局函数goodgay
中就可以访问building
类中的m_bedroom
这一私有属性。
在上面的代码示例中,friend void goodgay(building &build)
代表定义全局函数goodgay()
作为类building
的友元,即在全局函数goodgay()
中既可以访问类building
中的公开成员属性m_settingroom
,也可以访问类building
中的私有属性m_bedroom
。
简单来说,就是在“另一个类”中将“类”的声明前加上friend
标识符,这样就可以实现在“类”中访问“另一个类”的私有属性,代码示例如下,核心代码只有一句,即:
friend class Goodgay;//类作友元
//代码示例
#include
#include
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();//访问Building类中的属性
};
//类外实现类中成员函数的方法
void Goodgay::visit()
{
cout << "好基友类正在访问:" << building.m_sittingroom << endl;
cout << "好基友类正在访问:" << building.m_bedroom << endl;
}
void test01()
{
Goodgay goodgay;
goodgay.visit();
}
int main()
{
test01();
}
2.作用从代码中可见,在另一个类
Building
中,类Goodgay
的声明前加上了friend
标识符,因此在类Goodgay
中可以访问Building
类中的m_bedroom
这一私有属性。
在上面的代码示例中,friend class Goodgay
代表定义类Goodgay
作为类Building
的友元,即在类Goodgay
中既可以访问类Building
中的公开成员属性m_settingroom
,也可以访问类Building
中的私有属性m_bedroom
。
(1)building = new Building;
指的是new指在堆区创建一个对象,new什么数据类型,就返回什么数据类型的指针;
(2)类外实现类中的构造或成员函数,code格式为Building::Building()
,记得加作用域::
;
简单来说,就是在“类”中将“成员函数”的声明前加上friend
标识符,注意,要注明成员函数的作用域,即成员函数属于哪个类。
这样就可以实现在“成员函数”中访问“类”的私有属性,代码示例如下,核心代码只有一句,即:
friend void Goodgay::visit();//成员函数作友元
//代码示例
#include
#include
using namespace std;
class Building;//这个声明必须有!!!
class Goodgay
{
public:
//构造函数构建
Goodgay();
//声明一个Building类的实例对象
Building * building;
void visit();//让visit函数可以访问Building中的私有成员
void visit2();//让visit2函数不可以访问Building中的私有成员
};
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();
}
2.作用从代码中可见,在类
Building
中,类Goodgay
中的成员函数visit()
在声明前加上了friend
标识符,因此在类Goodgay
中的visit()
成员函数中可以访问Building
类中的m_bedroom
这一私有属性。
在上面的代码示例中,friend void Goodgay::visit()
代表定义类Goodgay
中的成员函数visit()
作为类Building
的友元,即在类Goodgay
中的成员函数visit()
中既可以访问类Building
中的公开成员属性m_settingroom
,也可以访问类Building
中的私有属性m_bedroom
。
类Goodgay
中的其他成员函数无此权限,例如代码示例中的visit2()
函数,其也属于类Goodgay
中的成员函数,但其不能访问类Building
中的私有属性。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)