Liệu đây có phải là vấn đề của bạn? :
Lập trình C++ | Tài liệu lập trình C++ của Phạm Văn Ất
Chúc vui vẻ!
Cho mình hỏi 3 câu hỏi như sau :
- Thế nào là hàm trả về tham chiếu ?
- Hàm trả về tham chiếu dùng để làm jì ?
- Khi nào nên và không nên sử dụng hàm trả về tham chiếu ?
Cám ơn các bác nhìu !
Liệu đây có phải là vấn đề của bạn? :
Lập trình C++ | Tài liệu lập trình C++ của Phạm Văn Ất
Chúc vui vẻ!
Cái này ko biết có giúp gì được cho bạn ko, tôi hay gọi tham chiếu là tham số hình thức biến vì cái tên này thẻ hiện rõ ý nghĩa của nó hơn và định nghĩa về nó như sau:
Tham số hình thức biến là danh hiệu cục bộ dùng thay cho danh hiệu biến không cục bộ. Nó là tên cục bộ hay sự đổi tên của thông số thực. Sử dụng tham số hình thức biến cho phép người ta gán trị cho biến không cục bộ mà không cần phải biết tên chúng khi viết hàm. Tham số hình thức biến thường đại diện cho output của chương trình con. Tham số hình thức biến thường đi sau dấu &.
à không, cái này thì mình hiểu rồi ! Hàm chỉ chưa hiểu về "Hàm trả về tham chiếu" thôi à ! Mình cũng đọc sách rồi, nhưng chưa hiểu, mong các bác giải thích thêmNguyên bản được gửi bởi huynguyen
Mới đọc sơ qua về cái này, ko biết có hiểu đúng ý của nó ko, tui nói thử nhé. Với hàm trả về tham chiếu thì thực chất là hàm này nó tương tác với biến mà nó chỉ đến (ko phải con trỏ nhé, tham chiếu đến thôi) và nó xử lý tình huống để trả về kết quả mà mình mong muốn.Hàm trả về tham chiếu
lan man quá, lan man quá
- Thế nào là hàm trả về tham chiếu ?
Hàm trả về tham chiếu tức là những hàm có dạng
DATATYPE& func(...) {
...
return aDATATYPE; //aDATATYPE là biến thuộc kiểu DATATYPE
}
- Hàm trả về tham chiếu dùng để làm jì ?
Có 2 cách trả về của hàm là: tham chiếu (hay tham biến), và tham trị. Hàm trả về tham chiếu được dùng để tránh Copy Constructor được gọi. Vì hàm trả ra tham trị luôn gọi cho gọi Copy Constructor, tham chiếu thì luôn không
Hình như có 1 thread bạn hỏi về Copy Constructor, bạn đã hỏi về 2 thứ mà nó dính chặt với nhau. Chút sang giải thích luôn
- Khi nào nên và không nên sử dụng hàm trả về tham chiếu ?
Tham chiếu luôn tốt hơn tham trị về mặt performance, nên bất kỳ khi nào dùng được tham chiếu thì nên dùng, vì có những trường hợp không thể dùng được tham chiếu
Câu hỏi hợp lý hơn là: Khi nào thì dùng được tham chiếu?
Trả lời là trong trường hợp hàm kết thúc mà biến được trả về của hàm vẫn còn tồn tại thì dùng được tham chiếu
Trong trương hợp nào thì kết quả trả về của hàm vẫn còn tồn tại khi hàm kết thúc:
- Khi hàm là thành viên của lớp, và biến trả về là thành viên của lớp
VD:
class C {
int x;
int& getX() { return x;} //hàm này trả về tham chiếu được
}
- Khi biến được trả về có tầm vực cao hơn tầm vực của hàm
VD:
int& processX(int& x) { return x; } // hàm này nhận vào tham chiếu x và trả ra tham chiếu x
- Khi kết quả trả về được cấp phát động, và không được giải phóng trong hàm (trường hợp này hơi không hợp lý, vì trong lập trình hướng đối tượng ko ai làm vậy cả, tuy nhiên nói để hiểu)
VD
int& alloc1int() { return int *pInt = new int; return *pInt; }
còn đây là ví dụ về không dùng được tham chiếu:
int& func() { int x; ... return x; } //biến x cục bộ, thoát hàm là mất
bai cua thangtran khá chất lượng đấy, nếu bạn tham khảo kỹ chắc cũng sẽ tìm ra câu trả lời cho mìnhLiệu đây có phải là vấn đề của bạn?
Ok, mình hiểu rồi, cám ợn bác huynguyen, thangtran và nguyentuan2 nhiều lắm !
Bài viết chất lượng quá. Thanks.
Theo bản chất của tham chiếu, thì mình có thể thay đổi giá trị của biến tham qua biến tham chiếu chiếu đến, như vậy điều này có đúng với hàm trả về tham chiếu hay không ?Nguyên bản được gửi bởi nguyentuan2
Hình như bạn nhầm ở đây thì phải ! Phải là int mới đúng ! Ko có '&' !Nguyên bản được gửi bởi nguyentuan2
Theo như bạn nói, giá trị x sẽ mất đi khi hàm thoát ? Vậy nếu mình thức hiện lệnh như thế này : int a = func();Nguyên bản được gửi bởi nguyentuan2
Thì a có giá trị của x, nhưng x đã mất khi hàm thoát ra rồi, thì làm sao a gán được như vậy ?
Cái này ko phải mình bắt bẻ bạn nha ! Đừng hiểu nhầm, mình cũng muốn hiểu rõ bản chất của vấn đề nên mới hỏi vậy, thông cảm nha !
Bạn giải thích giúp mình nha, nhờ có phoenix hỏi mà mình hiểu thêm được chút wa bài viết của bạn đó ! Cám ơn bạn nhiều nha !
à, ý của mình cũng giống như bạn đang nghĩ đó
tức là
int& func() { int x; ... return x; } //biến x cục bộ, thoát hàm là mất
cái đó là sai, phải thế này mới đúng
int func() { int x; ... return x; } //biến x cục bộ, thoát hàm là mất