1 //a simple class for binary number by tsaiwn@csie.nctu.edu.tw 2 #include 3 class BIN{ 4 protected: long data; // so that can be accessed by derived class 5 friend ostream& operator<< (ostream&, const BIN&); 6 public: 7 BIN(){data=0;}; 8 BIN(long); 9 BIN(BIN& x) // copy constructor 10 { data = 3; cout << "(copy)"; // data = x.data; 11 } 12 }; 13 BIN::BIN(long x) { data=x; } 14 ////// 15 // new class inherit from BIN (i.e., we reuse BIN to build a new class) 16 class BINREAL: public BIN{ 17 float fdata; 18 public: 19 BINREAL(){data=0; setBin( ); }; 20 BINREAL(float x) { fdata=x; setBin( ); } 21 void setBin( ) { 22 long * ptemp = (long *) &fdata; 23 data = *ptemp; // data = ptemp[0]; 24 } 25 }; 26 int main() 27 { float m; 28 BINREAL y; 29 m=1234567.3; // actually it is 1234567.25 30 y=m; 31 cout << "m=" << m; 32 cout << "=== y =" << y << endl;; 33 BIN x=y; // will call copy constructor 34 cout << "\t\t x= " << x << " Note\n"; 35 cout << "What if the copy constructor is removed?\n\n"; 36 while(m){ 37 cout << "Input a float number:"; 38 cin >> m; 39 y = m; 40 cout << "===" << y; 41 cout << " = " << m << endl; 42 } 43 cout << "Thank you for using AT&T:-)\n"; 44 } 45 ostream& operator<< (ostream& oo, const BIN& x) 46 { 47 long tmp,i; 48 tmp = x.data; 49 for(i=1; i<=32; i++){ 50 if(tmp<0) oo << 1; 51 else oo << 0; 52 if(i%4 == 0) cout << " "; // Ohh .. bug? 53 tmp = tmp << 1; 54 } 55 return oo; 56 } 57 /*** answer: 58 10:24am magpie::oop/> g++ binfloat.cpp 59 10:25am magpie::oop/> ./a.out 60 m=1.23457e+06=== y =0100 1001 1001 0110 1011 0100 0011 1010 61 (copy) x= 0000 0000 0000 0000 0000 0000 0000 0011 Note 62 What if the copy constructor is removed? 63 64 Input a float number:1234567.2 65 ===0100 1001 1001 0110 1011 0100 0011 1010 = 1.23457e+06 66 Input a float number:0.25 67 ===0011 1110 1000 0000 0000 0000 0000 0000 = 0.25 68 Input a float number:0.5 69 ===0011 1111 0000 0000 0000 0000 0000 0000 = 0.5 70 Input a float number:1.0 71 ===0011 1111 1000 0000 0000 0000 0000 0000 = 1 72 Input a float number:1.25 73 ===0011 1111 1010 0000 0000 0000 0000 0000 = 1.25 74 Input a float number:1.75 75 ===0011 1111 1110 0000 0000 0000 0000 0000 = 1.75 76 Input a float number:1.875 77 ===0011 1111 1111 0000 0000 0000 0000 0000 = 1.875 78 Input a float number:0 79 ===0000 0000 0000 0000 0000 0000 0000 0000 = 0 80 Thank you for using AT&T:-) 81 10:26am magpie::oop/> 82 *******************/