2010-05-04 45 views
25

Định nghĩa ngắn gọn về biến tham chiếu trong C++ là gì?Biến tham chiếu trong C++ là gì?

+2

Tham chiếu có thể hữu ích vì chúng thực thi việc sử dụng bộ nhớ khởi tạo (tức là chúng không thể tham chiếu null, khi được sử dụng bình thường). –

+1

Một tham chiếu chỉ là cú pháp đường cho một con trỏ 'const' (không nhất thiết phải là con trỏ đến const). Không có sự bảo vệ đặc biệt nào chống lại việc tham chiếu đến NULL, nó gây ra hành vi không xác định giống như dereferencing một con trỏ NULL. Về mặt vi phạm, bạn có thể nói người gọi đã vi phạm tiêu chuẩn C++ bằng dereferencing NULL và chuyển tham chiếu NULL, thay vì vi phạm hợp đồng API bằng cách chuyển một con trỏ NULL thành tham số không null, nhưng về mặt kỹ thuật và hành vi thời gian chạy không có sự khác biệt bất kì cái gì. –

+0

http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c –

Trả lời

2

biến tham chiếu cho phép hai tên biến để giải quyết các vị trí nhớ cùng:

int main() 
{ 
    int var1; 

    // var2 is a reference variable, holds same value as var1 

    int &var2 = var1; 
    var1 = 10; 

    std::cout << "var1 = " << var1 << std::endl; 
    std::cout << "var2 = " << var2 << std::endl; 
} 

Resource: LINK

3

Đó là một biến mà tài liệu tham khảo nhau:

int foo; 
int& bar = foo; 

bar là bây giờ là một tham chiếu, đó là để nói rằng bar giữ vị trí của bộ nhớ trong đó foo nằm.

Xem here để biết thêm thông tin.

+2

Về mặt kỹ thuật thì không. Nếu thanh là một biến bạn có thể nhận được địa chỉ của nó. Một tham chiếu là một bí danh cho một biến khác (không phải là địa chỉ của vì điều này sẽ ngụ ý trình biên dịch sẽ cần phải chèn một hoạt động dereference). Khi điều này được biên soạn ra thanh có lẽ chỉ là thay thế bằng foo. –

+0

Văn bản của bạn mô tả một con trỏ. Tham chiếu không giữ bất kỳ vị trí bộ nhớ nào và có thể không yêu cầu bất kỳ bộ nhớ nào. (Trong ví dụ của bạn, có lẽ 'bar' không sử dụng bất kỳ bộ nhớ nào). –

6

Đoạn đầu tiên của Wikipedia article có thể dễ dàng đóng vai trò là một định nghĩa ngắn gọn:

Trong C ngôn ngữ lập trình ++, một tham chiếu là một kiểu dữ liệu tham khảo đơn giản mà ít mạnh mẽ nhưng an toàn hơn các loại con trỏ được kế thừa từ C .

Và trích dẫn từ cùng một bài viết:

C++ tài liệu tham khảo khác với con trỏ bằng nhiều cách cần thiết:

  • Không thể chuyển trực tiếp đến đối tượng tham chiếu sau khi được xác định; bất kỳ sự xuất hiện của tên của nó đề cập trực tiếp đến đối tượng mà nó tham chiếu.

  • Sau khi tham chiếu được tạo, sau này không thể tạo tham chiếu để tham chiếu một đối tượng khác; nó không thể được reseated. Điều này thường được thực hiện với con trỏ.

  • Tài liệu tham khảo không được rỗng, trong khi con trỏ có thể; mọi tham chiếu đều đề cập đến một số đối tượng, mặc dù nó có thể hoặc có thể không hợp lệ.

  • Tài liệu tham khảo không thể uninitialized. Bởi vì không thể khởi tạo lại một tham chiếu, chúng phải được khởi tạo ngay sau khi chúng được tạo ra. Đặc biệt, các biến cục bộ và toàn cầu phải được khởi tạo khi chúng được định nghĩa và các tham chiếu là thành viên dữ liệu của các cá thể lớp phải được khởi tạo trong danh sách khởi tạo của hàm tạo của lớp.

Tiếp tục đọc:

+1

Wikipedia không phải là một nguồn rất có thẩm quyền. –

17

Một tham khảo là một thực thể đó là một bí danh cho một khác đối tượng.

Một tham khảo không phải là một biến như một biến chỉ được giới thiệu bởi các tuyên bố của một đối tượng . Một đối tượng là một vùng lưu trữ và, trong C++, tài liệu tham khảo không (nhất thiết) chiếm bất kỳ bộ nhớ nào.

đối tượngtham chiếu là các nhóm thực thể riêng biệt trong C++ nên thuật ngữ "biến tham chiếu" không có ý nghĩa.

+4

Vâng, không * nhưng * một biến. Tốt rằng C++ 0x sửa chữa nó - đó là một vấn đề lâu dài trong tiêu chuẩn. Xem http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#633 và xem xét n3090, nó đã được tích hợp vào FCD. Dù sao, để được hoàn thành, bạn có thể đề cập rằng tài liệu tham khảo có thể tham khảo các chức năng quá. 1 cho độ chính xác kỹ thuật :) –

+0

Xin lỗi vì đã tiếp tục một bài đăng cũ. Điều đó có nghĩa là trong C++ 11/14/17 tôi có thể sử dụng thuật ngữ "biến tham chiếu" một cách an toàn khi nói về 'int & b = a'? –

+0

Vì C++ 11, * biến * có nghĩa là tham chiếu hoặc đối tượng. Xem [basic]/6 trong C++ 14 ví dụ: "A * variable * được giới thiệu bởi khai báo tham chiếu khác với thành phần dữ liệu không tĩnh hoặc của một đối tượng. Tên của biến, nếu có, biểu thị tham chiếu hoặc đối tượng." –

12

Biến tham chiếu cung cấp bí danh (tên thay thế) cho biến được xác định trước đó. Ví dụ:

float total=100; 
float &sum = total; 

Nó có nghĩa là cả hai totalsum là các biến tương tự.

cout<< total; 
cout << sum; 

Cả hai giá trị này sẽ cung cấp cùng một giá trị, 100. Ở đây, toán tử & không phải là toán tử địa chỉ; float & có nghĩa là tham chiếu đến phao.

0

một biến tham khảo và một biến con trỏ là chính xác điều tương tự với máy (trình biên dịch sẽ tạo ra cùng một mã máy).

Những lợi thế rõ ràng nhất của việc sử dụng một biến tham chiếu trên một biến con trỏ trong kiến ​​thức của tôi:

  1. Dễ hiểu (không có địa chỉ, de-tham khảo tất cả mọi thứ đau đầu)
  2. Tiết kiệm một chút xíu của nhập, do đó có thể là ít bị lỗi hơn.

Trong mã bên dưới, phía bên trái đang sử dụng biến tham chiếu và phía bên phải đang sử dụng biến con trỏ. Chúng giống với máy, nhưng bạn thấy biến tham chiếu đang sử dụng giúp bạn tiết kiệm được một chút.

Reference variable   Pointer variable 
int a = 1;   ~~~~~~ int a = 1; 
int &b = a;  ~~~~~~ int *b = &a; 
b = 2;    ~~~~~~ *b = 2; 
cout << a << '\n' ~~~~~~ cout << a << '\n' 
============================================== 
2     ~~~~~~ 2 
1

Tham chiếu là nhãn thay thế, bí danh cho đối tượng được khởi tạo. Khi một tham chiếu được khởi tạo, nó không thể thay đổi thành nhãn thay thế hoặc bí danh của một số đối tượng khác. Sau khi khởi tạo tham chiếu hoặc biến đối tượng có thể được sử dụng thay thế cho nhau.

Tham chiếu có một số đặc tính của một con trỏ const đến một đối tượng ở chỗ nó được khởi tạo khi được xác định. Và trong khi những gì nó tham chiếu hoặc điểm có thể được thay đổi, tham chiếu hoặc con trỏ const chính nó không thể thay đổi. Tuy nhiên vì một tham chiếu là một nhãn hoặc bí danh thay thế, nó có thể hoặc không thực sự tồn tại như một đối tượng dữ liệu, không giống như một con trỏ const có thể tồn tại trừ khi trình biên dịch có thể tối ưu hóa nó đi. Và thậm chí nếu một tham chiếu được tạo ra như là một thực thể thực tế bởi trình biên dịch, đó là trình dọn dẹp trình biên dịch và cần được bỏ qua vì nó chính thức không tồn tại giống như người đàn ông phía sau bức màn ở Thành phố Emerald.

Các mẫu mã sau đây đưa ra ví dụ so sánh và tham khảo với con trỏ và con trỏ const tương phản:

int myInt;   // create a variable of type int, value not initialized 
int myInt2 = 3;  // create a second variable of type int with a value of 3 
int &rInt = myInt; // create a reference to the variable of type int, myInt 

rInt = 5;   // myInt now has a value of 5, the reference is an alias for myInt 
rInt++;    // myInt now has a value of 6, the reference is an alias for myInt 
rInt = myInt2;  // myInt now has the same value as myInt2, a value of 3 
int *pInt = &rInt; // pInt points to myInt 
(*pInt)++;   // increments myInt 
pInt++;    // increments the pointer which formerly pointed to myInt 

int &rInt2;   // error C2530: 'rInt2' : references must be initialized 
int *pInt2;   // just fine, uninitialized pointer is ok 
int * const pInt3; // error C2734: 'pInt3' : const object must be initialized if not extern 
int * const pInt4 = &myInt; // define and initialize const pointer 
pInt4 = &myInt2;  // error C3892: 'pInt4' : you cannot assign to a variable that is const 

Thực tế, có hai loại tài liệu tham khảo: một lvalue tham khảo và một rvalue tham khảo.

Tham chiếu lvalue là cùng một tham chiếu bằng ngôn ngữ C++ trước C++ 11. Tài liệu tham khảo rvalue được giới thiệu trong C++ 11 để cho phép tham chiếu đến đối tượng tạm thời để hỗ trợ di chuyển thay vì bản sao và một số hành động khác mà bản sao là phương pháp sai nhưng di chuyển là cách tiếp cận đúng.

Ví dụ: so sánh tham chiếu lvalue và tham chiếu rvalue trong các dòng nguồn đơn giản sau đây. Bởi vì đây là các tham chiếu int có nghĩa là việc gán một giá trị không phải số nguyên cho kết quả trong trình biên dịch thực hiện chuyển đổi dẫn đến biến tạm thời. Tham chiếu rvalue có thể liên kết với biến tạm thời và không thể tham chiếu lvalue.

// assign a double to an int causing creation of temporary  
int &rIntd1 = 1.2; // error C2440: 'initializing' : cannot convert from 'double' to 'int &' 
int &&rIntd2 = 1.2; // warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data 

rInt = rIntd2;  // myInt from the code above now has a value of 1, 1.2 was truncated when converting from double to int 
3

Một biến Reference là một alias cho tên biến.

Đó là khác biệt so với các con trỏ trong những cách sau đây:

  1. Bạn không thể có tài liệu tham khảo NULL. Bạn phải luôn có khả năng giả định rằng tham chiếu được kết nối với một bộ lưu trữ hợp pháp.
  2. Khi một tham chiếu được khởi tạo cho một đối tượng, nó không thể thay đổi để trỏ đến bất kỳ đối tượng nào khác, trong trường hợp con trỏ chúng ta có thể trỏ đến bất kỳ đối tượng nào khác bất cứ lúc nào.
  3. Tham chiếu phải được khởi tạo khi thời gian được tạo. Con trỏ có thể được khởi tạo bất cứ lúc nào.
0

biến tham chiếu (let a), chỉ cần nói cho dễ hiểu, một tên biến (let x), nắm giữ vị trí bộ nhớ chính xác giống như của x.

int &a = x; đề cập rằng giữ cùng một vị trí bộ nhớ giống như của x.

Ví dụ: giả sử hai bạn cùng phòng ở chung phòng. Tên bạn bè là x và một tên bạn khác là a. Nếu a thay đổi vị trí của bảng được đặt trong phòng, từ vị trí (x,y,z) đến (x1,y1,z1) thì thay đổi cũng hiển thị đối với bạn bè x cũng như ngược lại.

0

Tham chiếu là tên thay thế cho một đối tượng. Biến tham chiếu cung cấp bí danh cho các biến được xác định trước đó. Một khai báo tham chiếu bao gồm một kiểu cơ sở là & một biến tham chiếu tương đương với một tên biến.

0

Trang 79 ~ 80 C++ Primer 5th ed.

Object: Một khu vực bộ nhớ rằng có một loại

Biến: đối tượng được đặt tên hoặc tham chiếu

tham khảo: Một bí danh cho một đối tượng khác.

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