在 The C ++ Programming Language 一书中,作者声称,对于以下类设计,
class complex{
double re, im;
public:
double real( ) const { return re;}
double imag( ) const { return im;}
};
给定real()和imag(),我们可以定义所有类型的有用运算符,而不允许它们直接访问复杂的表示。
如何理解这句话?我们在哪里需要直接访问?我们在哪里需要间接访问?
作者还给出了以下示例。
inline bool operator==(complex a, complex b)
{
return a.real( )==b.real() && a.imag () ==b.imag( );
}
这个例子如何与上面给出的作者陈述有关。
答案 0 :(得分:1)
作者在这里谈论的内容被称为“封装”。定义“==”的新函数定义了比较新类型(复杂)的两个对象的逻辑,而不必知道复数的内部实际上是什么样的。
你的问题非常模糊,所以我认为你想要做的是学习更多关于“面向对象编程”和“封装”的内容。谷歌搜索这些条款应该会有所帮助。
事实上,this可能是一个很好的起点。
答案 1 :(得分:0)
相关的是,您不能直接访问re
和im
,而是通过访问权限real()
和imag()
访问它们。
如果函数是这样写的:
return a.re==b.re && a.im==b.im;
然后它必须是朋友功能(需要访问私人成员)。
答案 2 :(得分:0)
作者试图说明不公开类complex
的实际实现细节的优点。您可以随时更改实际的底层实现,而无需更改任何其他代码,只要这两种方法始终执行用户期望的操作即可。
答案 3 :(得分:0)
这意味着,您无法访问Complex
的真实成员,因为re
和im
是私有的,而getter(访问者)会返回值的副本。那叫做封装。
该示例显示如何比较2个Complex
个对象,而不触及私有数据成员。 (否则,如果你公开re
和im
,任何人都可以随时更改它们,这会破坏OOP的主要目标之一 - 正如我所说,封装)。
答案 4 :(得分:0)
由于operator==
是一个自由函数,它甚至不是类的friend
,所以它不能访问类的私有成员,但它可以访问{{1}的公共成员函数因此,它可以在公共成员函数的帮助下实现complex
。这就是作者的意思。这也是作者对data encapsulation的一个很好的证明!
顺便说一下,通过定义as,
可以进一步改进实现operator==
请注意参数:现在,它们被定义为参考,以便避免不必要的副本!
答案 5 :(得分:0)
operator==
通过real
/ imag
界面检查两个复数是否相等,而不直接触及re
和im
成员。
这意味着
complex &
的功能无法更改成员,因为它们实际上是const
(只能通过const
访问者访问),并且complex
类更改为polar form中的号码,而不会损坏除real
和imag
成员之外的所有内容。这称为“封装”或“数据隐藏”。