Operator Overloading part 1(Chapter 12 of Thinking in C++)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <iostream>
2 using namespace std;
3
4 class Integer
5 {
6 long i;
7 Integer* This() { return this; }
8 public:
9 Integer(long ll=0) : i(ll) {}
10 friend const Integer& operator+(const Integer& a);
11 friend const Integer operator-(const Integer& a);
12 friend const Integer operator~(const Integer& a);
13 friend Integer* operator&(Integer& a);
14 friend int operator!(const Integer& a);
15 friend const Integer& operator++(Integer& a);
16 friend const Integer operator++(Integer& a, int);
17 friend const Integer& operator--(Integer& a);
18 friend const Integer operator--(Integer& a, int);
19 };
20
21 const Integer& operator+(const Integer& a)
22 {
23 cout << "+Integer\n";
24 return a;
25 }
26
27 const Integer operator-(const Integer& a)
28 {
29 cout << "-Integer\n";
30 return Integer(-a.i);
31 }
32
33 const Integer operator~(const Integer& a)
34 {
35 cout << "~Integer\n";
36 return Integer(~a.i);
37 }
38
39 Integer* operator&(Integer& a)
40 {
41 cout << "&Integer\n";
42 return a.This();
43 }
44
45 int operator!(const Integer& a)
46 {
47 cout << "!Integer\n";
48 return !a.i;
49 }
50
51 const Integer& operator++(Integer& a)
52 {
53 cout << "++Integer\n";
54 a.i++;
55 return a;
56 }
57
58 const Integer operator++(Integer& a, int)
59 {
60 cout << "Integer++\n";
61 Integer before(a.i);
62 a.i++;
63 return before;
64 }
65
66 const Integer& operator--(Integer& a)
67 {
68 cout << "--Integer\n";
69 a.i--;
70 return a;
71 }
72
73 const Integer operator--(Integer& a, int)
74 {
75 cout << "Integer--\n";
76 Integer before(a.i);
77 a.i--;
78 return before;
79 }
80
81 void f(Integer a)
82 {
83 +a;
84 -a;
85 ~a;
86 Integer* ip = &a;
87 !a;
88 ++a;
89 a++;
90 --a;
91 a--;
92 }
93
94 class Byte
95 {
96 unsigned char b;
97 public:
98 Byte(unsigned char bb=0) : b(bb) {}
99 const Byte& operator+() const
100 {
101 cout << "+Byte\n";
102 return *this;
103 }
104
105 const Byte operator-() const
106 {
107 cout << "-Byte\n";
108 return Byte(-b);
109 }
110
111 const Byte operator~() const
112 {
113 cout << "~Byte\n";
114 return Byte(~b);
115 }
116
117 Byte operator!() const
118 {
119 cout << "!Byte\n";
120 return Byte(!b);
121 }
122
123 Byte* operator&()
124 {
125 cout << "&Byte\n";
126 return this;
127 }
128
129 const Byte& operator++()
130 {
131 cout << "++Byte\n";
132 b++;
133 return *this;
134 }
135
136 const Byte operator++(int)
137 {
138 cout << "Byte++\n";
139 Byte before(b);
140 b++;
141 return before;
142 }
143
144 const Byte& operator--()
145 {
146 cout << "--Byte\n";
147 --b;
148 return *this;
149 }
150
151 const Byte operator--(int)
152 {
153 cout << "Byte--\n";
154 Byte before(b);
155 --b;
156 return before;
157 }
158 };
159
160 void g(Byte b)
161 {
162 +b;
163 -b;
164 ~b;
165 Byte* bp = &b;
166 !b;
167 ++b;
168 b++;
169 --b;
170 b--;
171 }
172
173 int main()
174 {
175 Integer a;
176 f(a);
177 Byte b;
178 g(b);
179 }
2 using namespace std;
3
4 class Integer
5 {
6 long i;
7 Integer* This() { return this; }
8 public:
9 Integer(long ll=0) : i(ll) {}
10 friend const Integer& operator+(const Integer& a);
11 friend const Integer operator-(const Integer& a);
12 friend const Integer operator~(const Integer& a);
13 friend Integer* operator&(Integer& a);
14 friend int operator!(const Integer& a);
15 friend const Integer& operator++(Integer& a);
16 friend const Integer operator++(Integer& a, int);
17 friend const Integer& operator--(Integer& a);
18 friend const Integer operator--(Integer& a, int);
19 };
20
21 const Integer& operator+(const Integer& a)
22 {
23 cout << "+Integer\n";
24 return a;
25 }
26
27 const Integer operator-(const Integer& a)
28 {
29 cout << "-Integer\n";
30 return Integer(-a.i);
31 }
32
33 const Integer operator~(const Integer& a)
34 {
35 cout << "~Integer\n";
36 return Integer(~a.i);
37 }
38
39 Integer* operator&(Integer& a)
40 {
41 cout << "&Integer\n";
42 return a.This();
43 }
44
45 int operator!(const Integer& a)
46 {
47 cout << "!Integer\n";
48 return !a.i;
49 }
50
51 const Integer& operator++(Integer& a)
52 {
53 cout << "++Integer\n";
54 a.i++;
55 return a;
56 }
57
58 const Integer operator++(Integer& a, int)
59 {
60 cout << "Integer++\n";
61 Integer before(a.i);
62 a.i++;
63 return before;
64 }
65
66 const Integer& operator--(Integer& a)
67 {
68 cout << "--Integer\n";
69 a.i--;
70 return a;
71 }
72
73 const Integer operator--(Integer& a, int)
74 {
75 cout << "Integer--\n";
76 Integer before(a.i);
77 a.i--;
78 return before;
79 }
80
81 void f(Integer a)
82 {
83 +a;
84 -a;
85 ~a;
86 Integer* ip = &a;
87 !a;
88 ++a;
89 a++;
90 --a;
91 a--;
92 }
93
94 class Byte
95 {
96 unsigned char b;
97 public:
98 Byte(unsigned char bb=0) : b(bb) {}
99 const Byte& operator+() const
100 {
101 cout << "+Byte\n";
102 return *this;
103 }
104
105 const Byte operator-() const
106 {
107 cout << "-Byte\n";
108 return Byte(-b);
109 }
110
111 const Byte operator~() const
112 {
113 cout << "~Byte\n";
114 return Byte(~b);
115 }
116
117 Byte operator!() const
118 {
119 cout << "!Byte\n";
120 return Byte(!b);
121 }
122
123 Byte* operator&()
124 {
125 cout << "&Byte\n";
126 return this;
127 }
128
129 const Byte& operator++()
130 {
131 cout << "++Byte\n";
132 b++;
133 return *this;
134 }
135
136 const Byte operator++(int)
137 {
138 cout << "Byte++\n";
139 Byte before(b);
140 b++;
141 return before;
142 }
143
144 const Byte& operator--()
145 {
146 cout << "--Byte\n";
147 --b;
148 return *this;
149 }
150
151 const Byte operator--(int)
152 {
153 cout << "Byte--\n";
154 Byte before(b);
155 --b;
156 return before;
157 }
158 };
159
160 void g(Byte b)
161 {
162 +b;
163 -b;
164 ~b;
165 Byte* bp = &b;
166 !b;
167 ++b;
168 b++;
169 --b;
170 b--;
171 }
172
173 int main()
174 {
175 Integer a;
176 f(a);
177 Byte b;
178 g(b);
179 }