0.前言
什么是友元?友元是允许另一个类或者函数访问某个类非public成员的机制,方法是使用friend说明符在类定义中进行额外的声明。
既然友元可以访问类的非公有成员,那么可以认为在一定程度上破坏了类的封装性。但我们也可以把他们看成一个整体,那么友元也就是封装的一部分。并且,友元使得编码更加自由,提高了灵活性。
和普通的类成员不同,友元关系既不继承,也不传递。友元不一定是派生类的友元,这种关系不被继承;友元的友元也不一定是友元;此外,友元声明是单向的,若类A声明了友元类B,而B没有声明友元A,则只有B可以访问A的非公有成员。
一般,我们有三种友元的使用方式:友元函数、友元类、友元成员函数,下面我们进一步学习。
1.友元函数一个常规的成员函数声明描述了三件在逻辑上相互不同的事情:
- 该函数能访问类声明的非公有部分;
- 该函数位于类的作用域中;
- 该函数必须经由一个对象去激活(有一个this指针)。
将函数声明为static,可以让他只具有前两种性质。将函数声明为friend友元,可以让他只具有第一种性质。
下面我们通过一个例子来演示友元函数的使用,自定义一个Number类,通过友元函数add、sub来进行加减(暂不涉及操作符重载的知识,所以直接用函数)。代码如下:
#include
//自定义一个数值类型,用于测试友元
class Number
{
public:
//通过一个浮点数进行构造
explicit Number(double val) :_value(val) {}
//通过公有接口获取值
double value() const { return _value; }
private:
double _value;
//声明加上friend,即为友元
//定义可以在外部或内部,但是需要在外部做声明以便全局访问该函数
friend Number add(const Number& a, const Number& b)
{
//声明为友元,就可以直接访问类的非公有成员
return Number(a._value + b._value);
}
friend Number sub(const Number& a, const Number& b);
};
//函数的声明,定义可以放cpp中
Number add(const Number& a, const Number& b);
Number sub(const Number& a, const Number& b)
{
return Number(a._value - b._value);
}
int main()
{
Number a(10.5), b(0.5);
Number c = add(a, b); //=11
Number d = sub(a, b); //=10
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?