快速业务通道

C++的算符重载

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
r* (); // Access the current element
private:
LinkedListIterator(Node* p);
Node* p_;
friend LinkedList; // so LinkedList can construct a LinkedListIterator
};
class LinkedList {
  public:
  void append(int elem); // Adds elem after the end
  void prepend(int elem); // Adds elem before the beginning  // …
  LinkedListIterator begin();
  LinkedListIterator end();  // …
  private:
  Node* first_;
};

这些是显然可以内联的方法(可能在同一个头文件中):  

inline bool LinkedListIterator::operator== (LinkedListIterator i) const
{
  return p_ == i.p_;
}
vinline bool LinkedListIterator::operator!= (LinkedListIterator i) const
{
  return p_ != i.p_;
}
  inline void LinkedListIterator::operator++()
{
  assert(p_ != NULL); // or if (p_==NULL) throw …
  p_ = p_->next_;
}
inline int& LinkedListIterator::operator*()
{
  assert(p_ != NULL); // or if (p_==NULL) throw …
  return p_->elem_;
}
inline LinkedListIterator::LinkedListIterator(Node* p)
: p_(p)
{ }
inline LinkedListIterator LinkedList::begin()
{
  return first_;
}
inline LinkedListIterator LinkedList::end()
{
  return NULL;
}

结论:链表有两种不同的数据。存储于链表中的元素的值由链表的用户负责(并且只有用户负责,链表本身不阻止用户将第三个元素变成第五个),而链表底层结构的数据(如 next 指针等)值由链表负责(并且只有链表负责,也就是说链表不让用户改变(甚至看到!)可变的next 指针)。

因此 get()/set() 方法只获取和设置链表的元素,而不是链表的底层结构。由于链表隐藏了底层的指针等结构,因此它能够作非常严格的承诺(例如,如果它是双重链表,它可以保证每一个后向指针都被下一个 Node 的前向指针匹配)。

我们看了这个例子,类的一些数据的值由用户负责(这种情况下需要有针对数据的get()/set()方法),但对于类所控制的数据则不必有get()/set()方法。

注意:这个例子的目的不是为了告诉你如何写一个链表类。实际上不要自己做链表类,而应该使用编译器所提供的“容器类”的一种。理论上来说,要使用标准容器类之一,如:std::list 模板。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号