Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
mozart_45
1 / 1 / 0
Регистрация: 21.07.2015
Сообщений: 42
#1

Как работают ссылки - C++

30.07.2015, 19:03. Просмотров 600. Ответов 22
Метки нет (Все метки)

1 Здравствуйте маленький вопрос?
int d;
int &s=d;
как работает почему их типы должны быть одинаковы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2015, 19:03     Как работают ссылки
Посмотрите здесь:

Как работают ссылки и указатели? - C++
Не нашел описание того, почему именно так работает, везде говорится только то, что так надо делать и все Аргумент функции является...

Не пойму как работают ссылки внутри объекта - C++
Вот например есть у меня класс /*Hero.h*/ #include <iostream> using namespace std; class Hero{ public: void...

Как работают списки и как их создать вообще? - C++
Уважаемые программисты, помоги разобраться как работают списки и как их создать вообще! Я ищу информацию, ищу, но ничего мне не помогает....

Как работают драйвера? - C++
Разбираю драйвер-фильтр passthru, в нем есть функция MPSend которая получает а затем отсылает пакет далее (это пример ничего не делающего...

Как работают циклы? - C++
Мне нужно написать программу, выполняющую следующие действия: 1. Ввести две строки текста с подсказками при вводе; 2. Определить и...

Как работают файлы-контейнеры? - C++
Не знаю, как правильно сформулировать. Некоторые крупные программы использует файлы (которые хранят в себе большое количество других...

Как работают побитовые сдвиги? - C++
Люди объясните плиз как работают побитовые сдвиги << и >>, а то что то совсем запарился :confused:

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
30.07.2015, 19:18     Как работают ссылки #2
1) s располагается по тому же адресу что и d.
2) Чтобы за отведённые пределы размера не вылезти. Очевидно же.
Renji
1878 / 1276 / 290
Регистрация: 05.06.2014
Сообщений: 3,642
30.07.2015, 19:41     Как работают ссылки #3
Цитата Сообщение от mozart_45 Посмотреть сообщение
как работает почему их типы должны быть одинаковы?
s работает как указатель на d, который всегда разыменован (*s). И никому типы одинаковыми быть не должны. Если s - ссылка на тип parent, то d может быть любым потомком этого parent. int и double потомками друг друга не являются, так что с ними фокус не работает.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 19:44     Как работают ссылки #4
Самое название "ссылка" говорит о том, что она на что-то ссылается.
Её можно представить как неявный указатель, который не нужно разименовывать.
Её можно представить как альтернативное имя переменной.

Обычно ссылки используют для одинаковых типов, но если извратиться, то можно сослаться и на другой тип.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <cstdint>
#include <iostream>
 
int main()
{
    uint32_t a = 0x80000000;
    float & f = *((float *)&a);
 
    std::cout << a << std::endl;
    std::cout << f << std::endl;
 
    return 0;
}
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:10     Как работают ссылки #5
Цитата Сообщение от Enno Посмотреть сообщение
1) s располагается по тому же адресу что и d.
Не надо додумывать. В стандарте и так много чего написано, так что не надо приписывать ему лишнего.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 20:16     Как работают ссылки #6
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:26     Как работают ссылки #7
Цитата Сообщение от castaway Посмотреть сообщение
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
Стандарт этого не требует. Обычно это так реализовано, но если кто-то реализует по-другому - стандарт не будет против. При некоторых оптимизациях во время исполнения вообще не существует объекта, представляющего ссылку.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 21:20     Как работают ссылки #8
Цитата Сообщение от Mr.X Посмотреть сообщение
Стандарт этого не требует. Обычно это так реализовано, но если кто-то реализует по-другому - стандарт не будет против.
Т.е. в хотите сказать, что следующий код может работать по-разному на разных компиляторах?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class A {
    int m_i;
 
public:
    A( int i ) : m_i( i ) {}
    A & operator = ( const A & a ) {
        if ( this != &a ) {
            m_i = a.m_i;
        }
        return *this;
    }
};
 
int main()
{
    A a( 1 );
    A b( 2 );
    a = b;
    a = a;
    return 0;
}
Добавлено через 10 минут
Ключевой момент - 9-я строка.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 21:35     Как работают ссылки #9
Цитата Сообщение от castaway Посмотреть сообщение
Т.е. в хотите сказать, что следующий код может работать по-разному на разных компиляторах?
По стандарту ссылка не является объектом, над которым можно производить операции. Все операции, применяемые к ссылке, на самом деле применяются к объекту, на который она ссылается. Естественно, что адрес объекта, полученный через его первое имя и через ссылку совпадет. но из этого не следует, что ссылка обязательно должна быть реализована как разыменованный указатель.
По определению ссылка - это синоним или альтернативное имя объекта. Это определение полное и отсюда следуют все ее свойства. Если мы будем определять ее через эти свойства - то перепутаем причину со следствием.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 21:58     Как работают ссылки #10
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 22:46     Как работают ссылки #11
Цитата Сообщение от castaway Посмотреть сообщение
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
Так я вроде бы довольно подробно ответил.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 23:16     Как работают ссылки #12
Цитата Сообщение от Mr.X Посмотреть сообщение
Так я вроде бы довольно подробно ответил.
Да, Вы подробно ответили, но не на мой вопрос.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
31.07.2015, 14:03     Как работают ссылки #13
castaway, Mr.X имеет ввиду, что
C++
1
2
int a = 0 ; //объект
int & b = a ; //ссылка
объект и ссылка - это две разных сущности, а значит и располагаются они по разным адресам. Но, ссылка может быть вообще выпилена из кода и не занимать места, она может быть именно синонимом, а может и не быть, например, если инициализируется, в зависимости от каких-то условий, разными объектами.

Что касается this != &a, то при обращении к ссылке, Вы обращаетесь к объекту, на который "ссылается" ссылка "a" и берете адрес этого объекта, а не адрес ссылки. Посмотрите выхлоп на асме, скорее всего, ссылка будет реализована через указатель (если, конечно же, компилятор не заинлайнит вызов) и не будет выпилена, так что можно сказать, что в данном случае у ссылки "свой адрес".
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
31.07.2015, 15:17     Как работают ссылки #14
Цитата Сообщение от Renji Посмотреть сообщение
И никому типы одинаковыми быть не должны.
Тут стоит заметить, что тип и класс это разные понятия. В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
На эту тему обсуждение на stackoverflow.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 16:04     Как работают ссылки
Еще ссылки по теме:

как работают эти 4 функции - C++
Подскажите как работают эти 4 функции CTime CTime::operator ++() CTime CTime::operator --() CTime CTime::operator ++(int) CTime...

Как работают рекурсивные вызовы? - C++
здравствуйте. можете объяснить как работают рекурсивные вызовы. например : 1. когда вызывается дважды, что при этом происходит. что...

ifstream: как работают операторы << и >>? - C++
Объясните, пожалуйста, языком &quot;ребенка&quot;, как они работают? Не доходит! Не понятно, как в этом цикле иттерирует объект: ...

Не понятно как работают функции - C++
bool isstrprint (const char s) { int i = -1, ls = strlen(s); bool rc = true; if (s != 0x00) { while (i &lt;= ls &amp;&amp;...

Как работают указатели с массивами - C++
Хочу на простом примере перестановки двух элементов уяснить - как работают указатели с массивами, но ничего не получается. Объясните на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
31.07.2015, 16:04     Как работают ссылки #15
Цитата Сообщение от Tulosba Посмотреть сообщение
В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
Постой. А если класс наследует закрыто?
Yandex
Объявления
31.07.2015, 16:04     Как работают ссылки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru