2010-05-04 3 views
25

Что было бы кратким определением ссылочной переменной в C++?Что такое ссылочная переменная в C++?

+2

Ссылки могут быть полезными, поскольку они обеспечивают использование инициализированной памяти (то есть они не могут ссылаться на нуль при обычном использовании). –

+1

Ссылка - это просто синтаксический сахар для указателя 'const' (не обязательно указатель на константу). Нет никакой особой защиты от ссылки на NULL, она вызывает неопределенное поведение так же, как разыменование указателя NULL. Педантично вы можете сказать, что вызывающий абонент нарушил стандарт C++, разыменовывая NULL и передавая ссылку NULL, вместо того, чтобы нарушать контракт API, передавая указатель NULL в качестве параметра с непустым значением, но технически и в типичном режиме времени нет разницы бы то ни было. –

+0

http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c – 2010-05-04 14:25:22

ответ

2

Ссылочные переменные позволяют двум имена переменных для решения той же ячейки памяти:

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; 
} 

Ресурс: LINK

3

Это переменная, которая ссылки еще одно:

int foo; 
int& bar = foo; 

bar является теперь ссылка, то есть bar содержит местоположение памяти, где находится foo.

См. here для получения дополнительной информации.

+2

Технически нет. Если бы бар был переменной, вы могли бы получить его адрес. Ссылка является псевдонимом другой переменной (а не адресом, поскольку это подразумевает, что компилятор должен будет вставить операцию разыменования). Когда это получается скомпилированным баром, вероятно, просто заменяется на foo. –

+0

Ваш текст описывает указатель. Ссылка не содержит места в памяти и может не требовать хранения. (В вашем примере, вероятно, 'bar' не использует никакого хранилища). –

6

Первый абзац Wikipedia article легко может служить в качестве краткого определения:

В языке программирования C++, ссылка является простой ссылкой типа данных, который является менее мощным, но более безопасным, чем тип указателя, унаследованного от C .

И цитаты из той же статьи:

ссылки C++ отличаются от указателей в нескольких основных способов:

  • Невозможно обратиться непосредственно к эталонному объекту после его определения; любое вхождение его имени относится непосредственно к объекту, который он ссылается.

  • Как только ссылка создана, ее нельзя впоследствии ссылаться на другой объект; он не может быть пересмотрен. Это часто делается с указателями.

  • Ссылки не могут быть пустыми, тогда как указатели могут; каждая ссылка относится к некоторому объекту, хотя она может быть или не быть действительной.

  • Ссылки не могут быть неинициализированы. Поскольку невозможно повторно инициализировать ссылку, они должны быть инициализированы, как только они будут созданы. В частности, локальные и глобальные переменные должны быть инициализированы там, где они определены, а ссылки, являющиеся членами данных экземпляров класса, должны быть инициализированы в списке инициализаторов конструктора класса.

Дальнейшее чтение:

+1

Википедия - не очень авторитетный источник. –

17

ссылка является объектом, который является псевдонимом для прочее объект.

ссылка не переменная как переменной вводится только в декларации объекта. Объект является областью хранения, а в C++ ссылки не обязательно обрабатывают любое хранилище.

Как объекты и ссылки являются различные группы субъектов в C++, так что термин «ссылочная переменная» не имеет смысла.

+4

Ну, не * еще * переменная. Хорошо, что C++ 0x исправляет это - это была давняя проблема в стандарте. См. Http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#633 и взгляните на n3090, он уже включен в FCD. В любом случае, чтобы быть полным, вы могли бы упомянуть, что ссылки могут также ссылаться на функции. +1 для технической точности :) –

+0

Извините за возобновление старого сообщения. Означает ли это, что в C++ 11/14/17 я могу безопасно использовать термин «ссылочная переменная» при разговоре о 'int & b = a'? –

+0

Поскольку C++ 11, * variable * означает ссылку или объект. См. [Basic]/6 в C++ 14, например: «A * variable * вводится декларацией ссылки, отличной от нестатического элемента данных или объекта. Имя переменной, если таковая имеется, обозначает ссылку или объект.« –

12

Эталонная переменная предоставляет псевдоним (альтернативное имя) для ранее определенной переменной. Например:

float total=100; 
float &sum = total; 

Это означает как total и sum одни и те же переменные.

cout<< total; 
cout << sum; 

Оба собираются дать такое же значение, 100. Здесь оператор & не является оператором адреса; float & означает ссылку на float.

3

C++ ссылки позволяют создать второе имя переменной, которую можно использовать для чтения или изменения исходных данных, хранящихся в этой переменной

Для более подробной информации посетите:

http://www.cprogramming.com/tutorial/references.html

http://www.tutorialspoint.com/cplusplus/cpp_references.htm

0

ссылочных переменная и переменная а указателя является то же самое для машины (компилятор будет генерировать один и тот же машинный код).

Наиболее очевидные преимущества использования ссылочного переменного над переменнуюуказателем в моем знании:

  1. Легко в понять (без адреса, разыменовывается все виды головной боли вещей)
  2. Сохранения вас крошечный бит , набрав, и, следовательно, вероятно, менее подвержен ошибкам.

В приведенном ниже коде левая сторона использует ссылочную переменную, а правая сторона использует переменную-указатель. Это то же самое для машины, но вы видите, что используемая ссылочная переменная позволяет вам немного печатать.

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

Ссылка является альтернативной меткой, псевдоним, для объекта, с которым он инициализируется. После инициализации ссылки ее нельзя изменить как альтернативную метку или псевдоним другого объекта. После инициализации ссылка или переменная объекта могут использоваться взаимозаменяемо.

Ссылка содержит некоторые характеристики указателя const для объекта, в котором он инициализируется при определении. И хотя то, что он ссылается или указывает на, может быть изменено, ссылка или указатель const сама не может быть изменена. Однако, поскольку ссылка является альтернативной меткой или псевдонимом, она может или не может существовать как объект данных в отличие от указателя const, который, вероятно, будет существовать, если компилятор не сможет его оптимизировать. И даже если ссылка создается как фактическая сущность компилятором, то есть домашнее хозяйство компилятора, и его следует игнорировать, поскольку она официально не существует, как человек, стоящий за занавеской в ​​Изумрудном городе.

Следующие примеры кода приведены примеры сравнение и противопоставление ссылки с указателем и константным указателем:

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 

Есть на самом деле два вида ссылок: lvalue ссылки и rvalue ссылки.

Ссылка на lvalue эта же ссылка на языке C++ до C++ 11. В C++ 11 была введена ссылка rvalue, позволяющая ссылаться на временный объект, помогающий выполнять перенос, а не копию и некоторые другие действия, когда копия является неправильным подходом, но шаг является правильным подходом.

Например, сравнение опорных значений lvalue и rvalue в следующих простых исходных строках. Поскольку это int ссылки, это означает, что назначение нецелого значения приводит к тому, что компилятор выполняет преобразование, что приводит к временной переменной. Ссылка rvalue может привязываться к временной переменной, а ссылка 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

Управляющая переменная является псевдоним для имени переменной.

Он отличается от указателей в следующих способов:

  1. Вы не можете иметь NULL ссылки. Вы всегда должны иметь возможность предположить, что ссылка связана с законной частью хранилища.
  2. Как только ссылка инициализируется объектом, ее нельзя изменить, чтобы указать на любой другой объект, тогда как в случае указателя мы можем в любой момент указать на любой другой объект.
  3. Ссылка должна быть инициализирована с момента ее создания. Указатели могут быть инициализированы в любое время.
0

Ссылочные переменные (let a), просто скажем, для простоты понимания, другое имя переменной (let x), которая имеет то же самое точное место памяти, что и x.

int &a = x; относится к тому же местоположению памяти, что и ячейка x.

Например, у двух соседей по комнате есть одна и та же комната. Имя одного из друзей - x, а другое имя - a. Если a изменяет расположение таблицы, помещенной в комнату, из позиции (x,y,z) в (x1,y1,z1), то изменения видны другим x, а также наоборот.

0

Ссылка является альтернативным именем для объекта. Контрольная переменная предоставляет псевдоним для ранее определенных переменных. Объявление ссылки состоит из базового типа & ссылочной переменной, эквивалентной имени переменной.

0

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

Объект: область памяти, которая имеет тип

переменной: Названный объект или ссылка

Ссылка: Псевдоним для другого объекта.