相关文章
类模板中的友元
2024-12-19 09:41

传统友元类的概念是:让某个类B成为另外一个类A的友元类,这样的话,类B就可以在其成员函数中访问类A的所有成员(成员变量、成员函数),而不管这些成员在类A中是用什么修饰符(private、protected、public)修饰的。如果现在类A和类B都变成了类模板,那么能否让类模板B成为类模板A的友元类模板呢?这要分3种情况讨论。

1.让类模板的某个实例成为友元类

在main()主函数中添加代码:

上面这段代码编译后会报错,因为类模板B的callBAF()成员函数要访问类模板A的私有成员变量data,这是不允许的。那么,如果类模板B成为类模板A的朋友,显然就会解决编译出错的问题。于是,调整类模板A的代码,增加一个friend声明,调整后的类模板A的代码如下。

此外,还需要在类模板A定义的前面增加针对类模板B的声明(如果B不是类模板,而只是一个普通类,就不需要增加针对类B的声明)。

从上面的代码中可以看到,实际是让类模板B的特定类模板实例(也就是B<long>)成为类模板A的友元类。也就是说,B<long>实际上代表的是一个具体的类(如果B不是类模板,而是普通类,就不需要增加针对类B的声明)。

2.让类模板成为友元类模板

前面的代码只是让B<long>成为类模板A的友元类,如果调整main()主函数中的代码B<long>为B<int>,则再次运行会报错。因为B<int>并不是类模板A的友元类,如果把整个类模板B变成类模板A的友元类模板,这个问题就解决了,而且不需要再类模板A定义前增加针对类模板B的声明。

现在,类模板B成立类模板A的友元类模板。

函数模板可以被声明为友元函数,首先定义一个普通的函数模板。

当要调用func()函数时:

现在,在func()函数模板的前面增加一个Men类的定义:

修改func()函数模板中的代码:

1. 让函数模板的某个实例成为友元函数

在main()函数中,func(2, 3)会实例化出。所以把实例化后的func<int, int>函数声明为Men类的友元,在Men类中添加代码:

尖括号中的内容叫做模板实参,两个模板实参可以从func()的圆括号指定的实参推导出来,因此尖括号中的内容可以省略,也可以保留一个,但是尖括号不能省略。

同时,在Men类定义的上面添加函数模板func()的声明:

2. 友元模板

上面的实例中,只是将函数模板func()的某个实例成为Men类模板的友元函数。为了应对不同的情况,可以让函数模板成为Men类模板的友元模板。

方法是在Men类模板的定义中添加代码行:

如此则不需要在类模板Men定义的前面增加针对函数模板的声明。

3. 在类模板中定义友元函数

可以在一个类模板中定义(不是声明)一个友元函数,这种友元函数是能够被调用的,而且只有在被调用时,编译器才会实例化这个函数。虽然下面的函数func2()的定义写在了Men类模板中,但是应该把它看作一个全局函数,不接受Men类模板的限制。

在main()函数中添加代码:

值得一提的是,如果func2()的代码非常简单,编译器会将func2()当作内联函数来处理。

    以上就是本篇文章【类模板中的友元】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/news/11788.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://sjzytwl.xhstdz.com/mobile/ , 查看更多   
最新文章
3防手机(3防手机8849)
  关于《三防手机》的文章  随着科技的不断发展,智能手机已经成为我们日常生活中不可或缺的一部分。然而,我们的手机在使用
华为手机有放大镜望远镜的功能吗 华为手机放大镜望远镜功能介绍【详解】手机望远镜「华为手机有放大镜望远镜的功能吗 华为手机放大镜望远镜功能介绍【详解】」
  有放大镜望远镜的功能吗,很多朋友都遇到了这样的问题。这个问题该如何解决呢?下面小编就带来华为放大镜望远镜的功能介绍,
4glte是什么手机(4g lte+)
  关于《4GLTE是什么手机》的文章  在现代社会,移动通信技术日新月异,其中,4GLTE技术已成为众多智能手机所广泛采用的一种
工行短信银行工商银行手机银行app下载「工行短信银行」
工行短信银行app是一款工行移动金融创新产品的手机客户端。工行短信银行客户端为你提供实时查询、业务办理等等,方便快捷,快来I
怎么办理手机银行手机银行「怎么办理手机银行」
随着移动互联网的飞速发展,手机银行已成为我们日常生活中不可或缺的一部分,它提供了便捷、高效的金融服务。那么,如何办理手机
手机管家手机管家「手机管家」
手机管家是一款综合性的手机管理软件,旨在为用户提供一站式的手机优化服务。通过智能清理、加速、安全保护等功能,帮助用户轻松
品牌手机排行榜前十名手机品牌排行榜前十名「品牌手机排行榜前十名」
华为创立于1987年,是全球领先的信息与通信技术(ICT)解决方案供应商,在电信运营商、企业、终端和云计算等领域构筑了端到端的解
手机CPU天梯图2023年2月最新版,你的手机排名如何?手机cpu天梯图「手机CPU天梯图2023年2月最新版,你的手机排名如何?」
2月已经过去,我们迎来了3月,冬日的寒冷逐渐消散,春天的日子已经触手可及。今天是我们3月份的第一天,芝麻科技讯更新了2023年2
6g运行手机(6g运行手机什么牌子好)
  关于《6G运行手机》的文章  随着科技的飞速发展,手机已经成为了我们日常生活中不可或缺的一部分。近日,各大手机品牌纷纷
手机控必看!大屏手机用出“手机手” 严重的要动手术手机手「手机控必看!大屏手机用出“手机手” 严重的要动手术」
你的手还好吗?鼠标手、键盘手、近视眼、肩周炎……难道这些伤害还不够吗?这不,最近又爆出新科技病——“手机手”!没有买卖,
相关文章