d) Cú pháp cách 2B: truyền địa chỉ theo tham chiếu (chỉ ở C++)
6.5. Hàm tải bội toán tử thân thiện (friend overloaded function)
- Hàm tải bội toán tử thân thiện nhằm mục đích làm cho các phép tốn tải bội trở nên quen thuộc hơn khi sử dụng chúng trong chương trình. Nghĩa là các phép toán này sẽ được sử dụng một cách tự nhiên như những phép tốn thơng thường.
- Hàm tải bội toán tử thân thiện khác hàm tải bội toán tử (thường) ở chỗ: o Về hình thức: Nó có thêm từ khóa friend phía trước
o Về cấu trúc hàm: Tham số truyền vào hàm ln có đủ số ngơi của
tốn tử. Nói cách khác là có 2 đối tượng là tham số của hàm
Ví dụ: So sánh giữa tốn tử tải bội thường với toán tử tải bội thân thiện
Toán tử tải bội thường Toán tử tải bội thân thiện
Khai báo
istream& operator >> (istream& din); FRAC operator +(FRAC a);
friend istream& operator >> (istream& din, FRAC &a); friend FRAC operator +(FRAC a, FRAC b);
Định nghĩa
istream& FRAC::operator >> (istream& din){ cout<<"tu so: "; din>>this->t;
do{cout<<"mau so: ";din>>this->m; }while(this->m==0);
return din; }
istream& operator >> (istream& din, FRAC &a){ cout<<"tu so: "; din>>a.t;
do{cout<<"mau so: ";din>>a.m; }while(a.m==0);
return din; }
FRAC FRAC::operator +(FRAC a){ FRAC c;
c.t= t*a.m + a.t*m; c.m= m*a.m; reduce(c);
return c; }
FRAC operator +(FRAC a, FRAC b){ FRAC c;
c.t= a.t*b.m + a.m*b.t; c.m= a.m*b.m; reduce(c); return c; } Sử dụng FRAC a, b, c; a.operator >>(cin); … s1 = a.operator + (b); …. FRAC a, b, c; cin>>a; … s1 = a + b; …. 7. LUYỆN TẬP
Xây dựng lớp các VECTOR trong mặt phẳng với các phép toán sau bằng hai cách dùng toán tử tải bội thường và toán tử tải bội thân thiện (mỗi cách làm một chương trình):
- Nhập vector
- Xuất vector
- Tính tổng hai vector
- Tính tích của một vector với một số thực
- Tính tích vơ hướng của 2 vector
Cách 1: Tải bội thường Cách 2: Tải bội thân thiện
#include <iostream> #include <iomanip> using namespace std; class VECTOR{ int x,y; public:
istream& operator >> (istream& din); //nhap vector ostream& operator << (ostream& dout); //xuat vector VECTOR operator + (VECTOR a); // cong 2 vector VECTOR operator * (float r);// nhan 1 so thuc voi 1 vector float operator * (VECTOR a); // nhan vo huong 2 vector
//CACH THU 2: DUNG CAC HAM THAN THIEN#include <iostream> #include <iostream> #include <iomanip> using namespace std; class VECTOR{ int x,y; public:
friend istream& operator >> (istream& din,VECTOR &a); friend ostream& operator << (ostream& dout,VECTOR a);
};
istream& VECTOR::operator >> (istream& din){ cout<<"x: "; din>>this->x;
cout<<"y: "; din>>this->y; return din;
}
ostream& VECTOR::operator << (ostream& dout){ dout<<"("<<this->x<<", "<<this->y<<")"; return dout;
}
VECTOR VECTOR::operator + (VECTOR a){ VECTOR c;
c.x= this->x + a.x; c.y= this->y + a.y; return c;
}
VECTOR VECTOR::operator * (float r){ VECTOR c;
c.x= r*this->x; c.y=r*this->y; return c;
}
float VECTOR::operator * (VECTOR a){ float c; c = this->x*a.x + this->y*a.y; return c; } int main(){ cout<<setiosflags(ios::showpoint)<<setprecision(3); VECTOR a, b, c; float k;
cout<<"Nhap vecto a:\n"; a.operator >>(cin); cout<<"Nhap vecto b:\n"; b.operator >>(cin); cout<<"Nhap so thuc k: "; cin>>k;
c = a.operator + (b);
a.operator <<(cout); cout<<"+"; b.operator <<(cout); cout<<"="; c.operator <<(cout); cout<<endl; c = a.operator *(k);
friend VECTOR operator * (float r,VECTOR a); friend float operator * (VECTOR a,VECTOR b); };
istream& operator >> (istream& din,VECTOR &a){ cout<<"x: "; din>>a.x;
cout<<"y: "; din>>a.y; return din;
}
ostream& operator << (ostream& dout,VECTOR a){ dout<<"("<<a.x<<", "<<a.y<<")"; return dout; }
VECTOR operator + (VECTOR a,VECTOR b){ VECTOR c;
c.x= a.x + b.x; c.y= a.y + b.y; return c;
}
VECTOR operator * (float r,VECTOR a){ VECTOR c;
c.x= r*a.x; c.y=r*a.y; return c;
}
float operator * (VECTOR a,VECTOR b){ float c; c = a.x*b.x + a.y*b.y; return c; } int main(){ cout<<setiosflags(ios::showpoint)<<setprecision(3); VECTOR a, b, c; float k;
cout<<"Nhap vecto a:\n"; cin>>a; cout<<"Nhap vecto b:\n"; cin>>b; cout<<"Nhap so thuc k: "; cin>>k; c = a+b;
cout<<a; cout<<"+";
cout<<b; cout<<"="; cout<<c; cout<<endl; c = k*a;
cout<<k; cout<<"*";
a.operator <<(cout); cout<<"="; c.operator <<(cout); cout<<endl; k = a.operator *(b);
a.operator <<(cout); cout<<"*";
b.operator <<(cout); cout<<"="; cout<<k; return 0; }
cout<<k; cout<<"*";
cout<<a; cout<<"="; cout<<c; cout<<endl; k = a*b;
cout<<a; cout<<"*";
cout<<b; cout<<"="; cout<<k; return 0; }