• Đố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 tự động tạo 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ể 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; }
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àm trả về đối tượng, khi đối tượ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); }
// 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 đối tượng được trả về từ một hàm, một đối tượ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 đối tượng được gọi. Để tránh tình trạng này có thể sử dụng hàm tạo bản sao.
Bài tập VII
1. Viết chương trình tạo lớp Who, cho hàm tạo của Who nhận một đối số ký tự mà đối số này được dùng để nhận dạng một đối tượng.
Hãy cho hàm tạo hiển thị một thông báo tương tự thông báo sau đây khi tạo ra một đối tượng :
Constructing who #x Trong đó x là ký tự nhận dạng.
Hãy tạo hàm make_who() để trả về đối tượng Who. Hãy cho mỗi đối tượng một tên duy nhất.