【C++】class的设计与使用(七)友元函数、友元类(关键字friend)

news/2024/6/17 3:13:51 标签: c++, 开发语言, 笔记

friend

  • 任何class都可以将其他类或者函数指定为朋友(friend);
  • friend具备了与类成员函数相同的访问权限,可以访问类的private member;
  • 声明:只需要在函数原型前加上关键字friend
  • 这份声明可以出现在class定义的任意位置上,不受private和public的影响;
  • 想要将数个重载函数声明为某个类的friend,所有的重载函数前都要加friend;
//operator*()这个非成员函数在两个类里声明为friend
//它可以直接访问Triangular类和Triangular_iterator类的私有成员
//如下
class Triangular{
	friend int operator*(const Triangular_iterator &rhs);
	//...
};
class Triangular_iterator{
	friend int operator*(const Triangular_iterator &rhs);
	//...
};

class Triangular{
	friend int Triangular_iterator::operator*();
	//...
};
  • 类与类之间也可以建立friend关系,借此A类里的所有成员函数都成为了B类的friend,反之同理;
    以这种形式来声明类之间的friend,就不需要在friend声明之前先显现class的定义了。
class Triangular{
	friend class Triangular_iterator;
	//...
};

注意无需建立友谊的情况:

class Triangular{
public:
	static int elem_size(){return _elems.size();}
	static int max_elems(){return _max_elems;}
	//...
};
//以上类定义了public里的成员函数,用到了以下类的成员函数的定义里
//友谊不再必要
//即无需friend void Triangular_iterator::check_integrity();
inline void Triangular_iterator::check_integrity()
{
	if(_index>=Triangular::max_elems())
	{
		throw iterator_overflow();
	}
	if(_index>=Triangular::elems_size())
	{
		Triangular::gen_elements(_index + 1);
	}
}

友谊的建立,通常是为了效率考虑的。比如只希望进行某个数据成员的读取和写入,那么为他提供具有public访问权限的inline函数,就是建立友谊的另一个替代方案。


http://www.niftyadmin.cn/n/5060894.html

相关文章

分布式计算平台

0:Hadoop 1:MapReduce(MR),最为general和流行的一个分布式计算框架,其开源实现Hadoop已经得到了极为广泛的运用(Facebook, Yahoo!等等),同时在Hadoop基础上发展起来的项目也有很多(H…

webpack优化策略

这三点是webpack优化策略的一部分,具体解释如下: 优化正则匹配(Test):在webpack的配置中,test属性是一个正则表达式,用于匹配需要应用该loader的文件的扩展名。在您提供的代码中,te…

亲测可用国产GPT人工智能

分享一些靠谱、可用、可以白嫖的GPT大模型。配合大模型,工作效率都会极大提升。 清华大学ChatGLM 官网: 智谱清言中国版对话语言模型,与GLM大模型进行对话。https://chatglm.cn/开源的、支持中英双语的1300亿参数的对话语言模型&#xff0…

蓝桥等考Python组别八级008

第一部分:选择题 1、Python L8 (15分) 运行下面程序,输出的结果是( )。 i = 4 while i <= 7: print(i, end = ) i += 1 1 2 34 5 64 5 6 70 1 2 3正确答案:C 2、Python L8

蓝桥等考Python组别十级001

第一部分:选择题 1、Python L10 (15分) 已知s = Hello!,下列说法正确的是( )。 s[1]对应的字符是Hs[2]对应的字符是ls[-1]对应的字符是os[3]对应的字符是o正确答案:B 2、Python L10 (15分) 运行下面程序,输入字符串“Banana”,输出的结果是&#x

面向对象特性分析大全集

面向对象特性分析 先进行专栏介绍 面向对象总析前提小知识分类浅析封装浅析继承浅析多态面向对象编程优点abc 核心思想实际应用总结 封装概念详解关键主要目的核心思想优点12 缺点12 Java代码实现封装特性 继承概念详解语法示例关键主要目的核心思想优点12 缺点12 Java代码实现…

蓝桥等考Python组别七级008

第一部分&#xff1a;选择题 1、Python L7 &#xff08;15分&#xff09; 下面for循环语句中&#xff0c;变量i的取值范围是&#xff08; &#xff09;。 for i in range(11): print(i) 1~110~111~100~10 正确答案&#xff1a;D 2、Python L7 &#xff08;15分&#x…