2010-02-07 27 views
9

Nếu một hàm trả về một int, nó có thể được gán bởi một giá trị int không? Tôi không thấy nó có ý nghĩa quá nhiều để gán một giá trị cho một hàm.Nếu một hàm trả về một int, thì một int có thể được gán cho nó không?

int f() {} 

f() = 1; 

Tôi nhận thấy rằng, nếu hàm trả về tham chiếu đến int, thì không sao. Nó có bị hạn chế chỉ với int không? làm thế nào về các loại khác? hoặc bất kỳ quy tắc nào khác?

int& f() {} 

f() = 1; 
+1

điều gì sẽ là điểm để gán giá trị cho một hàm? Tại sao không sử dụng biến thay thế? –

Trả lời

22

Hàm đầu tiên trả về một giá trị bằng số nguyên, là giá trị r giá trị. Bạn không thể gán cho một giá trị r nói chung. Hàm f() thứ hai trả về một tham chiếu đến một số nguyên, là một giá trị l - vì vậy bạn có thể gán cho nó.

int a = 4, b = 5; 

int& f() {return a;} 

... 
f() = 6; 
// a is 6 now 

Lưu ý: bạn không chỉ định giá trị cho hàm, bạn chỉ gán cho giá trị trả về của hàm. Hãy cẩn thận với những điều sau đây:

int& f() { int a = 4; return a; } 

Bạn đang trả lại một tham chiếu đến một tạm thời, mà là không còn giá trị sau khi trở về chức năng. Truy cập tham chiếu sẽ gọi hành vi không xác định.

+0

, bạn có thể giải thích tại sao trả về giá trị là giá trị r? – skydoor

+0

Giá trị trả về của hàm không phải là biến C++ thích hợp, chẳng hạn như 'int i;'. Nó chỉ là một giá trị tạm thời. Nó không đại diện cho một vị trí bộ nhớ. –

+1

@skydoor, nó có thể được tóm tắt bởi * "bạn chỉ có thể gán cho các đối tượng" *. Trong cuộc gọi của bạn, hàm trả về một giá trị không tương ứng với một đối tượng: Số nguyên đại diện cho * chỉ * một giá trị trừu tượng.Ví dụ, nếu bạn đã trả về một 'std :: string', giá trị trả về (thực ra là giá trị r) sẽ tương ứng với một đối tượng chuỗi, và bạn * có thể * gán cho nó. Điều này cũng đúng với giá trị trả về 'int &'. Trong trường hợp đó, giá trị "trả về" (giá trị l) tương ứng với đối tượng int * và bạn có thể gán cho nó. Một đối tượng là cần thiết, bởi vì một nhiệm vụ sửa đổi trạng thái được lưu trữ. –

1

Không giới hạn chỉ int, nhưng đối với các kiểu nguyên thủy thì không có điểm nào khi thực hiện. Nó hữu ích khi bạn có các lớp học của mình

+1

Bạn có nói rằng không có điểm nào trong việc trả về một tham chiếu đến một kiểu nguyên thủy? Vì vậy, những thứ như 'toán tử []' của 'vector ' là vô nghĩa? – sepp2k

+1

Có rất nhiều điểm khi thực hiện nó (nếu bằng 'it' bạn muốn trả về một tham chiếu) - nếu bạn có một std :: vector thì các hàm truy cập mọi thứ trong tham chiếu int vectơ trả về. –

+0

Trong ngữ cảnh của ví dụ của mình – anthares

0

Nếu một hàm trả về một đối tượng bằng giá trị, sau đó phân công là có thể, mặc dù các cuộc gọi chức năng là một giá trị. Ví dụ:

std::string("hello") = "world"; 

Điều này tạo ra một đối tượng chuỗi tạm thời, biến đổi và sau đó phá hủy ngay lập tức. Một ví dụ thực tế hơn là:

some_function(++list.begin()); 

Bạn không thể viết list.begin() + 1, vì không thể thêm vào danh sách vòng lặp, nhưng gia tăng là tốt. Ví dụ này không liên quan đến nhiệm vụ, nhưng chuyển nhượng chỉ là một trường hợp đặc biệt của quy tắc tổng quát hơn "các hàm thành viên có thể được gọi trên các giá trị".

+0

Đó là trường hợp phổ biến? Bạn có thể cho tôi một ví dụ? – skydoor

+1

Trong khi tôi hiểu nó chỉ là một ví dụ, hãy chú ý rằng '++ list.begin()' không bắt buộc phải hoạt động. Toán tử có thể được thực hiện như một hàm miễn phí chấp nhận tham chiếu không phải const và sẽ không liên kết với trình lặp tạm thời. –

+1

Cảm ơn, tôi không bao giờ có thể nhớ những nhà khai thác nào có chức năng thành viên và có thể là các chức năng miễn phí. – fredoverflow

Các vấn đề liên quan