Originally posted by 11520327
View Post
đã sửa xong.
thêm hàm khởi tạo sao chép copy. nhớ là nếu dùng cấp phát động thì phải viết hàm này.
sửa lại hàm toán tử gán bằng. bởi vì nếu Content chưa được khởi tạo mà gọi hàm delete sẽ lỗi nên phải kiểm tra trước.
giải thích cái sửa thứ nhất:
khi trình biên dịch gặp câu lệnh return t trong hàm operator +,
trình biên dịch sẽ tạo ra 1 biến mới là bản sao của t( tạo bằng cách gọi hàm khởi tạo sao chép), biến mới là biến dùng để trả về( chú ý không phải là t nha).
do không có định nghĩa hàm này nên trình biên dịch sẽ gọi hàm khởi tạo sao chép ngầm định( hàm này sẽ sao chép từng bít từ vùng nhớ biến t sang biến mới),
do đó, con trỏ Content trong biến mới và con trỏ Content trong t trỏ đến cùng 1 vùng nhớ.
sau đó, hàm kết thúc, biến t là biến cục bộ nên sẽ gọi hàm hủy tương ứng, hàm này xóa luôn vùng nhớ chung của t và biến mới. do đó, vùng nhớ mà Content( biến mới) sẽ bị xóa.
hàm operator + trả về biến mới với thành phần Content "rỗng".
Code:
#include<iostream> #include<conio.h> using namespace std; class STRING { private: char *Content; int Lenght; public: STRING(); STRING(char* s); STRING(const STRING &a); STRING operator=(const STRING& p); ~STRING(); friend STRING operator+(const STRING& p,const STRING& q); void Xuat(); }; STRING::STRING() { Content=NULL; Lenght=0; } STRING::STRING(char* s) { Lenght=strlen(s); Content=new char [Lenght+1]; strcpy(Content,s); } STRING::STRING(const STRING &a) { Content=new char[a.Lenght+1]; strcpy(Content, a.Content); } STRING STRING::operator = (const STRING& p) { if(Content) delete[]Content; Lenght=strlen(p.Content); Content=new char [Lenght+1]; strcpy(Content,p.Content); return *this; } STRING::~STRING() { delete []Content; Lenght=0; } STRING operator+(const STRING& p,const STRING& q) { STRING t; t.Lenght=p.Lenght+q.Lenght; t.Content=new char [t.Lenght+1]; strcpy(t.Content,p.Content); strcat(t.Content,q.Content); return t; } void STRING::Xuat() { cout<<Content<<"\n"; } void main() { STRING x,y("DH CNTT"),z=" DHQG"; y.Xuat(); z.Xuat(); x= y+z; x.Xuat(); getch(); }
Code:
STRING::STRING(const STRING &a) { Content=new char[a.Lenght+1]; strcpy(Content, a.Content); }
Code:
STRING STRING::operator = (const STRING& p) { if(Content) delete[]Content; Lenght=strlen(p.Content); Content=new char [Lenght+1]; strcpy(Content,p.Content); return *this; }
khi trình biên dịch gặp câu lệnh return t trong hàm operator +,
trình biên dịch sẽ tạo ra 1 biến mới là bản sao của t( tạo bằng cách gọi hàm khởi tạo sao chép), biến mới là biến dùng để trả về( chú ý không phải là t nha).
do không có định nghĩa hàm này nên trình biên dịch sẽ gọi hàm khởi tạo sao chép ngầm định( hàm này sẽ sao chép từng bít từ vùng nhớ biến t sang biến mới),
do đó, con trỏ Content trong biến mới và con trỏ Content trong t trỏ đến cùng 1 vùng nhớ.
sau đó, hàm kết thúc, biến t là biến cục bộ nên sẽ gọi hàm hủy tương ứng, hàm này xóa luôn vùng nhớ chung của t và biến mới. do đó, vùng nhớ mà Content( biến mới) sẽ bị xóa.
hàm operator + trả về biến mới với thành phần Content "rỗng".
Comment