2010-04-15 37 views
9

Chỉ là một câu hỏi nhanh.Sử dụng hàm tạo để trả lại

Tôi đã viết một số mã trả về một lớp tùy chỉnh Lệnh và mã tôi đã viết có vẻ hoạt động tốt. Tôi đã tự hỏi nếu có bất kỳ lý do nào mà tôi không nên làm theo cách này. Đó là một cái gì đó như thế này:

Command Behavior::getCommand() 
{ 
    char input = 'x'; 

    return Command (input, -1, -1); 
} 

Dù sao, tôi đọc rằng các nhà xây dựng không có nghĩa là để có một giá trị trả về, nhưng điều này làm việc trong g ++.

Cảm ơn lời khuyên,

Rhys

+1

Cần lưu ý: Điều này, ngữ nghĩa, tạo đối tượng tạm thời rồi sao chép đối tượng khi hàm trả về. Tuy nhiên, trình biên dịch được phép thực hiện những gì được gọi là tối ưu hóa giá trị trả về hoặc RVO. Điều này có nghĩa là nó được phép không làm một bản sao, ví dụ: 'Command x = getCommand();' sẽ trực tiếp xây dựng 'x', thay vì làm cho' x' một bản sao của bất cứ cái gì được trả về. – GManNickG

+2

Câu chuyện dài ngắn: Bạn đang làm mọi thứ đúng! – Potatoswatter

Trả lời

7

Các nhà xây dựng bản thân không có giá trị trả về. Điều này làm là xây dựng một đối tượng Command tạm thời và trả về objet được xây dựng cho người gọi. Nó có hiệu quả giống như khi bạn nói:

Command temp(input, -1, -1); 
return temp; 

Nó sẽ hoạt động trên bất kỳ trình biên dịch C++ nào.

+0

Cảm ơn vì điều đó! Vui vì tôi không phải viết lại nó, đó là chức năng tuyệt vời. –

2

getCommand không phải là hàm tạo. Ở trên là hoàn toàn hợp lệ, và cũng thường hiệu quả, do thre trở lại giá trị tối ưu hóa (RVO), mà (tôi nghĩ) sẽ không áp dụng nếu bạn instantiated một biến địa phương và trả lại đó.

+0

Ghi chú hợp lý, chúc mừng! –

+2

Trong nhiều trường hợp, các biến cục bộ cũng có thể được khởi tạo lại với hàm tạo sans-copy. –

+1

Được gọi là Tối ưu hóa giá trị trả về có tên hoặc NRVO. – GManNickG

1

Hàm tạo không có giá trị trả lại; bạn đang xây dựng một trường hợp tạm thời của lớp và trả lại điều đó. Không có gì sai với điều này, khác hơn là nó sẽ tạo một bản sao.

Nếu bạn muốn tránh bản sao, bạn có một vài tùy chọn, một trong số đó là có tham số ngoài là Command* và sử dụng mới và xóa.

0

Bạn không có hàm tạo có giá trị trả lại. Command::Command(char, int, int) là người xây dựng của bạn.

Bạn có phương thức trả về một đối tượng hoàn toàn bình thường.

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