Cácphươngthứctoántử 8.1. Cách đặt tên Cácphươngthứctoántử được xây dựng như cácphươngthức thông thường, chỉ có khác cách đặt tên. Tên cácphươngthứctoántử (cũng giống như hàm toán tử) được tạo bằng cách ghép từ khoá operator với một phép toán, ví dụ: operator+ operator<< operator>> 8.2. Con trỏ this Cũng giống như phươngthức thông thường, phương thứctoántử có đối đầu tiên (đối không tường minh) là con trỏ this. 8.3. Toántử một toán hạng Các phương thứctoántử một toán hạng: Dùng ngay con trỏ this để biểu thị toán hạng duy nhất này, nên trong phươngthức sẽ không có đối tường minh. Ví dụ phương thứctoántử - (đổi dấu) một đối tượng kiểu SP (số phức) có thể viết như sau: class SP { private: double a; // Phần thực double b; // Phần ảo public: SP operator-(); } ; SP SP:: operator-() { SP u ; u.a = - this->a ; u.b = - this->b ; return u; } Cách dùng: SP u, v; u = -v; 8.4. Toántử hai toán hạng Các phương thứctoántử hai toán hạng: Con trỏ this ứng với toán hạng thứ nhất, nên trong phươngthức chỉ cần dùng một đối tường minh để biểu thị toán hạng thứ hai. Ví dụ phương thứctoántử + (cộng) hai đối tượng kiểu SP (số phức) có thể viết như sau: class SP { private: double a; // Phần thực double b; // Phần ảo public: SP operator+(SP u2); } ; SP SP:: operator+(SP u2) { SP u ; u.a = this->a + u2.a ; u.b = this->b + u2.b ; return u; 141 142 } Cách dùng: SP p, p, r; r = p + q ; 8.5. Lớp DT (Đa thức) Chương trình sau sẽ định nghĩa lớp DT và đưa vào cácphương thức, hàm: + Các thuộc tính: int n ; // bậc đa thức double *a ; // trỏ tới vùng nhớ chứa các hệ số đa thức + Cácphươngthức operator+, operator- dùng để đổi dấu các hệ số đa thức operator+ dùng để cộng 2 đa thức operator- dùng để trừ 2 đa thức operator* dùng để nhân 2 đa thức operator^ dùng để tính giá trị đa thức operator[] dùng để cho biết bậc và hệ số của đa thức + Các hàm bạn: operator<< dùng để in các hệ số đa thức operator>> dùng để nhập các hệ số đa thức + Hàm (tự do) double F(DT p, double x) dùng để tính p(x)-giá trị đa thức tại x + Nói thêm về phươngthức chỉ số và hàm tự do F - Nếu p là đối tượng của lớp DT, thì hàm chỉ số cho biết: p[-1] = double(n) p[i] = a[i] , i=0, 1, ., n - Hàm tự do F sẽ dùng phươngthức chỉ số để xác định n , các hệ số đa thức và dùng chúng để tính giá trị đa thức. + Trong chương trình sử dụng hàm new để cấp phát vùng nhớ chứa hệ số đa thức. + Nội dung chương trình gồm: - Nhập, in các đa thức p, q, r, s - Tính đa thức: f = -(p + q)*(r - s) - Nhập các số thực x1 và x2 - Tính f(x1) (bằng cách dùng phươngthức operator^) - Tính f(x2) (bằng cách dùng hàm F) // Chương trình CT3_10.CPP #include <conio.h> #include <iostream.h> #include <math.h> class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1, . public: friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); DT operator-(); DT operator+(const DT &d2); DT operator-(DT d2); DT operator*(const DT &d2); double operator^(const double &x); // Tinh gia tri da thuc double operator[](int i) { 143 144 if(i<0) return double(n); else return a[i]; } } ; // Ham tinh gia tri da thuc double F(DT d,double x) { double s=0.0 , t=1.0; int n; n = int(d[-1]); for (int i=0; i<=n; ++i) { s += d[i]*t; t *= x; } return s; } ostream& operator<< (ostream& os,const DT &d) { os << " - Cac he so (tu ao): " ; for (int i=0 ; i<= d.n ; ++i) os << d.a[i] <<" " ; return os; } istream& operator>> (istream& is,DT &d) { cout << " - Bac da thuc: " ; cin >> d.n; d.a = new double[d.n+1]; cout << "Nhap cac he so da thuc:\n" ; for (int i=0 ; i<= d.n ; ++i) { cout << "He so bac " << i << " = " ; is >> d.a[i] ; } return is; } DT DT::operator-() { DT p; p.n = n; p.a = new double[n+1]; for (int i=0 ; i<=n ; ++i) p.a[i] = -a[i]; return p; } DT DT::operator+(const DT &d2) { DT d; int k,i; k = n > d2.n ? n : d2.n ; d.a = new double[k+1]; for (i=0; i<=k ; ++i) if (i<=n && i<=d2.n) d.a[i] = a[i] + d2.a[i]; 145 146 else if (i<=n) d.a[i] = a[i]; else d.a[i] = d2.a[i]; i=k; while(i>0 && d.a[i]==0.0) --i; d.n = i; return d ; } DT DT::operator-(DT d2) { return (*this + (-d2)); } DT DT::operator*(const DT &d2) { DT d; int k, i, j; k = d.n = n + d2.n ; d.a = new double[k+1]; for (i=0; i<=k; ++i) d.a[i] = 0; for (i=0 ; i<= n ; ++i) for (j=0 ; j<= d2.n ; ++j) d.a[i+j] += a[i]*d2.a[j] ; return d; } double DT::operator^(const double &x) { double s=0.0 , t=1.0; for (int i=0 ; i<= n ; ++i) { s += a[i]*t; t *= x; } return s; } void main() { DT p,q,r,s,f; double x1,x2,g1,g2; clrscr(); cout <<"\nNhap da thuc P " ; cin >> p; cout << "\nDa thuc p " << p ; cout <<"\nNhap da thuc Q " ; cin >> q; cout << "\nDa thuc q " << q ; cout <<"\nNhap da thuc R " ; cin >> r; cout << "\nDa thuc r " << r ; cout <<"\nNhap da thuc S " ; cin >> s; cout << "\nDa thuc s " << s ; f = -(p+q)*(r-s); cout << "\nNhap so thuc x1: " ; cin >> x1; cout << "\nNhap so thuc x2: " ; cin >> x2; g1 = f^x1; g2 = F(f,x2); cout << "\nDa thuc f " << f ; 147 148 cout << "\n f("<<x1<<") = " << g1; cout << "\n f("<<x2<<") = " << g2; getch(); } 149 147 148 . Các phương thức toán tử 8.1. Cách đặt tên Các phương thức toán tử được xây dựng như các phương thức thông thường, chỉ có khác cách đặt tên. Tên các phương. phương thức thông thường, phương thức toán tử có đối đầu tiên (đối không tường minh) là con trỏ this. 8.3. Toán tử một toán hạng Các phương thức toán tử