2012-01-19 40 views
6

Tôi gặp sự cố với tham chiếu. xem xét mã này:Tham chiếu dưới dạng đối số chức năng?

void pseudo_increase(int a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    pseudo_increase(a); 
    //.. 
} 

Ở đây, giá trị của biến a sẽ không tăng như một bản sao hoặc bản sao của nó được thông qua và không biến bản thân.
Bây giờ chúng ta hãy xem xét một ví dụ khác:

void true_increase(int& a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    true_increase(a); 
    //.. 
} 

Ở đây người ta nói giá trị của a sẽ tăng - nhưng tại sao?

Khi gọi true_increase(a), bản sao a sẽ được chuyển. Nó sẽ là một biến khác. Do đó, &a sẽ khác với địa chỉ thực của a. Vậy giá trị của a tăng lên như thế nào?

Sửa lỗi cho tôi khi tôi sai.

+1

Có lẽ bạn nên sử dụng các số nhận dạng khác nhau cho đối số chức năng và biến được chuyển đến nó để bạn không tự nhầm lẫn hơn nữa. – AusCBloke

+1

Đi qua tham chiếu không tạo bản sao. Đó là một tham chiếu đến cùng một biến. – jweyrich

+0

Tôi khuyên bạn nên tìm hiểu về con trỏ đầu tiên sau đó về cách tham chiếu có thể làm giảm nỗi đau của các đối tượng chưa được khởi tạo và các con trỏ không hợp lệ. Chọn bất kỳ cuốn sách C/C++ yêu thích nào của bạn! – sarat

Trả lời

6

Hãy xem xét ví dụ sau:

int a = 1; 
int &b = a; 
b = 2; // this will set a to 2 
printf("a = %d\n", a); //output: a = 2 

Đây b có thể bị đối xử như một alias cho a. Dù bạn gán cho số b, cũng sẽ được gán cho a (vì b là tham chiếu đến a). Đi qua một tham số by reference không khác nhau:

void foo(int &b) 
{ 
    b = 2; 
} 

int main() 
{ 
    int a = 1; 
    foo(a); 
    printf("a = %d\n", a); //output: a = 2 
    return 0; 
} 
5

Khi true_increase (a) được gọi, bản sao của 'a' sẽ được chuyển

Đó là nơi mà bạn đã sai. Tham chiếu đến a sẽ được thực hiện. Đó là những gì mà & là dành cho bên cạnh loại thông số. Bất kỳ hoạt động nào xảy ra với tham chiếu đều được áp dụng cho tham chiếu.

1

trong true_increase của bạn (int & a) chức năng, những gì các mã bên trong là nhận được là KHÔNG PHẢI LÀ COPY giá trị số nguyên mà bạn đã chỉ định. nó là một tham chiếu đến cùng một vị trí bộ nhớ trong đó giá trị số nguyên của bạn nằm trong bộ nhớ máy tính. Do đó, mọi thay đổi được thực hiện thông qua tham chiếu đó sẽ xảy ra với số nguyên thực tế mà bạn đã khai báo ban đầu, chứ không phải bản sao của nó. Do đó, khi hàm trả về, mọi thay đổi mà bạn đã thực hiện đối với biến thông qua tham chiếu sẽ được phản ánh trong biến ban đầu. Đây là khái niệm truyền các giá trị theo tham chiếu trong C++.

Trong trường hợp đầu tiên, như bạn đã đề cập, một bản sao của biến ban đầu được sử dụng và do đó bất cứ điều gì bạn đã làm bên trong hàm không được phản ánh trong biến ban đầu.

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