Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
mozart_45
1 / 1 / 5
Регистрация: 21.07.2015
Сообщений: 42
#1

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

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

1 Здравствуйте маленький вопрос?
int d;
int &s=d;
как работает почему их типы должны быть одинаковы?
http://www.cyberforum.ru/cpp-beginners/thread1753127.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2015, 19:03
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как работают ссылки (C++):

Не пойму как работают ссылки внутри объекта
Вот например есть у меня класс /*Hero.h*/ #include <iostream> using...

Зачем нужны rvalue ссылки, если есть универсальные ссылки
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue...

Как работают списки и как их создать вообще?
Уважаемые программисты, помоги разобраться как работают списки и как их создать...

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

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

22
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
30.07.2015, 19:18 #2
1) s располагается по тому же адресу что и d.
2) Чтобы за отведённые пределы размера не вылезти. Очевидно же.
0
Renji
2124 / 1483 / 453
Регистрация: 05.06.2014
Сообщений: 4,320
30.07.2015, 19:41 #3
Цитата Сообщение от mozart_45 Посмотреть сообщение
как работает почему их типы должны быть одинаковы?
s работает как указатель на d, который всегда разыменован (*s). И никому типы одинаковыми быть не должны. Если s - ссылка на тип parent, то d может быть любым потомком этого parent. int и double потомками друг друга не являются, так что с ними фокус не работает.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 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;
}
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:10 #5
Цитата Сообщение от Enno Посмотреть сообщение
1) s располагается по тому же адресу что и d.
Не надо додумывать. В стандарте и так много чего написано, так что не надо приписывать ему лишнего.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 20:16 #6
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:26 #7
Цитата Сообщение от castaway Посмотреть сообщение
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
Стандарт этого не требует. Обычно это так реализовано, но если кто-то реализует по-другому - стандарт не будет против. При некоторых оптимизациях во время исполнения вообще не существует объекта, представляющего ссылку.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 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-я строка.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 21:35 #9
Цитата Сообщение от castaway Посмотреть сообщение
Т.е. в хотите сказать, что следующий код может работать по-разному на разных компиляторах?
По стандарту ссылка не является объектом, над которым можно производить операции. Все операции, применяемые к ссылке, на самом деле применяются к объекту, на который она ссылается. Естественно, что адрес объекта, полученный через его первое имя и через ссылку совпадет. но из этого не следует, что ссылка обязательно должна быть реализована как разыменованный указатель.
По определению ссылка - это синоним или альтернативное имя объекта. Это определение полное и отсюда следуют все ее свойства. Если мы будем определять ее через эти свойства - то перепутаем причину со следствием.
2
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 21:58 #10
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 22:46 #11
Цитата Сообщение от castaway Посмотреть сообщение
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
Так я вроде бы довольно подробно ответил.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 23:16 #12
Цитата Сообщение от Mr.X Посмотреть сообщение
Так я вроде бы довольно подробно ответил.
Да, Вы подробно ответили, но не на мой вопрос.
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 3
Завершенные тесты: 1
31.07.2015, 14:03 #13
castaway, Mr.X имеет ввиду, что
C++
1
2
int a = 0 ; //объект
int & b = a ; //ссылка
объект и ссылка - это две разных сущности, а значит и располагаются они по разным адресам. Но, ссылка может быть вообще выпилена из кода и не занимать места, она может быть именно синонимом, а может и не быть, например, если инициализируется, в зависимости от каких-то условий, разными объектами.

Что касается this != &a, то при обращении к ссылке, Вы обращаетесь к объекту, на который "ссылается" ссылка "a" и берете адрес этого объекта, а не адрес ссылки. Посмотрите выхлоп на асме, скорее всего, ссылка будет реализована через указатель (если, конечно же, компилятор не заинлайнит вызов) и не будет выпилена, так что можно сказать, что в данном случае у ссылки "свой адрес".
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
31.07.2015, 15:17 #14
Цитата Сообщение от Renji Посмотреть сообщение
И никому типы одинаковыми быть не должны.
Тут стоит заметить, что тип и класс это разные понятия. В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
На эту тему обсуждение на stackoverflow.
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
31.07.2015, 16:04 #15
Цитата Сообщение от Tulosba Посмотреть сообщение
В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
Постой. А если класс наследует закрыто?
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
31.07.2015, 16:15 #16
Цитата Сообщение от mozart_45 Посмотреть сообщение
почему их типы должны быть одинаковы?
потому что это синоним. Вот смотри, есть животное гипопотам, а теперь приходишь ты и говоришь: а теперь бегемот - синоним гипопотама. Бегемот с какого то перепугу будет запахом?

Добавлено через 1 минуту
Цитата Сообщение от Enno Посмотреть сообщение
2) Чтобы за отведённые пределы размера не вылезти. Очевидно же.
А вот фиг.
C++
1
2
3
4
5
6
union n
{
 float f;
 double d;
 folat r[300];
};
. Ни кому ни несовпадение типов, ни вылез за границы другого поля не мешает.

Добавлено через 42 секунды
Цитата Сообщение от Renji Посмотреть сообщение
s работает как указатель на d, который всегда разыменован (*s).
Ведёт себя действительно так. Но ни какой гарантии такой реализации нет.

Добавлено через 3 минуты
Цитата Сообщение от Enno Посмотреть сообщение
1) s располагается по тому же адресу что и d.
s может быть и дефолтно-разыменованным указателем. И даже сущностью, все изменения которой перехватываются копировщиком, который и копирует s по адресу d. Или вообще той же физической ячейкой памяти, но отображённой на другой адрес.

Добавлено через 31 секунду
Цитата Сообщение от Renji Посмотреть сообщение
И никому типы одинаковыми быть не должны.
Энто с какого?

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
Компилятор лишь говорит, как он это реализовал. Да и то не полностью.
0
hoggy
Заблокирован
31.07.2015, 16:16 #17
Цитата Сообщение от Croessmah Посмотреть сообщение
объект и ссылка - это две разных сущности
согласно стандарту языка:
сущность только одна.
ссылка - её альтернативное имя, и не более того.

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

другое дело, что средствами языка, вся эта "кухня компилятора" не доступна.

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

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

ну и дальше:
попытка взять размер ссылки - взятие размера оригинального объекта.
и тд.
0
Tulosba
31.07.2015, 16:21
  #18

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
на эту сущность не детонирует.
не торопись ты так в написании текстов, а то часто слишком диструктор детонирует

0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
31.07.2015, 16:23 #19
Цитата Сообщение от Tulosba Посмотреть сообщение
В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
Нет. Нет и не может быть ни какого "типа класса", "класса типа" и вообще "типа типа". Это даже не масло маслянное, а масло самого мала даже без "из". Фактический тип экземпляра производного класса - сам производный класс. Но одновременно он представляет подвид экземпляра базового класса и в этом качестве его тип - базовый класс, как над категория производного класса. Это как человек - тоже животное, только разумное, а ещё это млекопитающее, позвоночное, многоклеточное и много кого ещё, но фактический его тип - хомо сапиенс.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
31.07.2015, 18:19 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
тип и класс это разные понятия
Страуструп разделяет типы на конкретные (в том числе встроенные) и абстрактные. Класс может быть как конкретным типом, так и абстрактным. Еще он выделяет так называемые узловые классы, которые и не конкретные, и не абстрактные.
0
31.07.2015, 18:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 18:19
Привет! Вот еще темы с решениями:

Как работают итераторы в векторе?
Доброго времени суток, нужно удалить i-й элемент вектора, в нем есть функция...

Как работают файлы-контейнеры?
Не знаю, как правильно сформулировать. Некоторые крупные программы использует...

Односвязные списки: как работают?
Здрасте всем! Есть такой вот односвязный список, объясните пожалуйста, как...

Не понятно как работают функции
bool isstrprint (const char s) { int i = -1, ls = strlen(s); bool rc =...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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