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'而导致结果不正确。