You are on page 1of 13

CHNG 12: TOAN T TREN LP

Noi dung: Toan t Ham toan t nh ngha chong toan t gan = nh ngha chong toan t tang/giam ++/ nh ngha chong toan t << va >>

Toan t Trong C++, co the nh ngha chong oi vi hau het cac toan t (mot ngoi hoac hai ngoi) tren cac lp, ngha la mot trong cac toan hang tham gia phep toan la cac oi tng. Toan t c nh ngha chong bang cach nh ngha mot ham toan t vi ten bao gom t khoa operator va theo sau la ky hieu toan t can nh ngha chong. V du 1: Mot so v du ve ten ham toan t operator+ nh ngha phep cong operatornh ngha phep tr operator* nh ngha phep nhan operator/ nh ngha phep chia operator+= nh ngha phep cong bang operator!= nh ngha phep so sanh khac

Ham toan t Ham toan t co the la ham thanh phan hoac ham ban cua lp. Khi ham toan t la ham thanh phan cua lp th toan hng th nhat trong phep toan phai la mot oi tng thuoc lp o. Neu toan hng th nhat trong phep toan khong phai la mot oi tng cua lp th ham toan t phai la ham ban cua lp. V du 2: class SoPhuc { private: float re, im; //phn thc va phn o public: SoPhuc(float re = 0; float im = 0); void Xuat(); //Ham toan t cong hai oi tng Sophuc SoPhuc operator+(SoPhuc u); // Ham thanh phan lp /*Ham toan t cong mot so thc vi phan thc cua mot oi tng SoPhuc*/ friend SoPhuc operator+(float x, SoPhuc u); //Ham ban };

//nh ngha cac ham thanh phan SoPhuc::SoPhuc(float im1, float re1) { cout << goi ham SoPhuc::SoPhuc(float, float) \n; im = im1; re = re1; } SoPhuc SoPhuc::operator+(SoPhuc u) { cout << Goi ham SoPhuc::operator+(SoPhuc) \n; SoPhuc ret(re + u.re, im + u.im); //Gi ham thit lp hai i s return ret; } void SoPhuc::Xuat() { cout << re << (im >= 0 ? + : -) << fabs(im) << *i\n; } //nh ngha ham t do SoPhuc operator+(float x, SoPhuc u) { cout << Goi ham operator+(float, SoPhuc) \n; SoPhuc ret(x + u.re, u.im); return ret; }

//Ham chnh void main() { SoPhuc a(-2, 4); a.Xuat(); SoPhuc b(8, -6); b.Xuat(); SoPhuc c = a + b; // CT dch hieu c = a.operator+(b) c.Xuat(); SoPhuc d = 4 + c; // CT dch hieu c = operator+(4, c) d.Xuat(); SoPhuc e = a + b + c; // e = (a.operator+(b)).operator+(c) e.Xuat(); }

nh ngha chong toan t gan = Viec nh ngha ham toan t gan ch can thiet khi cac oi tng co thanh phan d lieu kieu con tro. Khi trong lp cha nh ngha mot ham toan t gan th chng trnh dch se phat sinh mot toan t gan mac nh e sao chep gia tr cac thanh phan d lieu t oi tng nguon sang oi tng ch tng ng tng oi mot. V du 3: class Vector { ... public: ... //Ham toan t gan hai oi tng Vector Vector& operator=(Vector &u); };

Vector& Vector::operator=(Vector &u) { cout <<goi ham Vector::operator=(Vector &) \n; if(this != u) { if(p != NULL) delete[]p; /*xoa vn cu trong oi tng ve trai*/ n = u.n; p = new float[n]; /*cap vn mi cho oi tng ve trai*/ for(i = 0; i < n; i++) p[i] = u.p[i]; } else cout << Hai oi tng trong phep gan la mot\n; return *this; }

void main() { ... Vector b = a; //Goi ham Vector::Vector(Vector &) b.Xuat(); Vector c(0); c = b; //Goi ham Vector::operator=(Vector &) c.Xuat(); a = a; Vector d(0), e(0); d = e = a; //Goi ham Vector::operator=(Vector &) d.Xuat(); e.Xuat(); } Chu y: Gia tr tra ve cua ham toan t gan c chon la tham chieu en oi tng ng ben trai phep gan nham gi hai tnh chat quan trong cua phep gan: trat t ket hp t ben phai sang ben trai va co the s dung ket qua bieu thc gan trong cac bieu thc khac.

nh ngha chong toan t << va >> Viec nh ngha chong hai toan t << va >> se cho phep cac oi tng ng ben phai chung khi thc hien cac thao tac xuat nhap. V du 4: class SoPhuc { private: float im, re; public: friend istream& operator>>(istream &is, SoPhuc &u); friend ostream& operator<<(ostream &os, SoPhuc &u); };

Chu y: Cac toan hang ben trai cua cac toan t << va >> la cac oi tng thuoc lp ostream va istream ch khong phai thuoc lp SoPhuc nen khong the nh ngha chong cac toan t nay nh la ham thanh phan, ma phai c nh ngha nh la ham ban.

//nh ngha ham t do istream& operator>>(istream &is, SoPhuc &u) { cout << Nhap phan thuc va phan ao:; is >> u.re >> u.im; return is; } ostream& operator<<(ostream &os, SoPhuc &u) { os << u.re << (u.im >= 0 ? + : -) << u.im <<*i\n; return os; } //Ham chnh void main() { SoPhuc a; cin >> a; //CT dch hieu operator>>(cin, a) cout << a; //CT dch hieu operator<<(cout, a) }

nh ngha chong toan t ++ va -- V du 5: class Counter { int n; public: Counter(int nn = 0); Counter operator++(); //Toan t tang trc Counter operator++(int); //Toan t tang sau void Display(); }; Chu y: ay chung ta s dung oi so kieu int nh la mot oi so tng trng trong ham toan t operator++(int) e ch rang ay la toan t tang sau.

//nh ngha cac ham thanh phan Counter Counter::operator++() { cout << Goi Counter::operator++() \n; Counter ret(++n); return ret; } Counter Counter::operator++(int) { cout << Goi Counter::operator++(int) \n; Counter ret(n++); return ret; } void Counter::Display() { cout << n <<\n; }

//Ham chnh void main() { Counter a(0); ++a; // a.operator++() a.Display(); Counter b(0); b = a++; //a.operator++(int) a.Display(); b.Display(); Count c(0); c = ++b; //b.operator++() b.Display(); c.Display(); }

You might also like