Chương 2 Lớp , Đ ối tượng và tính đóng gói 54 54 } VII/ Trảđốitượngtừhàm • Đốitượngtrả về từhàm thông qua câu lệnh return . Khi đó một đốitượng tạm được tự động tạo ra để giữ giá trò trả về. Chính đốitượng này thực sự được trả về bởi hàm. Sau khi giá trò được trả về, đốitượng này bò hủy, sự hủy đốitượng tạm có thể gây ra tác dụng ngoài ý muốn. Ví dụ 7.1 // Returning an object #include <iostream.h> #include <string.h> class samp { char s[80]; public: void show() { cout << s << "\n"; } void set(char *str) { strcpy(s, str); } }; // Return an object of type samp samp input() { char s[80]; samp str; cout << "Enter a string: "; cin >> s; str.set(s); return str; } Chương 2 Lớp , Đ ối tượng và tính đóng gói 55 55 int main() { samp ob; // assign returned object to ob ob = input() ; // Enter a string: Hello ↵ ob.show(); // Hello return 0; } Ví dụ 7.2 Phải thận trọng khi hàmtrả về đối tượng, khi đốitượng này có chứa hàm hủy. // An error generated by returning an object. #include <iostream.h> #include <string.h> #include <stdlib.h> class samp { char *s; public: samp() { s = '\0'; } ~samp() { if(s) free(s) ; cout << "Freeing s\n"; } void show() { cout << s << "\n"; } void set(char *str); }; // Load a string. void samp::set(char *str) { s = (char *) malloc(strlen(str)+1); if(!s) { cout << "Allocation error\n"; exit(1); } strcpy(s, str); } Chương 2 Lớp , Đ ối tượng và tính đóng gói 56 56 // Return an object of type samp. samp input() { char s[80]; samp str; cout << "Enter a string: "; cin >> s; str.set(s); return str; } int main() { samp ob; // assign returned object to ob ob = input() ; // This causes an error!!!! ob.show(); return 0; } Hãy giải thích kết quả của chương trình ? Enter a astring: Hello Freeing s Freeing s Hello Freeing s Null pointer assignment Khi một đốitượng được trả về từ một hàm, một đốitượng tạm được dùng để thực hiện sự trả về sẽ làm hủy bộ nhớ (được cấp phát cho chuổi s) của đốitượng được gọi. Để tránh tình trạng này có thể sử dụng hàm tạo bản sao. . 2 Lớp , Đ ối tượng và tính đóng gói 54 54 } VII/ Trả đối tượng từ hàm • Đối tượng trả về từ hàm thông qua câu lệnh return . Khi đó một đối tượng tạm được. ra để giữ giá trò trả về. Chính đối tượng này thực sự được trả về bởi hàm. Sau khi giá trò được trả về, đối tượng này bò hủy, sự hủy đối tượng tạm có thể