C ++ & ldquo; Указатель на объект & rdquo; и затем снова [дубликат]

<% //TODO: page side task %>

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

Итак, затем альтернативно: <% 'TODO: page side task for VB %>

Примечание. Опасность Arun об этом показывается только при открытой странице, что может быть причиной того, НЕТ "- это главный ответ, потому что он не полностью выполняет то, что было задано. (На самом деле это действительно просто расширяет его ответ, но у меня еще нет точек, чтобы сделать его комментарием.)

26
задан Peter Mortensen 7 July 2015 в 22:08
поделиться

13 ответов

Справочная переменная является псевдонимом для имени переменной.

Это отличается от указателей следующими способами:

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

Ссылка - это сущность, которая является псевдонимом для другого объекта .

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

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

18
ответ дан CB Bailey 17 August 2018 в 12:16
поделиться
  • 1
    Ну, а не еще переменная. Хорошо, что C ++ 0x исправляет это - это была давняя проблема в стандарте. См. open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#633 и взгляните на n3090, он уже включен в FCD. В любом случае, чтобы быть полным, вы могли бы упомянуть, что ссылки могут также ссылаться на функции. +1 для технической точности :) – Johannes Schaub - litb 4 May 2010 в 17:48
  • 2
    Извините за возобновление старого сообщения. Означает ли это, что в C ++ 11/14/17 я могу безопасно использовать термин «ссылочная переменная», когда речь идет о int& b = a? – Ilio Catallo 22 October 2015 в 09:27
  • 3
    Поскольку C ++ 11, variable означает ссылку или объект. См. [Basic] / 6 в C ++ 14, например: & quot; A переменная вводится путем объявления ссылки, отличной от нестатического элемента данных или объекта. Имя переменной, если оно есть, обозначает ссылку или объект. & Quot; – M.M 18 February 2016 в 00:51
  • 4
    Хороший ответ - любой, кто потратил много времени на grokking полностью на основе объектов (например, Python), скажет вам, что даже имя first , присвоенное объекту, является технически ссылкой :-) Сам object является безымянным, просто не имеет смысла создавать его с каким-то способом добраться до него. – paxdiablo 10 July 2017 в 05:47

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

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

И цитирование из той же статьи:

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

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

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

6
ответ дан Community 17 August 2018 в 12:16
поделиться
  • 1
    Википедия не является очень авторитетным источником. – Martin York 4 May 2010 в 16:09

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

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

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

0
ответ дан Daniel 17 August 2018 в 12:16
поделиться

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

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

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

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

3
ответ дан ExceptionSlayer 17 August 2018 в 12:16
поделиться

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

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

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

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

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
9
ответ дан Peter Mortensen 17 August 2018 в 12:16
поделиться
  • 1
    Великий faq, & quot; Используйте ссылки, когда можете, и указатели, когда вам нужно. & Quot; – Hernán Eche 4 May 2010 в 15:16

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

Ссылка имеет некоторые характеристики указателя const для объекта, поскольку он инициализируется при определении. И хотя то, что он ссылается или указывает на, может быть изменено, ссылка или указатель 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. Ссылка на rvalue была введена в C ++ 11, чтобы разрешить ссылку на временный объект, чтобы помочь с выполнением перемещения, а не с копией и некоторыми другими действиями, когда копия является неправильным подходом, но переход является правильным подходом.

Например, сравнение ссылки 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
1
ответ дан Richard Chambers 17 August 2018 в 12:16
поделиться

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

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

2
ответ дан Scott Stensland 17 August 2018 в 12:16
поделиться

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

0
ответ дан tuomastik 17 August 2018 в 12:16
поделиться

Это переменная, которая ссылается на на другую:

int foo;
int& bar = foo;

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

Для получения дополнительной информации см. здесь .

3
ответ дан Wayne Koorts 17 August 2018 в 12:16
поделиться
  • 1
    Технически нет. Если бы бар был переменной, вы могли бы получить его адрес. Ссылка является псевдонимом другой переменной (а не адресом, поскольку это подразумевает, что компилятор должен будет вставить операцию разыменования). Когда это получается скомпилированным баром, вероятно, просто заменяется на foo. – Martin York 4 May 2010 в 16:07
  • 2
    В тексте указан указатель. Ссылка не содержит места в памяти и может не требовать хранения. (В вашем примере, вероятно, bar не использует никакого хранилища). – M.M 7 July 2015 в 23:40

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

float total=100;
float &sum = total;

Это означает, что оба total и sum являются одинаковыми переменными.

cout<< total;
cout << sum;

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

13
ответ дан ЯegDwight 17 August 2018 в 12:16
поделиться

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

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

Переменная: Именованный объект или ссылка

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

0
ответ дан SLN 17 August 2018 в 12:16
поделиться
9
ответ дан Peter Mortensen 6 September 2018 в 09:01
поделиться