Tôi thực sự bối rối về cách thức và phương thức nào để sử dụng để trả về đối tượng từ một hàm. Tôi muốn một số phản hồi về các giải pháp cho các yêu cầu nhất định.Trả về đối tượng từ hàm
Tình huống A: Đối tượng được trả về sẽ được lưu trữ trong một biến không cần phải sửa đổi trong suốt thời gian tồn tại của nó. Như vậy,
const Foo SomeClass::GetFoo() {
return Foo();
}
gọi như:
someMethod() {
const Foo& l_Foo = someClassPInstance->GetFoo();
//...
}
Scneraio B: Các đối tượng quay trở lại là được lưu trữ trong một biến mà sẽ được sửa đổi trong suốt cuộc đời của nó. Như vậy,
void SomeClass::GetFoo(Foo& a_Foo_ref) {
a_Foo_ref = Foo();
}
gọi như:
someMethod() {
Foo l_Foo;
someClassPInstance->GetFoo(l_Foo);
//...
}
Tôi có một câu hỏi ở đây: Cho phép nói rằng Foo không thể có một constructor mặc định. Sau đó, làm thế nào bạn sẽ đối phó với điều đó trong tình huống này, vì chúng ta không thể viết này nữa:
Foo l_Foo
Kịch bản C:
Foo SomeClass::GetFoo() {
return Foo();
}
gọi như:
someMethod() {
Foo l_Foo = someClassPInstance->GetFoo();
//...
}
Tôi nghĩ đây không phải là cách tiếp cận được khuyến nghị vì nó sẽ phải xây dựng thêm thời gian.
Bạn nghĩ sao? Ngoài ra, bạn có đề xuất một cách tốt hơn để xử lý thay thế này không?
http://en.wikipedia.org/wiki/Return_value_optimization – vladr
kịch bản A là tốt nhưng thực sự không cải thiện so với C.Tôi muốn sử dụng C trừ khi hàm tạo mặc định của Foo là "nhanh", ctor sao chép của Foo "chậm" và bạn không muốn dựa vào trình biên dịch đủ thông minh để bỏ các bản sao không cần thiết trong trường hợp B cũng được chấp nhận. – sellibitze
lưu ý rằng 'a_Foo_ref = Foo();' tạo đối tượng và thực hiện sao chép. Nó gần như tương đương với kịch bản cuối cùng – Anycorn