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 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>>
8.2. Con trỏ this
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.
8.3. Toán tử một toán hạng
Các phương thức toán tử 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;
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)
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;
}
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;