您的位置:首页 > 编程语言 > C语言/C++

c++运算符重载

2015-01-09 12:23 204 查看
#pragma once
2 #include <iostream>
3 using namespace std;
4 class INT;
5 ostream &operator<<(ostream &out,const INT &a);
6 INT & operator>>(istream &in,const INT &a);
7 INT operator - (const INT &a,const INT &b);
8 class INT
9 {
10 public:
11     INT(int X=0):x(X)
12     {
13     }
14 //双目运算符重载//
INT  operator + (const INT & a);
16  INT  operator * (const INT & a);
17  INT  operator / (const INT & a);
18  INT  operator % (const INT & a);
19  INT  operator &&(const INT & a);
20  INT  operator ||(const INT & a);
21  INT  operator ==(const INT & a);
22  INT  operator !=(const INT & a);
23  INT  operator <<(const INT & a);
24  INT  operator >>(const INT & a);
25  INT  operator  <(const INT & a);
26  INT  operator  >(const INT & a);
27  INT  operator >=(const INT & a);
28  INT  operator <=(const INT & a);
29  INT  operator & (const INT & a);
30  INT  operator | (const INT & a);
31  INT  operator +=(const INT & a);
32  INT  operator = (const INT & a);
33  INT  operator -=(const INT & a);
34  INT  operator /=(const INT & a);
35  INT  operator *=(const INT & a);
36  INT  operator %=(const INT & a);
37  INT  operator ^ (const INT & a);//按位异或。
//单目运算符
39  INT  operator ++(int);
40  INT  operator ++();
41  INT  operator !();
42  INT  operator ~();
43  INT  operator &();//这里没有地址,所以产生的是随机值。
44  INT  operator ()(const INT & a);
45 friend INT operator - (const INT &a,const INT & b);
46 //输出输入流//
47 friend ostream & operator <<(ostream &out,const INT &a );
48 friend INT & operator >>(istream &in, INT &a);
49 private:
50     int x;
51 };
52 INT INT :: operator ()(const INT & a)
53 {
54   return INT(a.x);
55 }
INT INT :: operator & ()
57 {
58   return INT((int)&x);
59 }
60 INT INT :: operator ~ ()
61 {
62   return INT(~x);
63 }
64 INT INT :: operator ! ()
65 {
66   return (!x);
67 }
68 INT INT :: operator ++()
69 {
70   x++;
71   return INT(x);
72 }
73 INT INT :: operator ++(int)
74 {
75    INT a(x);
76    x++;
77    return a;
78 }
INT INT ::operator =  (const INT & a)
80 {
81   return INT(x=a.x);
82 }
83 INT INT ::operator ^  (const INT & a)
84 {
85   return INT(x^a.x);
86 }
87 INT INT ::operator %= (const INT & a)
88 {
89   return INT(x%=(a.x));
90 }
91 INT INT ::operator *= (const INT & a)
92 {
93   return INT(x*=(a.x));
94 }
95 INT INT ::operator /= (const INT & a)
96 {
97   return INT(x/=(a.x));
}
99 INT INT ::operator -= (const INT & a)
100 {
101   return INT(x-=a.x);
102 }
103 INT INT ::operator += (const INT & a)
104 {
105   return INT(x+=a.x);
106 }
107 INT INT ::operator |  (const INT & a)
108 {
109   return INT(x | a.x);
110 }
111 INT INT ::operator &  (const INT & a)
112 {
113   return INT( x & (a.x) );
114 }
115 INT INT ::operator <= (const INT & a)
116 {
117   return INT(x<=a.x);
118 }
INT INT ::operator >= (const INT & a)
120 {
121     return INT(x>=a.x);
122 }
123 INT INT :: operator > (const INT & a)
124 {
125   return INT(x>a.x);
126 }
127 INT INT :: operator < (const INT & a)
128 {
129   return INT(x<a.x);
130 }
131 INT INT :: operator >> (const INT &a )
132 {
133   return INT( (x>>a.x) );
134 }
135 INT INT :: operator << (const INT & a)
136 {
137   return INT((x<<a.x));
138 }
139 INT INT :: operator != (const INT & a)
140 {
141     return INT(x != a.x);
142 }
INT INT :: operator == (const INT & a)
144 {
145   return INT(x == a.x);
146 }
147 INT INT :: operator || (const INT & a)
148 {
149     return INT( x || (a.x) );
150 }
151 INT INT :: operator && (const INT & a)
152 {
153     return INT(x&&(a.x));
154 }
155 INT INT :: operator % (const INT & a)
156 {
157   return INT(x%(a.x));
158 }
159 INT INT ::  operator / (const INT & a)
160 {
161     return INT(x/(a.x));
162 }
163 INT INT::operator *(const INT &a)
164 {
165     return INT(x*(a.x));
166 }
INT & operator >> (istream &in, INT &a)
168 {
169  in >> (a.x);
170  return a;
171 }
172 INT operator - (const INT &a,const INT & b )
173 {
174    return INT(a.x-b.x);
175 }
176 INT  INT::operator + (const INT &a)
177 {
178   return INT(x+a.x);
179 }
180 ostream & operator <<(ostream &out,const INT &a )
181 {
182   out<<a.x<<endl;
183 }
184
185 int get_sum(char ch)
186 {
187   if( (ch-'0')>=0 && (ch-'0')<=9 )
188       return 1;
189   else
190       return 0;
}
192 INT coverment(int x,char c,int y)
193 {
194   switch(c)
195     {
196     case '+':return INT(x+y); break;
197     case '-':return INT(x-y); break;
198     case '*':return INT(x*y); break;
199     case '/':return INT(x/y); break;
200     case '%':return INT(x%y); break;
201     case '&':return INT(x&y); break;
202     case '|':return INT(x|y); break;
203     case '<':return INT(x<y); break;
204     case '>':return INT(x>y); break;
205     case '=':return INT(x=y); break;
206     case '^':return INT(x^y); break;
207     }
208 }
209 INT CoverMent(int x,char c,char c1,int y)
210 {
211     switch(c)
{
213         case '&':return INT(x&&y); break;
214         case '|':return INT(x||y); break;
215         case '!':return INT(x!=y); break;
216         case '<':
217           switch(c1)
218         {
219             case '<': return INT(x<<y); break;
220             case '=': return INT(x<=y); break;
221         };
222         break;
223       case '>':
224           switch(c1)
225         {
226           case '>':return INT(x>>y); break;
227           case '=':return INT(x>=y); break;
228         };
229           break;
case '+':return INT(x+=y); break;
231         case '-':return INT(x-=y); break;
232         case '*':return INT(x*=y); break;
233         case '/':return INT(x/=y); break;
234         case '%':return INT(x%=y); break;
235       }
236 }
237 INT COVERMENT(char c,int x)
238 {
239   switch(c)
240     {
241       case '&':return INT((int)&x); break;
242       case '!':return INT(!x); break;
243       case '~':return INT(~x); break;
244     }
245 }
246

以上是INT.h文件,下面是INT.cpp文件

#include <iostream>
2 //#include <ctype.h>
3 #include "INT.h"
4 int main()
5  {
6   char *s1 = new char [20];
7 //  cin>>s1;这里出现了一个错误,就是cin 读取输入的时候是以>    空格为一次读取标记号
8   std::cout<<"please input :"<<std::endl;
9   cin.getline(s1,20);
10   int a=0;
11   int b=0;
12   char ch1;
13   char ch2;
14   while(*s1 == ' ')
15   {
16   s1++;
17   }
18   if( get_sum(*s1) )
19      {
20       while( get_sum(*s1) )
21          {
22           a=a*10+(*s1-'0');
23           s1++;
}
25        while(*s1 == ' ')
26           {
27           s1++;
28           }
29         ch1 = *s1;
30         s1++;
31         while(*s1 == ' ')
32           {
33           s1++;
34           }
35       if( !get_sum(*s1) )
36          {
37           ch2 = *s1;
38           s1++;
39           while(*s1 != '\0')
40            {
41             b=b*10+(*s1-'0');
42             s1++;
43            }
44           INT d=CoverMent(a,ch1,ch2,b);
45           std::cout<<"result is :";
cout<<d<<endl;
47          }
48     else
49        {
50         while( *s1!= '\0' )
51         {
52         b=b*10+(*s1-'0');
53         s1++;
54         }
55        INT d=coverment(a,ch1,b);
56         std::cout<<"result is : ";
57         cout<<d<<endl;
58       }
59   }
60   else
61  {
62     ch1 = *s1;
63     s1++;
64     while(*s1 != '\0')
65     {
66         a = a*10 + (*s1-'0');
67         s1++;
68     }
69     INT d = COVERMENT(ch1,a);
cout<<d<<endl;
71   }
72 return 0;
73  }
做这个的时候遇到了一个问题就是,开始我用cin作为输入字符串的时候,比如说:3 + 2中间有很多空格,就达不到我的预期结果,后来我发现我遗忘了一个知识点就是cin的读取是以空格为结束标记的,所以我选择用cin.getline()来读取一行,'\n'被读取,且自动补全'\0:',而cin.get()则将'\n'留在了输入队列,如果再使用c.get()时会只读一个'\n'而导致结果不正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: