⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter12.html

📁 《C++编程思想》中文版。。。。。。。。。。。。。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>~(<font color=#0000ff>const</font> Integer&amp; a);
  <font color=#0000ff>friend</font> Integer*
    <font color=#0000ff>operator</font>&amp;(Integer&amp; a);
  <font color=#0000ff>friend</font> <font color=#0000ff>int</font>
    <font color=#0000ff>operator</font>!(<font color=#0000ff>const</font> Integer&amp; a);
  <font color=#009900>// Side effects have non-const&amp; argument:</font>
  <font color=#009900>// Prefix:</font>
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer&amp;
    <font color=#0000ff>operator</font>++(Integer&amp; a);
  <font color=#009900>// Postfix:</font>
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>++(Integer&amp; a, <font color=#0000ff>int</font>);
  <font color=#009900>// Prefix:</font>
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer&amp;
    <font color=#0000ff>operator</font>--(Integer&amp; a);
  <font color=#009900>// Postfix:</font>
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>--(Integer&amp; a, <font color=#0000ff>int</font>);
};

<font color=#009900>// Global operators:</font>
<font color=#0000ff>const</font> Integer&amp; <font color=#0000ff>operator</font>+(<font color=#0000ff>const</font> Integer&amp; a) {
  cout &lt;&lt; <font color=#004488>"+Integer\n"</font>;
  <font color=#0000ff>return</font> a; <font color=#009900>// Unary + has no effect</font>
}
<font color=#0000ff>const</font> Integer <font color=#0000ff>operator</font>-(<font color=#0000ff>const</font> Integer&amp; a) {
  cout &lt;&lt; <font color=#004488>"-Integer\n"</font>;
  <font color=#0000ff>return</font> Integer(-a.i);
}
<font color=#0000ff>const</font> Integer <font color=#0000ff>operator</font>~(<font color=#0000ff>const</font> Integer&amp; a) {
  cout &lt;&lt; <font color=#004488>"~Integer\n"</font>;
  <font color=#0000ff>return</font> Integer(~a.i);
}
Integer* <font color=#0000ff>operator</font>&amp;(Integer&amp; a) {
  cout &lt;&lt; <font color=#004488>"&amp;Integer\n"</font>;
  <font color=#0000ff>return</font> a.This(); <font color=#009900>// &amp;a is recursive!</font>
}
<font color=#0000ff>int</font> <font color=#0000ff>operator</font>!(<font color=#0000ff>const</font> Integer&amp; a) {
  cout &lt;&lt; <font color=#004488>"!Integer\n"</font>;
  <font color=#0000ff>return</font> !a.i;
}
<font color=#009900>// Prefix; return incremented value</font>
<font color=#0000ff>const</font> Integer&amp; <font color=#0000ff>operator</font>++(Integer&amp; a) {
  cout &lt;&lt; <font color=#004488>"++Integer\n"</font>;
  a.i++;
  <font color=#0000ff>return</font> a;
}
<font color=#009900>// Postfix; return the value before increment:</font>
<font color=#0000ff>const</font> Integer <font color=#0000ff>operator</font>++(Integer&amp; a, <font color=#0000ff>int</font>) {
  cout &lt;&lt; <font color=#004488>"Integer++\n"</font>;
  Integer before(a.i);
  a.i++;
  <font color=#0000ff>return</font> before;
}
<font color=#009900>// Prefix; return decremented value</font>
<font color=#0000ff>const</font> Integer&amp; <font color=#0000ff>operator</font>--(Integer&amp; a) {
  cout &lt;&lt; <font color=#004488>"--Integer\n"</font>;
  a.i--;
  <font color=#0000ff>return</font> a;
}
<font color=#009900>// Postfix; return the value before decrement:</font>
<font color=#0000ff>const</font> Integer <font color=#0000ff>operator</font>--(Integer&amp; a, <font color=#0000ff>int</font>) {
  cout &lt;&lt; <font color=#004488>"Integer--\n"</font>;
  Integer before(a.i);
  a.i--;
  <font color=#0000ff>return</font> before;
}

<font color=#009900>// Show that the overloaded operators work:</font>
<font color=#0000ff>void</font> f(Integer a) {
  +a;
  -a;
  ~a;
  Integer* ip = &amp;a;
  !a;
  ++a;
  a++;
  --a;
  a--;
}

<font color=#009900>// Member functions (implicit "this"):</font>
<font color=#0000ff>class</font> Byte {
  <font color=#0000ff>unsigned</font> <font color=#0000ff>char</font> b;
<font color=#0000ff>public</font>:
  Byte(<font color=#0000ff>unsigned</font> <font color=#0000ff>char</font> bb = 0) : b(bb) {}
  <font color=#009900>// No side effects: const member function:</font>
  <font color=#0000ff>const</font> Byte&amp; <font color=#0000ff>operator</font>+() <font color=#0000ff>const</font> {
    cout &lt;&lt; <font color=#004488>"+Byte\n"</font>;
    <font color=#0000ff>return</font> *<font color=#0000ff>this</font>;
  }
  <font color=#0000ff>const</font> Byte <font color=#0000ff>operator</font>-() <font color=#0000ff>const</font> {
    cout &lt;&lt; <font color=#004488>"-Byte\n"</font>;
    <font color=#0000ff>return</font> Byte(-b);
  }
  <font color=#0000ff>const</font> Byte <font color=#0000ff>operator</font>~() <font color=#0000ff>const</font> {
    cout &lt;&lt; <font color=#004488>"~Byte\n"</font>;
    <font color=#0000ff>return</font> Byte(~b);
  }
  Byte <font color=#0000ff>operator</font>!() <font color=#0000ff>const</font> {
    cout &lt;&lt; <font color=#004488>"!Byte\n"</font>;
    <font color=#0000ff>return</font> Byte(!b);
  }
  Byte* <font color=#0000ff>operator</font>&amp;() {
    cout &lt;&lt; <font color=#004488>"&amp;Byte\n"</font>;
    <font color=#0000ff>return</font> <font color=#0000ff>this</font>;
  }
  <font color=#009900>// Side effects: non-const member function:</font>
  <font color=#0000ff>const</font> Byte&amp; <font color=#0000ff>operator</font>++() { <font color=#009900>// Prefix</font>
    cout &lt;&lt; <font color=#004488>"++Byte\n"</font>;
    b++;
    <font color=#0000ff>return</font> *<font color=#0000ff>this</font>;
  }
  <font color=#0000ff>const</font> Byte <font color=#0000ff>operator</font>++(<font color=#0000ff>int</font>) { <font color=#009900>// Postfix</font>
    cout &lt;&lt; <font color=#004488>"Byte++\n"</font>;
    Byte before(b);
    b++;
    <font color=#0000ff>return</font> before;
  }
  <font color=#0000ff>const</font> Byte&amp; <font color=#0000ff>operator</font>--() { <font color=#009900>// Prefix</font>
    cout &lt;&lt; <font color=#004488>"--Byte\n"</font>;
    --b;
    <font color=#0000ff>return</font> *<font color=#0000ff>this</font>;
  }
  <font color=#0000ff>const</font> Byte <font color=#0000ff>operator</font>--(<font color=#0000ff>int</font>) { <font color=#009900>// Postfix</font>
    cout &lt;&lt; <font color=#004488>"Byte--\n"</font>;
    Byte before(b);
    --b;
    <font color=#0000ff>return</font> before;
  }
};

<font color=#0000ff>void</font> g(Byte b) {
  +b;
  -b;
  ~b;
  Byte* bp = &amp;b;
  !b;
  ++b;
  b++;
  --b;
  b--;
}

<font color=#0000ff>int</font> main() {
  Integer a;
  f(a);
  Byte b;
  g(b);
} <font color=#009900>///:~</font></PRE></FONT></BLOCKQUOTE>

<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">The functions are grouped according to
the way their arguments are passed. Guidelines for how to pass and return
arguments are given later. The forms above (and the ones that follow in the next
section) are typically what you&#8217;ll use, so start with them as a pattern
when overloading your own operators.</FONT><BR></P></DIV>
<A NAME="Heading353"></A><FONT FACE = "Verdana"><H4 ALIGN="LEFT">
Increment &amp;
decrement<BR><A NAME="Index1986"></A><A NAME="Index1987"></A></H4></FONT>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">The overloaded <B>++</B> and <B>&#8211;
&#8211; </B>operators present a dilemma because you want to be able to call
different functions depending on whether they appear before (prefix) or after
(postfix) the object they&#8217;re acting upon. The solution is simple, but
people sometimes find it a bit confusing at first. When the compiler sees, for
example, <B>++a</B> (a pre-increment), it generates a call to
<B>operator++<A NAME="Index1988"></A><A NAME="Index1989"></A>(a)</B>; but when
it sees <B>a++,</B> it generates a call to <B>operator++(a, int)</B>. That is,
the compiler differentiates between the two forms by making calls to different
overloaded functions. In <B>OverloadingUnaryOperators.cpp</B> for the member
function versions, if the compiler sees <B>++b</B>, it generates a call to
<B>B::operator++(&#160;)</B>; if it sees <B>b++</B> it calls
<B>B::operator++(int)</B>.</FONT><BR></P></DIV>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">All the user sees is that a different
function gets called for the prefix
<A NAME="Index1990"></A><A NAME="Index1991"></A><A NAME="Index1992"></A><A NAME="Index1993"></A>and
postfix versions. Underneath, however, the two functions calls have different
signatures, so they link to two different function bodies. The compiler passes a
dummy constant value for the <B>int</B> argument (which is never given an
identifier because the value is never used) to generate the different signature
for the postfix
version.</FONT><A NAME="_Toc312373976"></A><A NAME="_Toc472654951"></A><BR></P></DIV>
<A NAME="Heading354"></A><FONT FACE = "Verdana"><H3 ALIGN="LEFT">
Binary operators<BR><A NAME="Index1994"></A><A NAME="Index1995"></A></H3></FONT>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">The following listing repeats the example
of <B>OverloadingUnaryOperators.cpp</B> for binary operators so you have an
example of all the operators you might want to overload. Again, both global
versions and member function versions are shown.</FONT><BR></P></DIV>

<BLOCKQUOTE><FONT SIZE = "+1"><PRE><font color=#009900>//: C12:Integer.h</font>
<font color=#009900>// Non-member overloaded operators</font>
#ifndef INTEGER_H
#define INTEGER_H
#include &lt;iostream&gt;

<font color=#009900>// Non-member functions:</font>
<font color=#0000ff>class</font> Integer { 
  <font color=#0000ff>long</font> i;
<font color=#0000ff>public</font>:
  Integer(<font color=#0000ff>long</font> ll = 0) : i(ll) {}
  <font color=#009900>// Operators that create new, modified value:</font>
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>+(<font color=#0000ff>const</font> Integer&amp; left,
              <font color=#0000ff>const</font> Integer&amp; right);
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>-(<font color=#0000ff>const</font> Integer&amp; left,
              <font color=#0000ff>const</font> Integer&amp; right);
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>*(<font color=#0000ff>const</font> Integer&amp; left,
              <font color=#0000ff>const</font> Integer&amp; right);
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>/(<font color=#0000ff>const</font> Integer&amp; left,
              <font color=#0000ff>const</font> Integer&amp; right);
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>%(<font color=#0000ff>const</font> Integer&amp; left,
              <font color=#0000ff>const</font> Integer&amp; right);
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>^(<font color=#0000ff>const</font> Integer&amp; left,
              <font color=#0000ff>const</font> Integer&amp; right);
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>&amp;(<font color=#0000ff>const</font> Integer&amp; left,
              <font color=#0000ff>const</font> Integer&amp; right);
  <font color=#0000ff>friend</font> <font color=#0000ff>const</font> Integer
    <font color=#0000ff>operator</font>|(<font color=#0000ff>const</font> Integer&amp; left,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -