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

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

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
30.07.2015, 19:18 #2
1) s располагается по тому же адресу что и d.
2) Чтобы за отведённые пределы размера не вылезти. Очевидно же.
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
30.07.2015, 19:41 #3
Цитата Сообщение от mozart_45 Посмотреть сообщение
как работает почему их типы должны быть одинаковы?
s работает как указатель на d, который всегда разыменован (*s). И никому типы одинаковыми быть не должны. Если s - ссылка на тип parent, то d может быть любым потомком этого parent. int и double потомками друг друга не являются, так что с ними фокус не работает.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:10 #5
Цитата Сообщение от Enno Посмотреть сообщение
1) s располагается по тому же адресу что и d.
Не надо додумывать. В стандарте и так много чего написано, так что не надо приписывать ему лишнего.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 20:16 #6
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 20:26 #7
Цитата Сообщение от castaway Посмотреть сообщение
Mr.X, разве они не имеют один и тот же адрес? Мой компилятор солидарен с моей логикой и говорит обратное.
Стандарт этого не требует. Обычно это так реализовано, но если кто-то реализует по-другому - стандарт не будет против. При некоторых оптимизациях во время исполнения вообще не существует объекта, представляющего ссылку.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 21:35 #9
Цитата Сообщение от castaway Посмотреть сообщение
Т.е. в хотите сказать, что следующий код может работать по-разному на разных компиляторах?
По стандарту ссылка не является объектом, над которым можно производить операции. Все операции, применяемые к ссылке, на самом деле применяются к объекту, на который она ссылается. Естественно, что адрес объекта, полученный через его первое имя и через ссылку совпадет. но из этого не следует, что ссылка обязательно должна быть реализована как разыменованный указатель.
По определению ссылка - это синоним или альтернативное имя объекта. Это определение полное и отсюда следуют все ее свойства. Если мы будем определять ее через эти свойства - то перепутаем причину со следствием.
2
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 21:58 #10
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2015, 22:46 #11
Цитата Сообщение от castaway Посмотреть сообщение
Честно говоря, я просто хотел услышать ответ на свой вопрос. Вы можете на него ответить?
Так я вроде бы довольно подробно ответил.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 23:16 #12
Цитата Сообщение от Mr.X Посмотреть сообщение
Так я вроде бы довольно подробно ответил.
Да, Вы подробно ответили, но не на мой вопрос.
0
Croessmah
Эксперт CЭксперт С++
13206 / 7477 / 840
Регистрация: 27.09.2012
Сообщений: 18,388
Записей в блоге: 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
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
31.07.2015, 15:17 #14
Цитата Сообщение от Renji Посмотреть сообщение
И никому типы одинаковыми быть не должны.
Тут стоит заметить, что тип и класс это разные понятия. В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
На эту тему обсуждение на stackoverflow.
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
31.07.2015, 16:04 #15
Цитата Сообщение от Tulosba Посмотреть сообщение
В случае с иерархией классов, тип экземпляра производного класса является так же и типом базового класса.
Постой. А если класс наследует закрыто?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 16:04
Привет! Вот еще темы с ответами:

Как работают эти 2 функции - C++
Помогите пожалуйста разобраться. Я уже 3 день не могу разобраться. Суть в том что есть структура и 5 функций EnterAutos(); SaveToFile();...

Не понятно как работают функции - 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++
Люди объясните плиз как работают побитовые сдвиги &lt;&lt; и &gt;&gt;, а то что то совсем запарился :confused:

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.07.2015, 16:04
Ответ Создать тему
Опции темы

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