<code>#include <iostream></code>
<code>using</code> <code>namespace</code> <code>std;</code>
<code>class</code> <code>Integer {</code>
<code> </code><code>long</code> <code>i;</code>
<code> </code><code>Integer* This() { </code><code>return</code> <code>this</code><code>; }</code>
<code>public</code><code>:</code>
<code> </code><code>Integer(</code><code>long</code> <code>ll = 0) : i(ll) {}</code>
<code> </code><code>// No side effects takes const& argument:</code>
<code> </code><code>friend</code> <code>const</code> <code>Integer&</code>
<code> </code><code>operator+(</code><code>const</code> <code>Integer& a);</code>
<code> </code><code>friend</code> <code>const</code> <code>Integer</code>
<code> </code><code>operator-(</code><code>const</code> <code>Integer& a);</code>
<code> </code><code>operator~(</code><code>const</code> <code>Integer& a);</code>
<code> </code><code>friend</code> <code>Integer*</code>
<code> </code><code>operator&(Integer& a);</code>
<code> </code><code>friend</code> <code>int</code>
<code> </code><code>operator!(</code><code>const</code> <code>Integer& a);</code>
<code> </code><code>// Side effects have non-const& argument:</code>
<code> </code><code>// Prefix:</code>
<code> </code><code>operator++(Integer& a);</code>
<code> </code><code>// Postfix:</code>
<code> </code><code>operator++(Integer& a, </code><code>int</code><code>);</code>
<code> </code><code>operator--(Integer& a);</code>
<code> </code><code>operator--(Integer& a, </code><code>int</code><code>);</code>
<code>};</code>
<code>// Global operators:</code>
<code>const</code> <code>Integer& operator+(</code><code>const</code> <code>Integer& a) {</code>
<code> </code><code>cout << </code><code>"+Integer\n"</code><code>;</code>
<code> </code><code>return</code> <code>a; </code><code>// Unary + has no effect</code>
<code>}</code>
<code>const</code> <code>Integer operator-(</code><code>const</code> <code>Integer& a) {</code>
<code> </code><code>cout << </code><code>"-Integer\n"</code><code>;</code>
<code> </code><code>return</code> <code>Integer(-a.i);</code>
<code>const</code> <code>Integer operator~(</code><code>const</code> <code>Integer& a) {</code>
<code> </code><code>cout << </code><code>"~Integer\n"</code><code>;</code>
<code> </code><code>return</code> <code>Integer(~a.i);</code>
<code>Integer* operator&(Integer& a) {</code>
<code> </code><code>cout << </code><code>"&Integer\n"</code><code>;</code>
<code> </code><code>return</code> <code>a.This(); </code><code>// &a is recursive!</code>
<code>int</code> <code>operator!(</code><code>const</code> <code>Integer& a) {</code>
<code> </code><code>cout << </code><code>"!Integer\n"</code><code>;</code>
<code> </code><code>return</code> <code>!a.i;</code>
<code>// Prefix; return incremented value</code>
<code>const</code> <code>Integer& operator++(Integer& a) {</code>
<code> </code><code>cout << </code><code>"++Integer\n"</code><code>;</code>
<code> </code><code>a.i++;</code>
<code> </code><code>return</code> <code>a;</code>
<code>// Postfix; return the value before increment:</code>
<code>const</code> <code>Integer operator++(Integer& a, </code><code>int</code><code>) {</code>
<code> </code><code>cout << </code><code>"Integer++\n"</code><code>;</code>
<code> </code><code>Integer before(a.i);</code>
<code> </code><code>return</code> <code>before;</code>
<code>// Prefix; return decremented value</code>
<code>const</code> <code>Integer& operator--(Integer& a) {</code>
<code> </code><code>cout << </code><code>"--Integer\n"</code><code>;</code>
<code> </code><code>a.i--;</code>
<code>// Postfix; return the value before decrement:</code>
<code>const</code> <code>Integer operator--(Integer& a, </code><code>int</code><code>) {</code>
<code> </code><code>cout << </code><code>"Integer--\n"</code><code>;</code>
<code>int</code> <code>main() {</code>
<code> </code><code>Integer a;</code>
<code> </code><code>+a;</code>
<code> </code><code>-a;</code>
<code> </code><code>~a;</code>
<code> </code><code>Integer* ip = &a;</code>
<code> </code><code>!a;</code>
<code> </code><code>++a;</code>
<code> </code><code>a++;</code>
<code> </code><code>--a;</code>
<code> </code><code>a--;</code>
<code> </code>
<code> </code><code>return</code> <code>0;</code>
<code>} </code><code>///:~</code>
<code></code>
本文轉自FrankNie0101 51CTO部落格,原文連結:http://blog.51cto.com/frankniefaquan/1934028,如需轉載請自行聯系原作者