Chương 7. Lớp và đối tượng
+ Nội dung chương trình là: Dùng lệnh khai báo để tạo một đối tượng u (kiểu
PS) có nội dung như đối tượng đã có d.
// Ham tao sao chep mac dinh
#include <conio.h>
#include <iostream.h>
class PS
{
private:
int t, m ;
public:
friend ostream& operator<< (ostream&os, const PS &p)
{
os << " = " << p.t << "/" << p.m;
return os;
}
friend istream& operator>> (istream& is, PS &p)
{
cout << "\n Nhap tu va mau: " ;
is >> p.t >> p.m ;
return is;
}
} ;
void main()
{
PS d;
cout << "\n Nhap PS d "; cin >> d;
cout << "\n PS d " << d;
PS u(d);
cout << "\n PS u "<< u;
hàm tạo sao chép mặc định là đủ.
+ Khi lớp có các thuộc tính con trỏ hoặc tham chiếu, thì hàm tạo sao chép
mặc định chưa đáp ứng được yêu cầu.
Ví dụ:
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac he so da thuc a0, a1, ...
public:
240
Chương 7. Lớp và đối tượng
DT() { this->n0; this->a = NULL; }
DT(int n1)
{
this->n = n1;
this->a = new double[n1+1];
}
friend ostream& operator << (ostream& os, const DT &d);
friend istream& operator>> (istream& is, DT &d);
...
} ;
Bây giờ chúng ta hãy theo dõi xem việc dùng hàm tạo mặc định trong đoạn
chương trình sau sẽ dẫn đến sai lầm như thế nào:
DT d ; // Tạo đối tượng d kiểu DT
cin >> d ;
/* Nhập đối tượng d, gồm: nhập một số nguyên dương và gán cho d.n, cấp phát
vùng nhớ cho d.a, nhập các hệ số của đa thức và chứa vào vùng nhớ được cấp phát
*/
friend ostream& operator<< (ostream& os, const DT &d);
friend istream& operator>> (istream& is, DT &d);
} ;
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)
{
if (d.a! = NULL) delete d.a;
cout << " \n 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;
} 242
Chương 7. Lớp và đối tượng
for (int i = 0; i< = d.n; ++i)
this → a[i] = d.a[i];
}
243