您当前的位置: 首页 >  c++

龚建波

暂无认证

  • 2浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++学习笔记:友元

龚建波 发布时间:2020-03-25 14:41:59 ,浏览量:2

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             
关注
打赏
1655829268
查看更多评论
0.1589s