С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для mozart_45
1 / 1 / 0
Регистрация: 21.07.2015
Сообщений: 42

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

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

Студворк — интернет-сервис помощи студентам
1 Здравствуйте маленький вопрос?
int d;
int &s=d;
как работает почему их типы должны быть одинаковы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2015, 19:03
Ответы с готовыми решениями:

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

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

Как работают ссылки в PHP
Обсуждение статьи Как работают ссылки в PHP От автора Данная статья предназначена для тех программистов, кто имеет опыт...

22
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
30.07.2015, 19:18
1) s располагается по тому же адресу что и d.
2) Чтобы за отведённые пределы размера не вылезти. Очевидно же.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.07.2015, 19:41
Цитата Сообщение от mozart_45 Посмотреть сообщение
как работает почему их типы должны быть одинаковы?
s работает как указатель на d, который всегда разыменован (*s). И никому типы одинаковыми быть не должны. Если s - ссылка на тип parent, то d может быть любым потомком этого parent. int и double потомками друг друга не являются, так что с ними фокус не работает.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.07.2015, 19:44
Самое название "ссылка" говорит о том, что она на что-то ссылается.
Её можно представить как неявный указатель, который не нужно разименовывать.
Её можно представить как альтернативное имя переменной.

Обычно ссылки используют для одинаковых типов, но если извратиться, то можно сослаться и на другой тип.
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
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:10
Цитата Сообщение от Enno Посмотреть сообщение
1) s располагается по тому же адресу что и d.
Не надо додумывать. В стандарте и так много чего написано, так что не надо приписывать ему лишнего.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.07.2015, 20:16
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:26
Цитата Сообщение от castaway Посмотреть сообщение
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
Стандарт этого не требует. Обычно это так реализовано, но если кто-то реализует по-другому - стандарт не будет против. При некоторых оптимизациях во время исполнения вообще не существует объекта, представляющего ссылку.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.07.2015, 21:20
Цитата Сообщение от 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
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 21:35
Цитата Сообщение от castaway Посмотреть сообщение
Т.е. в хотите сказать, что следующий код может работать по-разному на разных компиляторах?
По стандарту ссылка не является объектом, над которым можно производить операции. Все операции, применяемые к ссылке, на самом деле применяются к объекту, на который она ссылается. Естественно, что адрес объекта, полученный через его первое имя и через ссылку совпадет. но из этого не следует, что ссылка обязательно должна быть реализована как разыменованный указатель.
По определению ссылка - это синоним или альтернативное имя объекта. Это определение полное и отсюда следуют все ее свойства. Если мы будем определять ее через эти свойства - то перепутаем причину со следствием.
2
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.07.2015, 21:58
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 22:46
Цитата Сообщение от castaway Посмотреть сообщение
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
Так я вроде бы довольно подробно ответил.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.07.2015, 23:16
Цитата Сообщение от Mr.X Посмотреть сообщение
Так я вроде бы довольно подробно ответил.
Да, Вы подробно ответили, но не на мой вопрос.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
31.07.2015, 14:03
castaway, Mr.X имеет ввиду, что
C++
1
2
int a = 0 ; //объект
int & b = a ; //ссылка
объект и ссылка - это две разных сущности, а значит и располагаются они по разным адресам. Но, ссылка может быть вообще выпилена из кода и не занимать места, она может быть именно синонимом, а может и не быть, например, если инициализируется, в зависимости от каких-то условий, разными объектами.

Что касается this != &a, то при обращении к ссылке, Вы обращаетесь к объекту, на который "ссылается" ссылка "a" и берете адрес этого объекта, а не адрес ссылки. Посмотрите выхлоп на асме, скорее всего, ссылка будет реализована через указатель (если, конечно же, компилятор не заинлайнит вызов) и не будет выпилена, так что можно сказать, что в данном случае у ссылки "свой адрес".
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.07.2015, 15:17
Цитата Сообщение от Renji Посмотреть сообщение
И никому типы одинаковыми быть не должны.
Тут стоит заметить, что тип и класс это разные понятия. В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
На эту тему обсуждение на stackoverflow.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
31.07.2015, 16:04
Цитата Сообщение от Tulosba Посмотреть сообщение
В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
Постой. А если класс наследует закрыто?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
31.07.2015, 16:15
Цитата Сообщение от 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
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.07.2015, 16:16
Цитата Сообщение от Croessmah Посмотреть сообщение
объект и ссылка - это две разных сущности
согласно стандарту языка:
сущность только одна.
ссылка - её альтернативное имя, и не более того.

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

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

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

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

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

Не по теме:

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

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
31.07.2015, 16:23
Цитата Сообщение от Tulosba Посмотреть сообщение
В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
Нет. Нет и не может быть ни какого "типа класса", "класса типа" и вообще "типа типа". Это даже не масло маслянное, а масло самого мала даже без "из". Фактический тип экземпляра производного класса - сам производный класс. Но одновременно он представляет подвид экземпляра базового класса и в этом качестве его тип - базовый класс, как над категория производного класса. Это как человек - тоже животное, только разумное, а ещё это млекопитающее, позвоночное, многоклеточное и много кого ещё, но фактический его тип - хомо сапиенс.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.07.2015, 18:19
Цитата Сообщение от Tulosba Посмотреть сообщение
тип и класс это разные понятия
Страуструп разделяет типы на конкретные (в том числе встроенные) и абстрактные. Класс может быть как конкретным типом, так и абстрактным. Еще он выделяет так называемые узловые классы, которые и не конкретные, и не абстрактные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2015, 18:19
Помогаю со студенческими работами здесь

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

Как работают ссылки на динамическую память?
Добрый день =) Помогите, пожалуйста, разобраться с работой указателей. Я просто прочитала уже несколько статей по теме и две методички,...

Ссылки на вайбер и телегу, на сайте не работают как надо
Привет. Собственно есть сайт https://spring-perevod.com/ прямо в шапке добавил ссылки на вайбер и телеграмм. Телега &lt;p...

Как работают ссылки типа <a href=news.php?1> </a>
как работают ссылки: &lt;a href=news.php?1&gt; &lt;/a&gt; &lt;a href=news.php?2&gt; &lt;/a&gt;ну и так далее. Если можно объясните! или подскажите где...

Как работают "мягкие" ссылки?
Если из шелла открывать/читать символическую ссылку, то чтение будет из того файла, на который указывает ссылка. А если открыть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru