2012-12-19 39 views
8

thể trùng lặp:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?Quy định cho việc sử dụng tài liệu tham khảo trong C++

Trong C++ là có một loại quy tắc hoặc hướng dẫn của chính xác khi nào một người phải hoặc ít nhất là nên lựa chọn cho việc sử dụng thông qua các tham chiếu hơn là theo giá trị?

Và nếu là về kích thước của đối tượng với một số đối tượng xa như biết (chút trung thực) nó có thể trở nên khó khăn để đánh giá.

+0

Xem câu trả lời này: http://stackoverflow.com/a/114351/6345 (Con trỏ so với tham chiếu) –

+0

Câu hỏi tương tự đã được hỏi quá nhiều lần trên trang web này ... http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c – nogard

+0

Một quy tắc khá tốt: 'if (sizeof (SomeType)> sizeof (void *)) // Sử dụng tham chiếu' –

Trả lời

7

Bạn nên chuyển qua tham chiếu bất cứ khi nào bạn muốn thay đổi đối số hiển thị bên ngoài hàm. Đây là đường chuyền của tham chiếu không phải là const và chủ yếu được thúc đẩy bởi logic hơn là hiệu quả.

Bạn nên chuyển qua (chủ yếu là const) tham chiếu khi bạn đang xử lý các loại dữ liệu có kích thước lớn hơn kích thước của thanh ghi. Vì tham chiếu chủ yếu là const, bạn không thể thực hiện bất kỳ thay đổi nào đối với nó, vì vậy điều này được thúc đẩy bởi hiệu quả.

+0

Việc truyền theo giá trị thường nhanh hơn tham chiếu ngay cả đối với các đối tượng lớn hơn vì thiếu 'giới hạn'. – Pubby

+0

Lưu ý: ngay cả đối với một kiểu dữ liệu nhỏ, sự hiện diện của một hàm tạo bản sao được tạo thủ công nên khuyến khích bạn sử dụng 'const &'. Ví dụ thành ngữ là 'shared_ptr', nó không nhẹ như nhiều người nghĩ. –

3
  1. Nếu bạn không muốn gọi hàm tạo bản sao của đối tượng (ví dụ: nếu làm như vậy sẽ mở rộng do kích thước đối tượng).
  2. Khi bạn thực sự cần những tài liệu tham khảo, và không chỉ có giá trị (swap(a,b), ví dụ - kể từ khi bạn thực sự cần những tài liệu tham khảo ban đầu để làm cho trao đổi.)
3

Thông thường, tôi sử dụng vượt qua bằng cách tham khảo trong tình huống sau đây:

1) objetc là kích thước lớn hơn một con trỏ: Trong trường hợp này, nếu tôi không muốn không sửa đổi các objetc, sử dụng một tham chiếu const:

Reference object; 

foo(object); 

với foo khai báo là:

void foo(const Reference & object); 

2) Đối với mã làm rõ, cố gắng để tránh thigs như thế này:

int f1 = xxx; 
int f2 = yyy; 
int f3 = zzz; 
.... 

foo(f1, f2, ............) 

sử dụng một struct:

struct X 
{ 
    int f1; 
    int f2; 
    int f3; 
    .... 
}; 

X x; 
x.f1 = xxx; 
..... 

foo(X); 

với foo định nghĩa là:

foo(const X & x); 

3) cho các mục đích tăng tốc: Nhớ rằng các hàm gọi điện phải đặt ngang nhau ameters on stack 4) Bạn cần sửa đổi các tham số bên trong hàm.

Reference object; 

foo(object); 

với foo khai báo là:

void foo(Reference & object); 
1

thích pass-by-reference-to-const để pass-by-value. Vượt qua giá trị là một hoạt động tốn kém vì các bản sao của đối tượng được tạo ra bởi các nhà xây dựng bản sao.Ngoài ra, nếu bạn có một số thành viên dữ liệu không nguyên thủy trong lớp (ví dụ: std::string), mỗi khi một đối tượng mới của lớp được tạo, thì các đối tượng đó cũng sẽ được tạo std::string.

Đi qua tham chiếu cũng tránh slicing problem. Nếu bạn truyền một đối tượng lớp dẫn xuất theo giá trị cho hàm mong đợi đối tượng lớp cơ sở, các đặc tính dẫn xuất của lớp dẫn xuất sẽ bị cắt đi và đối tượng bên trong hàm sẽ hoạt động như một đối tượng lớp cơ sở. Nếu bạn vượt qua bằng cách tham chiếu, có thể tránh được việc cắt.

Tuy nhiên, có một số trường hợp bạn không thể chuyển qua tham chiếu. Nếu đối số hàm của bạn hoặc giá trị trả về cần có giá trị NULL, bạn không thể sử dụng tham chiếu.

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