Trả đối tượng từ hàm

Một phần của tài liệu LẬP TRÌNH ĐỐI TƯỢNG CHƯƠNG 2 (Trang 39 - 42)

Đố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; } (adsbygoogle = window.adsbygoogle || []).push({});

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.

Một phần của tài liệu LẬP TRÌNH ĐỐI TƯỢNG CHƯƠNG 2 (Trang 39 - 42)