当前位置:  开发笔记 > 编程语言 > 正文

朋友和内联方法,有什么意义?

如何解决《朋友和内联方法,有什么意义?》经验,为你挑选了3个好方法。

我在标题中看到我没有写下以下内容:

class MonitorObjectString: public MonitorObject {
   // some other declarations
   friend inline bool operator==(MonitorObjectString& lhs, MonitorObjectString& rhs) { return(lhs.fVal==rhs.fVal); }

我无法理解为什么这个方法被声明为朋友.我认为如果函数在另一个地方定义并且需要访问类的内部成员是有意义的,但这不是这里的情况,因为它是内联的,甚至不需要访问成员.

你怎么看?这位"朋友"没用吗?



1> Johannes Sch..:
friend inline bool operator==(MonitorObjectString& lhs, MonitorObjectString& rhs) { 
    return(lhs.fVal==rhs.fVal); 
}

被称为friend definition.它将函数定义为它所出现的类所围绕的命名空间的非成员函数.实际上,内联存在冗余:如果它是朋友定义,则隐式声明内联.它的一些优点和缺点:

它使操作员对正常查找不可见.您可以调用它的唯一方法是使用依赖于参数的查找.这将使命名空间无法正常显示许多操作员声明.请注意,这也将禁用使用对MonitorObjectString的隐式转换来调用它的能力(因为如果两个参数类型在查找候选者时都不匹配,则参数相关的查找将找不到该函数).

名称查找从朋友定义出现的类的范围开始.这意味着不需要写出长的类型名称或其他名称.只需像在类的普通成员函数中那样引用它们.

由于它是一个朋友,该功能看到的内部MonitorObjectString.但这既不好也不坏.这取决于实际情况.例如,如果有功能getFVal()使得功能朋友毫无意义.可以getFVal那么好用.

我曾经喜欢这种朋友定义的运算符风格,因为它们可以直接访问类成员,并且出现在类定义中 - 所以我可以拥有"一见钟情".然而,最近我得出的结论是,这并不总是一个好主意.如果你可以(并且你应该)纯粹使用类的公共成员函数来实现运算符,则应该使它成为在类的同一名称空间中定义的非朋友(和非成员)运算符.它确保如果您更改某些实现 - 但保持类的接口相同 - 操作员仍然可以工作,并且您的级联更改较少,因为您知道它无法访问实现细节.

但是,我更喜欢这种风格而不是编写成员运算符,因为命名空间范围内的运算符函数具有与其参数对称的附加功能:它们不会将左侧特殊处理,因为双方都只是普通参数而不是对象参数必然会*this.如果左侧或右侧属于您的类的类型,则可以隐式转换另一侧 - 无论是左侧还是右侧.对于也没有友元定义语法(传统上,在命名空间范围内)定义的函数,您将具有选择性地包括使这些运算符可用或不可用的标头的功能.



2> eduffy..:

它们不是相互排斥的."friend"表示非成员函数可以访问该类的私有成员."inline"表示没有函数调用调用,函数体在每个调用站点都是重复的(在汇编中).


但从不如此,"内联"*具有*效果.这不是没用的.它将为ODR提供一些特别有用的前提.无论如何,内联*在这里是冗余的,因为朋友定义中定义的函数是隐式内联的
关键字"inline"并不意味着它实际上是内联代码.它是编译器的"提示".只有在有意义的情况下,编译器才会内联.

3> pyon..:

在语法上说......

friend关键字仍然需要告诉编译器,这个功能是不是类,成员编辑:而是一个非成员函数,可以看到类的私有成员.


但是,这可以更加干净地实现,如下所示:

/* friend */ inline bool operator ==(const MonitorObjectString& rhs) const
{ return fVal == rhs.fVal; }

(当然,我假设fVal它是一种合适的类型,可以在不影响其常数的情况下进行比较.)


你的"更干净"的解决方案被许多人视为糟糕的设计.如果我创建一个可以隐式转换为"MonitorObjectString"的"ShmooptyString"代码MOS == SS将编译,但SS == MOS将不会.问题是参数允许隐式转换,但你不能隐式转换"this"
结果是相似的; 但一般来说,非修改运算符应该更喜欢非成员,因为如果运算符是成员函数,则编译器不能将左手类型转换为类类型; 而它可以具有非成员功能.
Eduardo,它是如何"更干净"的?它拥有相同的私人会员访问权限并已成为会员.所以它有更强的耦合,这是更糟糕的.朋友的定义会更清晰.
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有