1 Dnh nghu phop toun Dnh nghu phop toun Ni dung Ni dung l. Mo duo 2. Hum phop toun 3. Choyon koo 4. Cun vu kho dong 5. Cuc phop toun thong dong 2 5. Cuc phop toun thong dong 1 Mo au 1 Mo au 1rong C++, cuc koo do oo no tu |bot-n dutu typos): nt, ong, lout, doobo, chur cong vo cuc phop toun +,- ,*,/ cong cup mot cu dut co tho cou khu nom trong tho go thoc. Cuc phop toun nho tron cho phop ngoo so dong toong tuc vo choong trnh thoo mot guo don to nhon ton o. Ngoo so dong co tho co nho cuo tuo cuc koo do oo mo 3 Ngoo so dong co tho co nho cuo tuo cuc koo do oo mo mu ngon ngo khong cong cup nho mu trun, du thoc, so phoc, voctor... Lop trong C++ cong cup mot phoong ton do qo dnh vu boo don cuc ou do toong nho tron. Dong tho tuo khu nung dnh nghu phop toun cho koo do oo mo, nho do ngoo so dong co tho thuo tuc tron koo do oo mo dnh nghu thoo mot guo don thun thon toong to nho koo co sun. Mo au Mo au Mot phop toun u mot ky hoo mu no thuo tuc tron do oo, do oo dooc thuo tuc dooc go u toun hung, bun thun ky hoo dooc go u phop toun. lhop toun co hu toun hung dooc go u phop toun hu ngo |nh phun), ch co mot toun hung dooc go u phop toun mot ngo |don phun). Suo kh dnh nghu phop toun cho mot koo do oo mo, 4 Suo kh dnh nghu phop toun cho mot koo do oo mo, tu co tho so dong no mot cuch thun thon. V do: SoPhuc z(1,3), z1(2,3.4), z2(5.1,4); z = z1 + z2; z = z1 + z2*z1 + SoPhuc(3,1); 2 Ham phep toan 2 Ham phep toan un chut cou phop toun u unh xu, v vuy dnh nghu phop toun u nh ngha ham. 1ut cu cuc phop toun co trong C++ doo co tho dooc dnh nghu. + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> <<= >>= == != <= >= && || ++ -- ->* , -> [] () new delete 5 || ++ -- ->* , -> [] () new delete 1u dnh nghu phop toun bung hum co ton duc bot but duo bung to khou oporutor thoo suo bo ky hoo phop toun cun dnh nghu. V du minh hoa Lp PhanSo V du minh hoa Lp PhanSo typedef int bool; typedef int Item; const bool false = 0, true = 1; long USCLN(long x, long y) { long r; x = abs(x); y = abs(y); 6 x = abs(x); y = abs(y); if (x == 0 || y == 0) return 1; while ((r = x % y) != 0) { x = y; y = r; } return y; } V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo class PhanSo { long tu, mau; void UocLuoc(); public: PhanSo(long t, long m) {Set(t,m);} void Set(long t, long m); long LayTu() const {return tu;} long LayMau() const {return mau;} 7 long LayMau() const {return mau;} PhanSo Cong(PhanSo b) const; PhanSo operator + (PhanSo b) const; PhanSo operator - () const {return PhanSo(-tu, mau);} bool operator == (PhanSo b) const; bool operator != (PhanSo b) const; void Xuat() const; }; V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo void PhanSo::UocLuoc() { long usc = USCLN(tu, mau); tu /= usc; mau /= usc; if (mau < 0) mau = -mau, tu = -tu; if (tu == 0) mau = 1; 8 if (tu == 0) mau = 1; } V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo void PhanSo::Set(long t, long m) { if (m) { tu = t; mau = m; UocLuoc(); } 9 } } void PhanSo::Xuat() const { cout << tu; if (tu != 0 && mau != 1) cout << "/" << mau; } V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo PhanSo PhanSo::Cong(PhanSo b) const { return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau); } PhanSo PhanSo::operator + (PhanSo b) const { return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau); 10 return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau); } bool PhanSo::operator == (PhanSo b) const { return tu*b.mau == mau*b.tu; } V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo Suo kh dnh nghu phop toun, tu co tho dong thoo guo don to nhon: void main() { PhanSo a(2,3), b(3,4), c(0,1),d(0,1); c = a.Cong(b); d = a + b; // d = a.operator + (b); 11 d = a + b; // d = a.operator + (b); cout << "c = "; c.Xuat(); cout << "\n"; cout << "d = "; d.Xuat(); cout << "\n"; cout << "c == d = " << (c == d) << "\n"; cout << "c != d = " << (c != d) << "\n"; (-a).Xuat(); // (a.operator ()).Xuat(); } Mot so rang buoc cua phep toan Mot so rang buoc cua phep toan Kh dnh nghu phop toun th khong dooc thuy do cuc duc tnh muc nhon cou phop toun nho do oo ton, so ngo: khong dooc sung cho phop toun mo nho mod, **, Huo hot cuc phop toun khong rung booc y nghu, ch mot so troong hop cu bot nho phop toun gun |operator =), uy phun to qou ch so |operator []), phop go hum 12 uy phun to qou ch so |operator []), phop go hum |operator ()), vu phop uy thunh phun |operator - >) do ho phu dooc dnh nghu u hum thunh phun do toun hung tho nhut co tho u mot do toong tru |lvalue). Cuc phop toun co sun co co cho kot hop dooc soy don to cuc phop toun thunh phun, v do: a += b; // a = (a+b); a *= b; // a = (a*b); Mot so rang buoc cua phep toan Mot so rang buoc cua phep toan Doo tron khong dong do phop toun dnh nghu cho cuc koo do oo do ngoo so dong dnh nghu. Nghu u tu phu cho dong dnh nghu phop toun +=, -=, *=, >>=, do du dnh nghu phop gun vu cuc phop toun +,-,*,>>, kung booc tron cho phop ngoo so dong cho dong dnh nghu phop toun nuo trooc |+= trooc huy + trooc). 13 nghu phop toun nuo trooc |+= trooc huy + trooc). Ham thanh phan va toan cuc Ham thanh phan va toan cuc 1rong v do tron, tu dnh nghu hum thunh phun co ton duc bot but duo bung to khou oporutor thoo suo bo ton phop toun cun dnh nghu. Suo kh dnh nghu phop toun, tu co tho dong thoo guo don to nhon: void main() { PhanSo a(2,3), b(3,4), c(0,1),d(0,1); 14 PhanSo a(2,3), b(3,4), c(0,1),d(0,1); c = a.Cong(b); d = a + b; // d = a.operator + (b); cout << "c = "; c.Xuat(); cout << "\n"; cout << "d = "; d.Xuat(); cout << "\n"; cout << "c == d = " << (c == d) << "\n"; cout << "c != d = " << (c != d) << "\n"; (-a).Xuat(); // (a.operator ()).Xuat(); } Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc 1rong huo hot cuc troong hop, tu co tho dnh nghu phop toun bung thunh phun houc dong hum toun coc. Kh dnh nghu phop toun bung hum thunh phun, so thum so t hon so ngo mot v du co mot thum so ngum dnh u do toong go phop toun |toun hung tho nhut). lhop toun 2 ngo cun l thum so vu phop toun l ngo khong co thum so: a - b;// a.operator -(b); 15 a - b;// a.operator -(b); -a; // a.operator (); Kh dnh nghu phop toun bung hum toun coc, so thum so bung so ngo, lhop toun 2 ngo cun 2 thum so vu phop toun mot ngo cun mot thum so: a - b;// operator -(a,b); -a; // a.operator (); Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc class PhanSo { long tu, mau; void UocLuoc(); public: PhanSo(long t, long m) {Set(t,m);} void Set(long t, long m); 16 long LayTu() const {return tu;} long LayMau() const {return mau;} PhanSo operator + (PhanSo b) const; friend PhanSo operator - (PhanSo a, PhanSo b); PhanSo operator -() const {return PhanSo(-tu, mau);} bool operator == (PhanSo b) const; bool operator != (PhanSo b) const; void Xuat() const; }; Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc PhanSo PhanSo::operator + (PhanSo b) const { return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau); } PhanSo operator - (PhanSo a, PhanSo b) { return PhanSo(a.tu*b.mau - a.mau*b.tu, 17 return PhanSo(a.tu*b.mau - a.mau*b.tu, a.mau*b.mau); } Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc void main() { PhanSo a(2,3), b(3,4), c(0,1),d(0,1); c = a + b; // d = a.operator + (b); d = a - b; // d = operator - (a,b); cout << "c = "; c.Xuat(); cout << "\n"; cout << "d = "; d.Xuat(); cout << "\n"; 18 cout << "d = "; d.Xuat(); cout << "\n"; } Ham thanh phan va toan cuc Ham thanh phan va toan cuc Kh co tho dnh nghu bung hu cuch, dong hum thunh phun so gon hon. 1oy nhon chon hum thunh phun huy hum toun coc houn toun toy thoo so thch cou ngoo so dong. Dong hum toun coc thoun ton hon kh tu co nho cuo choyon koo o toun hung tho nhut. Cuc phop toun =, [], (), -> nho du no tron but 19 Cuc phop toun =, [], (), -> nho du no tron but booc phu dooc dnh nghu u hum thunh phun v toun hung tho nhut phu u lvalue. Kh dnh nghu phop toun co toun hung tho nhut thooc op dung xot th co tho dong hum thunh phun houc hum toun coc. 1oy nhon, noo toun hung tho nhut khong thooc op dung xot th phu dnh nghu bung hum toun coc |Xom v do). 1roong hop thong dong u dnh nghu phop toun << vu >>. V du su dung ham toan cuc V du su dung ham toan cuc class PhanSo { long tu, mau; public: PhanSo(long t, long m) {Set(t,m);} PhanSo operator + (PhanSo b) const; PhanSo operator + (long b) const 20 PhanSo operator + (long b) const {return PhanSo(tu + b*mau, mau);} void Xuat() const; }; PhanSo a(2,3), b(4,1); a + b; // a.operator + (b): Ok a + 5; // a.operator + (5): Ok 3 + a; // 3.operator + (a): SAI V du su dung ham toan cuc V du su dung ham toan cuc class PhanSo { long tu, mau; public: PhanSo(long t, long m) {Set(t,m);} PhanSo operator + (PhanSo b) const; PhanSo operator + (long b) const; {return PhanSo(tu + b*mau, mau);} friend PhanSo operator + (long a, PhanSo b); 21 friend PhanSo operator + (long a, PhanSo b); }; PhanSo operator + (long a, PhanSo b) { return PhanSo(a*b.mau+b.tu, b.mau); } //... PhanSo a(2,3), b(4,1), c(0,1); c = a + b; // a.operator + (b): Ok c = a + 5; // a.operator + (5): Ok c = 3 + a; // operator + (3,a): Ok 3 Chuyen kieu (type conversions) 3 Chuyen kieu (type conversions) Vo mut khu nom, tu co tho thoc hon tron un phun so vu so ngoyon trong cuc phop toun so hoc vu qoun ho. Chung hun co tho cong phun so vu phun so, phun so vu so ngoyon, so ngoyon vu phun so. Doo do cong dong cho cuc phop toun khuc nho tro, nhun, chu, so sunh. Nghu u tu co nho cuo dnh nghu phop toun +,- ,*,/,<,>,==,!=,<=,>= cho phun so vu so ngoyon. 22 ,*,/,<,>,==,!=,<=,>= cho phun so vu so ngoyon. So dong cuch dnh nghu cuc hum nho tron cho phop toun + vu um toong to cho cuc phop toun con u tu co tho thuo tuc tron phun so vu so ngoyon. Doo do cong up dong toong to cho cuc koo do oo khuc do ngoo so dong dnh nghu. Chuyen kieu Chuyen kieu class PhanSo { long tu, mau; public: PhanSo(long t, long m) {Set(t,m);} void Set(long t, long m); PhanSo operator + (PhanSo b) const; PhanSo operator + (long b) const; friend PhanSo operator + (long a, PhanSo b); PhanSo operator - (PhanSo b) const; 23 PhanSo operator - (PhanSo b) const; PhanSo operator - (long b) const; friend PhanSo operator - (long a, PhanSo b); PhanSo operator * (PhanSo b) const; PhanSo operator * (long b) const; friend PhanSo operator * (long a, PhanSo b); PhanSo operator / (PhanSo b) const; PhanSo operator / (long b) const; // con tiep trang sau }; Chuyen kieu Chuyen kieu // tiep theo friend PhanSo operator / (int a, PhanSo b); PhanSo operator -() const; bool operator == (PhanSo b) const; bool operator == (long b) const; friend bool operator == (long a, PhanSo b); bool operator != (PhanSo b) const; 24 bool operator != (long b) const; friend bool operator != (int a, PhanSo b); bool operator < (PhanSo b) const; bool operator < (long b) const; friend bool operator < (int a, PhanSo b); bool operator > (PhanSo b) const; bool operator > (long b) const; friend bool operator > (int a, PhanSo b); bool operator <= (PhanSo b) const; //... Chuyen kieu Chuyen kieu Vo cuc khu buo nho tron, tu co tho so dong phun so vu so ngoyon un on trong mot boo thoc: void main() { PhanSo a(2,3), b(1,4), c(3,1), d(2,5); a = b * -c; c = (b+2) * 2/a; 25 c = (b+2) * 2/a; d = a/3 + (b*c-2)/5; } 1oy nhon, vot cuc hum toong to nhuo up d up u u cuch top guy mot mo vu do su sot. 1u tho hoc thoo cuch choyon koo ngum dnh mu C++ up dong cho cuc koo do oo co sun: double r = 2; // double x = double(2); double s = r + 3; // double s = r + double(3); cout << sqrt(9); // cout << sqrt(double(9)); 3.1 Chuyen kieu bang phuong thuc thiet Iap 3.1 Chuyen kieu bang phuong thuc thiet Iap Kh cun tnh toun mot boo thoc, noo koo do oo chou houn toun khop, trnh bon dch so tm cuch choyon koo. 1rong mot boo thoc so hoc, noo co so thum gu cou mot toun hung thoc, cuc thunh phun khuc so dooc choyon sung so thoc. Cuc troong hop khuc choyon koo dooc thoc hon thoo ngoyon tuc nung cup |nt sung ong, lout sung doobo ). 1u co tho hoc thoo cuch choyon koo to so ngoyon sung so thoc do choyon to so ngoyon sung phun 26 doobo ). 1u co tho hoc thoo cuch choyon koo to so ngoyon sung so thoc do choyon to so ngoyon sung phun so. So ngoyon co tho choyon sung so thoc mot cuch ngum dnh kh cun v co tho tuo dooc mot so thoc to so ngoyon. double r = 2; // double r = double(2); Do co tho choyon to so ngoyon sung phun so, tu cun duy trnh bon dch cuch tuo phun so to so ngoyon. PhanSo a = 3; // PhanSo a = PhanSo(3); // Hay PhanSo a(3); Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap Voc tuo phun so to so ngoyon chnh u phop go phoong thoc thot up. No cuch khuc tu cun xuy dong mot phoong thoc thot up do tuo mot phun so vo thum so u so ngoyon: class PhanSo { long tu, mau; 27 long tu, mau; public: PhanSo(long t, long m) {Set(t,m);} PhanSo(long t) {Set(t,1);} // Co the chuyen kieu tu so nguyen sang phan so void Set(long t, long m); PhanSo operator + (PhanSo b) const; friend PhanSo operator + (int a, PhanSo b); PhanSo operator - (PhanSo b) const; friend PhanSo operator - (int a, PhanSo b); Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap lhoong thoc thot up vo mot thum so u so ngoyon nho tron hum y rung mot so ngoyon la mot phun so, co tho choyon koo ngum dnh to so ngoyon sung phun so. Kh do tu co tho gum bot voc khu buo vu dnh nghu phop toun + phun so vu so ngoyon, co cho choyon koo to dong cho phop thoc hon thuo tuc cong do, no cuch khuc co tho gum voc dnh nghu 3 phop toun xoong con 28 khuc co tho gum voc dnh nghu 3 phop toun xoong con 2: //... PhanSo a(2,3), b(4,1), c(0); PhanSo d = 5; // PhanSo d = PhanSo(5); // PhanSo d(5); c = a + b; // c = a.operator + (b): Ok c = a + 5; // c = a.operator + (PhanSo(5)): Ok c = 3 + a; // c = operator + (3,a): Ok Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap 1u co tho gum so phop toun cun dnh nghu to 3 xoong l bung cuch dong hum toun coc, kh do co tho choyon koo cu hu toun hung. class PhanSo { long tu, mau; public: 29 public: PhanSo(long t, long m) {Set(t,m);} PhanSo(long t) {Set(t,1);} // Co the chuyen kieu tu so nguyen sang phan so void Set(long t, long m); friend PhanSo operator + (PhanSo a, PhanSo b); friend PhanSo operator - (PhanSo a, PhanSo b); //... }; Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap Kh do co cho choyon koo co tho dooc thoc hon cho cu hu toun hung. //... PhanSo a(2,3), b(4,1), c(0); PhanSo d = 5; // PhanSo d = PhanSo(5); c = a + b; // c = operator + (a,b): Ok c = a + 5; // c = operator + (a,PhanSo(5)): Ok 30 c = a + 5; // c = operator + (a,PhanSo(5)): Ok // Hay c = a + PhanSo(5); c = 3 + a; // c = operator + (PhanSo(3),a): Ok // Hay c = PhanSo(3) + a |:) Noo vot c = 5 + 7; 1h co tho choyon koo cu hu toun hung dooc khong: // c = PhanSo operator + (PhanSo(5), PhanSo(7)); Hai cach chuyen kieu bang phuong thuc thiet Iap Hai cach chuyen kieu bang phuong thuc thiet Iap Choyon koo bung phoong thoc thot up dooc thoc hon thoo ngoyon tuc co tho tuo mot do toong mo |phun so) to mot do toong du co |so ngoyon). Doo do co tho dooc thoc hon thoo cuch noo tron, houc dong phoong thoc thot up vo thum so co gu tr muc nhon. class PhanSo { class PhanSo { 31 { long tu, mau; public: PhanSo(long t, long m) {Set(t,m);} PhanSo(long t) {Set(t,1);} //... }; { long tu, mau; public: PhanSo(long t, long m = 1) {Set(t,m);} //... }; Khi nao chuyen kieu bang phuong thuc thiet Iap Khi nao chuyen kieu bang phuong thuc thiet Iap 1u dong choyon koo bung phoong thoc thot up kh thou hu doo kon suo: l. Choyon to koo du co |so ngoyon) sung koo dung dnh nghu |phun so). 2. Co qoun ho u mot to koo du co sung koo dung dnh nghu |mot so ngoyon la mot phun so). Cuc v do dong choyon koo bung phoong thoc thot up 32 Cuc v do dong choyon koo bung phoong thoc thot up buo gom: Choyon to so thoc sung so phoc, chur * sung Strng, so thoc sung dom trong mut phung. 3.2 Chuyen kieu bang phep toan chuyen kieu 3.2 Chuyen kieu bang phep toan chuyen kieu So dong phoong thoc thot up do choyon koo nho tron ton o trong mot so troong hop nhong no cong co mot so nhooc dom: 1. Muon chuyen t kieu ang nh ngha sang mot kieu a co, ta phai sa oi kieu a co. 2. Khong the chuyen t kieu ang nh ngha sang kieu c ban co san. 33 san. 3. Phng thc thiet lap vi mot tham so se dan en c che chuyen kieu t ong co the khong mong muon. Cuc nhooc dom tron co tho dooc khuc phoc bung cuch dnh nghu phop toun choyon koo. lhop toun choyon koo u hum thunh phun co dung X::operator T() Vo phop toun tron, so co co cho choyon koo to dong to koo dung dooc dnh nghu X sung koo du co 1. Dung phep toan chuyen kieu Dung phep toan chuyen kieu 1u dong phop toun choyon koo kh dnh nghu koo mo vu moon tun dong cuc phop toun cou koo du co. class String { char *p; public: String(char *s = "") {p = strdup(s);} String(const String &s2) {p = strdup(s2.p);} 34 String(const String &s2) {p = strdup(s2.p);} ~String() {delete [] p;} String& operator = (const String& p2); int Length() const {return strlen(p);} void ToUpper() {strupr(p);} friend ostream& operator << (ostream &o, const String& s); operator const char *() const {return p;} operator char *() const {return p;} }; Dung phep toan chuyen kieu Dung phep toan chuyen kieu ostream & operator << (ostream &o, const String& s) { return o << s.p; } void main() { String s("Nguyen van A"); 35 cout << s.Length() << "\n"; cout << strlen(s) << "\n"; if (strcmp(s, "Nguyen van A") == 0) cout << "Hai chuoi bang nhau\n"; else cout << "Hai chuoi khac nhau\n"; strupr(s); cout << s << "\n"; } V du ve phep toan chuyen kieu V du ve phep toan chuyen kieu V do suo mnh hou ro thom nho cuo choyon koo. Mot NomStr co tho choyon sung so thoc. class NumStr { char *s; public: NumStr(char *p) {s = dupstr(p);} 36 NumStr(char *p) {s = dupstr(p);} operator double() {return atof(s);} friend ostream & operator << (ostream &o, NumStr &ns); }; ostream & operator << (ostream &o, NumStr &ns) { return o << ns.s; } V du ve phep toan chuyen kieu V du ve phep toan chuyen kieu void main() { NumStr s1("123.45"), s2("34.12"); cout << "s1 = " << s1 << "\n"; // Xuat 's1 = 123.45' ra cout cout << "s2 = " << s2 << "\n"; // Xuat 's2 = 34.12' ra cout 37 // Xuat 's2 = 34.12' ra cout cout << "s1 + s2 = " << s1 + s2 << "\n"; // Xuat 's1 + s2 = 157.57' ra cout cout << "s1 + 50 = " << s1 + 50 << "\n"; // Xuat 's1 + 50 = 173.45' ra cout cout << "s1 * 2 = " << s1 * 2 << "\n"; // Xuat 's1 * 2 = 246.9' ra cout cout << "s1 / 2 = " << s1 / 2 << "\n"; // Xuat 's1 / 2 = 61.725' ra cout } Dung phep toan chuyen kieu Dung phep toan chuyen kieu lhop toun choyon koo cong dooc dong do boo don qoun ho u mot to koo dung dnh nghu sung koo du co. class PhanSo { long tu, mau; void UocLuoc(); public: PhanSo(long t = 0, long m = 1) {Set(t,m);} void Set(long t, long m); 38 friend PhanSo operator + (PhanSo a, Pham So b); void Xuat() const; operator double() const {return double(tu)/mau;} }; //... PhanSo a(9,4); cout << sqrt(a) << \n; // cout << sqrt(a.operator double()) << \n; 4. Mot so phep toan thong dung 4. Mot so phep toan thong dung Mot so phop toun dooc C++ dnh nghu u vo y nghu mo. V do << vu >> u hu phop toun dooc C++ dnh nghu u do so dong vo cuc dong xout, nhup up dong cho cuc koo co bun. 1u cong co tho dnh nghu u << vu >> do thoc hon cuc thuo tuc xout nhup cho cuc koo do oo mo. Ngou ru, voc dnh nghu cuc phop toun thong dong 39 Ngou ru, voc dnh nghu cuc phop toun thong dong khuc nho ||, |), ++, cho cuc koo do oo mo so um cho op tro non do so dong hon, vo guo don thun thon nho cuc koo du co. 5.1 Phep toan << va >> 5.1 Phep toan << va >> << vu >> u hu phop toun thuo tuc tron tong bt kh cuc toun hung u so ngoyon. C++ dnh nghu u hu phop toun do dong vo cuc do toong thooc op ostroum vu stroum do thoc hon cuc thuo tuc xout, nhup. Kh dnh nghu hu phop toun tron, cun tho hon y nghu suo: 40 suo: a >> b; // bo a vao b a << b; // bo b vao a cout << a << \n; // bo a va \n vao cout cin >> a >> b; // bo cin vao a va b Lop ostroum |dong do oo xout) dnh nghu phop toun << up dong cho cuc koo do oo co bun |ngoyon, thoc, chur *,). Lop stroum |dong do oo nhup) dnh nghu phop toun >> up dong cho cuc koo do oo co bun |ngoyon, thoc, chur Phep toan << va >> Phep toan << va >> coot, corr u cuc bon thooc op ostroum du don cho thot b xout choun |muc nhon u mun hnh) vu thot b buo o choun |oon oon u mun hnh). cn u mot do toong thooc op stroum du don cho thot b nhup choun, muc nhon u bun phm. Vo khu buo cou op ostroum nho tron tu co tho thoc hon phop toun << vo toun hung tho nhut u mot dong do oo 41 phop toun << vo toun hung tho nhut u mot dong do oo xout |coot, coor, tup tn), toun hung tho hu thooc cuc koo co bun |ngoyon, thoc, chur *, con tro). 1oong to, tu co tho up dong phop toun >> vo toun hung tho nhut thooc op stroum |v do cn), toun hung tho hu u thum choo don koo co bun houc con tro |ngoyon, thoc, chur *). Lop ostream Lop ostream class ostream : virtual public ios { public: // Formatted insertion operations ostream & operator<< ( signed char); ostream & operator<< (unsigned char); ostream & operator<< (int); 42 ostream & operator<< (unsigned int); ostream & operator<< (long); ostream & operator<< (unsigned long); ostream & operator<< (float); ostream & operator<< (double); ostream & operator<< (const signed char *); ostream & operator<< (const unsigned char *); ostream & operator<< (void *); // ... private: Lop istream Lop istream class istream : virtual public ios { public: istream & getline(char *, int, char = '\n'); istream & operator>> ( signed char *); istream & operator>> (unsigned char *); istream & operator>> (unsigned char &); 43 istream & operator>> ( signed char &); istream & operator>> (short &); istream & operator>> (int &); istream & operator>> (long &); istream & operator>> (unsigned short &); istream & operator>> (unsigned int &); istream & operator>> (unsigned long &); istream & operator>> (float &); istream & operator>> (double &); private: Phep toan << va >> Phep toan << va >> Do dnh nghu phop toun << thoo nghu xout ru dong do oo xout cho koo do oo dung dnh nghu, tu dnh nghu phop toun nho hum toan cuc vo thum so tho nhut u tham chieu en oi tng thuoc lp ostream, kot qou tru vo u tham chieu en chnh ostream o. 1oun hung tho hu thooc op dung dnh nghu. Do dnh nghu phop toun >> thoo nghu nhup to dong 44 Do dnh nghu phop toun >> thoo nghu nhup to dong do oo nhup cho koo do oo dung dnh nghu, tu dnh nghu phop toun >> nho hum toan cuc vo thum so tho nhut u tham chieu en mot oi tng thuoc lp istream, kot qou tru vo u tham chieu en chnh istream do. 1oun hung tho hu u tham chieu don do toong thooc op dung dnh nghu. 1hong thoong tu khu buo hu phop toun tron u hum bun cou op do co tho troy xout do oo troc top. V du jnh nghia << va >> cho Iop phan so V du jnh nghia << va >> cho Iop phan so // phanso.h class PhanSo { long tu, mau; void UocLuoc(); public: PhanSo(long t = 0, long m = 1) {Set(t,m);} 45 void Set(long t, long m); long LayTu() const {return tu;} long LayMau() const {return mau;} friend PhanSo operator + (PhanSo a, PhanSo b); friend PhanSo operator - (PhanSo a, PhanSo b); friend PhanSo operator * (PhanSo a, PhanSo b); friend PhanSo operator / (PhanSo a, PhanSo b); PhanSo operator -() const {return PhanSo(-tu,mau);} friend istream& operator >> (istream &is, PhanSo &p); friend ostream& operator << (ostream &os, PhanSo p); Phep toan << va >> Phep toan << va >> // phanso.cpp #include <iostream.h> #include phanso.h istream & operator >> (istream &is, PhanSo &p) { is >> p.tu >> p.mau; while (!p.mau) { cout << Nhap lai mau so: ; is >> p.mau; 46 is >> p.mau; } p.UocLuoc(); return is; } ostream & operator << (ostream &os, PhanSo p) { os << p.tu; if (p.tu != 0 && p.mau != 1) os << "/" << p.mau; return os; } Phep toan << va >> Phep toan << va >> // tps.cpp #include <iostream.h> #include phanso.h void main() { PhanSo a, b; cout << Nhap phan so a: ; cin >> a; 47 cout << Nhap phan so b: ; cin >> b; cout << a << " + " << b << " = " << a + b << "\n"; cout << a << " - " << b << " = " << a - b << "\n"; cout << a << " * " << b << " = " << a * b << "\n"; cout << a << " / " << b << " = " << a / b << "\n"; } V du phep toan << va >>: Lop String V du phep toan << va >>: Lop String class String { char *p; public: String(char *s = "") {p = strdup(s);} String(const String &s2) {p = strdup(s2.p);} ~String() {delete [] p;} 48 String& operator = (const String& p2); friend String operator +(const String &s1, const String &s2); friend istream& operator >> (istream &i, String& s); friend ostream& operator << (ostream &o, const String& s); }; V du phep toan << va >>: Lop String V du phep toan << va >>: Lop String const MAX = 512; istream & operator >> (istream &is, String& s) { char st[MAX]; is.getline(st,sizeof(s)); is.ignore(); s = st; 49 return is; } ostream & operator << (ostream &o, const String& s) { return o << s.p; } Phep toan << va >> Phep toan << va >> lhop toun << vu >> cong co tho dooc dnh nghu vo toun hung tho nhut thooc op dung xot, khong thooc op ostroum houc stroum. 1rong troong hop do, tu dong hum thunh phun. Koo tru vo u chnh do toong o vo tru do co tho thoc hon phop toun on top. Cuc v do vo so dong phop toun tron thoo cuch nuy u cuc op Stuck, 1up hop, Dunh such, Mung, 1up tn 50 cuc op Stuck, 1up hop, Dunh such, Mung, 1up tn Mang a; a << 5 << 15; // bo 5 va 15 vao mang V do suo mnh hou cuch so dong phop toun tron vo op Stuck Phep toan << va >> Phep toan << va >> class Stack { Item *st, *top; int size; void Init(int sz) {st = top = new Item[size=sz];} void CleanUp() {if (st) delete [] st;} public: 51 Stack(int sz = 20) {Init(sz);} ~Stack() {CleanUp();} static Stack *Create(int sz); bool Full() const {return (top - st >= size);} bool Empty() const {return (top <= st);} bool Push(Item x); bool Pop(Item *px); Stack &operator << (Item x) {Push(x); return *this;} Stack &operator >> (Item &x) {Pop(&x); return *this;} }; Phep toan << va >> Phep toan << va >> void main() { Stack s(10); Item a,b,c,d,e; a = b = c = d = e = 10; s << 1 << 3 << 5 << 7; 52 s << 1 << 3 << 5 << 7; s >> a >> b >> c >> d >> e; cout << setw(4) << a << setw(4) << b << setw(4) << c << setw(4) << d << setw(4) << e << "\n"; } Xout oo kh thoc hon doun choong trnh tron: : 5.2 Phep toan Iay phan tu mang: || 5.2 Phep toan Iay phan tu mang: || 1u co tho dnh nghu phop toun || do troy xout phun to cou mot do toong co y nghu mung. class String { friend ostream& operator << (ostream &o, const String& s); char *p; 53 public: String(char *s = "") {p = strdup(s);} String(const String &s) {p = strdup(s.p);} ~String() {delete [] p;} String & operator = (const String &s); char & operator[](int i) {return p[i];} }; Kot qou tru vo u thum choo do phun to tru vo co tho dong o bon tru cou phop toun gun |vuoo). Phep toan Iay phan tu mang: || Phep toan Iay phan tu mang: || Suo kh dnh nghu nho tron, co tho so dong do toong tru vo o cu hu vo cou phop toun gun. void main() { clrscr(); String a("Nguyen van A"); cout << a[7] << "\n"; // a.operator[](7) 54 cout << a[7] << "\n"; // a.operator[](7) a[7] = 'V'; cout << a[7] << "\n"; // a.operator[](7) cout << a << "\n"; } 1u co tho cu ton do phop toun tron co tho dooc so dong un toun kh ch so khong hop o: char *a = Dai hoc Tu nhien; a[300] = H; // Nguy hiem String aa(Dai hoc Tu nhien); Phep toan Iay phan tu mang: || Phep toan Iay phan tu mang: || So dong phop toun tron nho gu tr tru |vuoo) vo ch so khong hop o thoong guy ru nhong o kho tm vu sou. 1u co tho khuc phoc bung cuch kom tru. class String { char *p; static char c; 55 static char c; public: String(char *s = "") {p = strdup(s);} String(const String &s) {p = strdup(s.p);} ~String() {delete [] p;} String & operator = (const String &s); char & operator[](int i) {return (i >= 0 && i < strlen(p)) ? p[i] : c;} }; char String::c = 'A'; Phep toan Iay phan tu mang: || Phep toan Iay phan tu mang: || Suo kh dnh nghu nho tron, tu co tho yon tr gun vuo cuc phun to co ch so khong hop o. void main() { clrscr(); String a("Nguyen van A"); cout << a[7] << "\n"; 56 cout << a[7] << "\n"; a[7] = 'V'; cout << a[7] << "\n"; cout << a[200] << "\n"; // Xuat String::c a[200] = 'X'; // Gan String::c = 'X'; cout << a[300]; // Xuat String::c } lhop toun || dnh nghu nho tron co tho hout dong tot cho cu hu troong hop: o bon tru vu bon phu phop toun gun. Phep toan || cho oi tuong hang Phep toan || cho oi tuong hang 1oy nhon so dong phop toun || nho tron u khong hop o do vo do toong hung. void main() { clrscr(); String a("Nguyen van A"); const String aa("Dai Hoc Tu Nhien"); 57 const String aa("Dai Hoc Tu Nhien"); cout << a[7] << "\n"; a[7] = 'V'; cout << a[7] << "\n"; cout << aa[4] << "\n";// Bao Loi: sai khai niem aa[4] = 'L'; // Bao Loi: tot cout << aa[4] << "\n";// Bao Loi: sai khai niem cout << aa << "\n"; } Phep toan || cho oi tuong hang Phep toan || cho oi tuong hang Lo tron dooc khuc phoc bung cuch dnh nghu mot phon bun up dong dooc cho do toong hung. class String { char *p; static char c; public: 58 public: String(char *s = "") {p = strdup(s);} String(const String &s) {p = strdup(s.p);} ~String() {delete [] p;} String & operator = (const String &s); char & operator[](int i) {return (i >= 0 && i < strlen(p)) ? p[i] : c;} char operator[](int i) const {return p[i];} }; char String::c = 'A'; Phep toan || cho oi tuong hang Phep toan || cho oi tuong hang Kh do voc so dong phop toun || do doc phun to th hop o nhong co tnh gun so guy ru o su oc bon dch. void main() { clrscr(); String a("Nguyen van A"); const String aa("Dai Hoc Tu Nhien"); 59 const String aa("Dai Hoc Tu Nhien"); cout << a[7] << "\n"; a[7] = 'V'; cout << a[7] << "\n"; cout << aa[4] << "\n"; // String::operator[](int) const : Ok aa[4] = 'L'; // Bao Loi: Khong the la lvalue cout << aa[4] << "\n"; // String::operator[](int) const : Ok cout << aa << "\n"; // } 5.3 Phep toan goi ham: () 5.3 Phep toan goi ham: () lhop toun || ch co tho co mot thum so, v vuy dong phop toun tron khong thoun ton kh tu moon uy phun to cou mot mu trun hu choo. lhop toun go hum cho phop co tho co so thum so but ky, v vuy thoun ton kh tu moon troy xout phun to cou cuc do toong thooc ou mung hu huy nhoo choo hon. Lop mu trun suo duy dnh nghu phop toun |) vo hu thum 60 Lop mu trun suo duy dnh nghu phop toun |) vo hu thum so, nho vuy tu co tho troy xout phun to cou mu trun thong qou so dong vu so cot. Phep toan goi ham Phep toan goi ham class Matrix { int m,n; double *px; int DataSize(){return m*n*sizeof(double);} void CopyData(double *pData) {memcpy(px,pData,DataSize());} void Create(int mm, int nn, double *pData = NULL); 61 void Create(int mm, int nn, double *pData = NULL); public: Matrix(int mm, int nn, double *_px) {Create(mm,nn,_px);} Matrix(const Matrix &m2){Create(m2.m,m2.n,m2.px);} ~Matrix() { delete [] px;} Matrix operator = (const Matrix &m2); double &operator()(int i, int j){return px[i*n+j];} double operator()(int i, int j) const {return px[i*n+j];} Phep toan goi ham () Phep toan goi ham () Suo kh dnh nghu phop toun go hum nho tron, tu co tho so dong mu trun nho mot mung hu choo. void main() { double a[] = {1,2,3,4,5,6}; Matrix m(2, 3, a); cout << "m = " << m << "\n"; 62 cout << "m = " << m << "\n"; cout << m(1,2) << "\n"; // m.operator()(1,2) m(1,2) = 50; cout << m(1,2) << "\n"; } lhop toun go hum cong dooc dong nho mot dung vun tut thuy cho mot hum thunh phun thong thoong. Nho v do suo, phop toun go hum hout dong toong doong vo hum thunh phun SobStr do uy mot choo con. Phep toan goi ham () Phep toan goi ham () class String { friend ostream& operator<<(ostream &o,const String& s); char *p; static char c; public: String(char *s = "") {p = strdup(s);} 63 String(const String &s) {p = strdup(s.p);} ~String() {delete [] p;} String & operator = (const String &s); void Output() const {cout << p;} char & operator[](int i) {return (i >= 0 && i < strlen(p)) ? p[i] : c;} char operator[](int i) const {return p[i];} String SubStr(int start, int count) const; String operator()(int start, int count) const; //... Phep toan goi ham () Phep toan goi ham () String String::SubStr(int start, int count) const { char buf[512]; strncpy(buf, p+start, count); buf[count] = '\0'; return buf; } String String::operator()(int start, int count) const 64 { char buf[512]; strncpy(buf, p+start, count); buf[count] = '\0'; return buf; } void main(){ String a("Nguyen van A"); cout << a.SubStr(7,3) << "\n"; cout << a(7,3) << "\n"; } 5.4 Phep toan tang va giam: ++ va 5.4 Phep toan tang va giam: ++ va ++ u phop toun mot ngo co vu tro tung gu tr mot do toong on gu tr ko top. 1oong to u phop toun mot ngo co vu tro gum gu tr mot do toong xoong gu tr trooc do. ++ vu ch up dong cho cuc koo do oo dom dooc, nghu u mo gu tr cou do toong doo co gu tr ko top houc gu tr trooc do. 65 houc gu tr trooc do. ++ vu co tho dooc dong thoo hu cuch, top duo ngo houc top v ngo. Kh dong nho top duo ngo, ++u co hu vu tro: Tang a len gia tr ke tiep. Tra ve tham chieu en chnh a. Kh dong nho top v ngo, u++ co hu vu tro: Tang a len gia tr ke tiep. Tra ve gia tr bang vi a trc khi tang. Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va Kh ch dnh nghu mot phon bun cou phop toun ++ |huy ) phon bun nuy so dooc dong cho cu hu troong hop: top duo ngo vu top v ngo. class ThoiDiem { long tsgiay; static bool HopLe(int g, int p, int gy); 66 static bool HopLe(int g, int p, int gy); public: ThoiDiem(int g = 0, int p = 0, int gy = 0); void Set(int g, int p, int gy); int LayGio() const {return tsgiay / 3600;} int LayPhut() const {return (tsgiay%3600)/60;} int LayGiay() const {return tsgiay % 60;} void Tang(); void Giam(); ThoiDiem &operator ++(); }; Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va void ThoiDiem::Tang() { tsgiay = ++tsgiay%SOGIAY_NGAY; } void ThoiDiem::Giam() { if (--tsgiay < 0) tsgiay = SOGIAY_NGAY-1; 67 } ThoiDiem &ThoiDiem::operator ++() { Tang(); return *this; } 3.8 Phep toan tang va giam: ++ va 3.8 Phep toan tang va giam: ++ va void main() { clrscr(); ThoiDiem t(23,59,59),t1,t2; cout << "t = " << t << "\n"; t1 = ++t; // t.operator ++(); // t = 0:00:00, t1 = 0:00:00 68 cout << "t = " << t << "\tt1 = " << t1 << "\n"; t1 = t++; // t.operator ++(); // t = 0:00:01, t1 = 0:00:00 cout << "t = " << t << "\tt1 = " << t1 << "\n"; } Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va Do co tho co phop toun ++ vu hout dong khuc nhuo cho hu cuch dong |++u vu u++) tu cun dnh nghu hu phon bun ong vo hu cuch dong ko tron. lhon bun top duo ngo co thom mot thum so gu do phun bot. class ThoiDiem{ long tsgiay; public: 69 public: ThoiDiem(int g = 0, int p = 0, int gy = 0); void Set(int g, int p, int gy); int LayGio() const {return tsgiay / 3600;} int LayPhut() const {return (tsgiay%3600)/60;} int LayGiay() const {return tsgiay % 60;} void Tang(); void Giam(); ThoiDiem &operator ++(); ThoiDiem operator ++(int); }; Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va void ThoiDiem::Tang() { tsgiay = ++tsgiay%SOGIAY_NGAY; } void ThoiDiem::Giam() { if (--tsgiay < 0) tsgiay = SOGIAY_NGAY-1; } 70 } ThoiDiem &ThoiDiem::operator ++() { Tang(); return *this; } ThoiDiem ThoiDiem::operator ++(int) { ThoiDiem t = *this; Tang(); return t; } Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va void main() { clrscr(); ThoiDiem t(23,59,59),t1,t2; cout << "t = " << t << "\n"; t1 = ++t; // t.operator ++(); // t = 0:00:00, t1 = 0:00:00 71 cout << "t = " << t << "\tt1 = " << t1 << "\n"; t1 = t++; // t.operator ++(int); // t = 0:00:01, t1 = 0:00:00 cout << "t = " << t << "\tt1 = " << t1 << "\n"; }