25/05/2018, 14:14

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 thức toán tử (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<< ...

đượ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 thức toán tử (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>>
    

Cũng giống như 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.

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ương thức sẽ không có đối tường minh. Ví dụ phương thức toán tử - (đổ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; 
    

hai toán hạng: Con trỏ this ứng với toán hạng thứ nhất, nên trong phương thứ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ức toán tử + (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;
    }
    Cách dùng:
    SP p, p, r;
    r = p + q ; 
    

Chương trình sau sẽ định nghĩa lớp DT và đưa vào các phươ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ác phương thứ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ương thứ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ương thứ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ương thứ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)
    {
    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:
" ;
    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];
    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 <<"
Nhap da thuc P " ; cin >> p;
    cout << "
Da thuc p " << p ;
    cout <<"
Nhap da thuc Q " ; cin >> q;
    cout << "
Da thuc q " << q ;
    cout <<"
Nhap da thuc R " ; cin >> r;
    cout << "
Da thuc r " << r ;
    cout <<"
Nhap da thuc S " ; cin >> s;
    cout << "
Da thuc s " << s ;
    f = -(p+q)*(r-s);
    cout << "
Nhap so thuc x1: " ; cin >> x1;
    cout << "
Nhap so thuc x2: " ; cin >> x2;
    g1 = f^x1;
    g2 = F(f,x2);
    cout << "
Da thuc f " << f ;
    cout << "
 f("<<x1<<") = " << g1;
    cout << "
 f("<<x2<<") = " << g2;
    getch();
    }
    
0