关于类Complex的成员函数设计的问题

时间:2011-03-08 15:17:50

标签: c++ oop class

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( );
}

这个例子如何与上面给出的作者陈述有关。

6 个答案:

答案 0 :(得分:1)

作者在这里谈论的内容被称为“封装”。定义“==”的新函数定义了比较新类型(复杂)的两个对象的逻辑,而不必知道复数的内部实际上是什么样的。

你的问题非常模糊,所以我认为你想要做的是学习更多关于“面向对象编程”和“封装”的内容。谷歌搜索这些条款应该会有所帮助。

事实上,this可能是一个很好的起点。

答案 1 :(得分:0)

相关的是,您不能直接访问reim,而是通过访问权限real()imag()访问它们。

如果函数是这样写的:

return a.re==b.re && a.im==b.im;

然后它必须是朋友功能(需要访问私人成员)。

答案 2 :(得分:0)

作者试图说明不公开类complex的实际实现细节的优点。您可以随时更改实际的底层实现,而无需更改任何其他代码,只要这两种方法始终执行用户期望的操作即可。

答案 3 :(得分:0)

这意味着,您无法访问Complex的真实成员,因为reim是私有的,而getter(访问者)会返回值的副本。那叫做封装。

该示例显示如何比较2个Complex个对象,而不触及私有数据成员。 (否则,如果你公开reim,任何人都可以随时更改它们,这会破坏OOP的主要目标之一 - 正如我所说,封装)。

答案 4 :(得分:0)

由于operator==是一个自由函数,它甚至不是类的friend,所以它不能访问类的私有成员,但它可以访问{{1}的公共成员函数因此,它可以在公共成员函数的帮助下实现complex。这就是作者的意思。这也是作者对data encapsulation的一个很好的证明!

顺便说一下,通过定义as,

可以进一步改进实现
operator==

请注意参数:现在,它们被定义为参考,以便避免不必要的副本!

答案 5 :(得分:0)

operator==通过real / imag界面检查两个复数是否相等,而不直接触及reim成员。

这意味着

  1. 接收complex &的功能无法更改成员,因为它们实际上是const(只能通过const访问者访问),并且
  2. 您可以稍后将complex类更改为polar form中的号码,而不会损坏除realimag成员之外的所有内容。
  3. 这称为“封装”或“数据隐藏”。