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

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

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

Указание типа переменной и ссылки при объявлении\инициализации - C++

04.07.2016, 11:14. Просмотров 159. Ответов 3
Метки нет (Все метки)

Здравствуйте! Возник такой вопрос-зачем нужно указывать тип ссылки при ее инициализации?
При объявлении обычной переменной, компилятору нужно знать тип этой переменной, чтобы выделить объем памяти, достаточный для хранения этой переменной, а так же при каких-либо операциях (например, деления, чтобы привести к нужному типу в случае несоответствия типов). Но зачем нужно указывать тип ссылки, если мы ссылаемся на переменную, тип которой уже заранее известен? Более того, тип объявляемой ссылки должен быть строго таким же, как и тип той переменной, на которую ссылаемся, то есть что-то типа такого не прокатит в принципе:

C++
1
2
3
4
5
6
int main()
{
   int x = 10;
   double &y = x;
   
}
Тогда зачем нужны лишние телодвижения в виде объявления типа ссылки, если мы и так прекрасно знаем, что инициализировать ссылку другим типом не удастся... Это требование стандарта или я где-то ошибаюсь?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2016, 11:14     Указание типа переменной и ссылки при объявлении\инициализации
Посмотрите здесь:

C++ как записать в переменную символьного типа (думерный массив) несколько строк, после инициализации этой переменной?
Ошибка при инициализации статистической переменной. C++
Уравнение больше реагирует на значение при инициализации переменной C++
C++ Взятие адреса у константной переменной при объявлении
Ошибка инициализации переменной заданного типа C++
C++ Для чего при инициализации переменной писать на конце числа первую букву типа?
При отладке программы вылетает окошко с ошибкой: использование переменной без инициализации C++
C++ Изменяется ли адрес или значение переменной при объявлении ее как const?
C++ Что значит * при объявлении переменной?
Ошибка при объявлении типа C++
C++ LNK2019 при объявлении переменной типа из пространства имен в структуре
Программа вылетает при объявлении переменной класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3067 / 1869 / 196
Регистрация: 13.01.2012
Сообщений: 7,110
04.07.2016, 11:31     Указание типа переменной и ссылки при объявлении\инициализации #2
kakadyi, наверное что бы перейдя на место объявления ссылки вы имели представление о типе переменной на который она ссылается. в противном случае вам нужно было бы дополнительно искать объявление переменной. и вообще это бы нарушало религию

Добавлено через 1 минуту
...однако современный стандарт в руках уставших от клавиатуры людей дрейфует к тому что вы хотите в виде ключевого слова auto как я понял
Renji
1800 / 1218 / 285
Регистрация: 05.06.2014
Сообщений: 3,501
04.07.2016, 11:33     Указание типа переменной и ссылки при объявлении\инициализации #3
Цитата Сообщение от kakadyi Посмотреть сообщение
Здравствуйте! Возник такой вопрос-зачем нужно указывать тип ссылки при ее инициализации?
Затем, что в C++98 еще не придумали автоматический вывод типов. Пишите auto&y=x; и будет вам счастье (но нужен C++11).
Ну и не исключен случай что x у вас потомок, а вам позарез нужна ссылка на предка. Тогда тип ссылки придется писать явно.
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
04.07.2016, 11:33     Указание типа переменной и ссылки при объявлении\инициализации #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kakadyi Посмотреть сообщение
Более того, тип объявляемой ссылки должен быть строго таким же, как и тип той переменной, на которую ссылаемся, то есть что-то типа такого не прокатит в принципе
Что-то типа такого не прокатит совершенно по другой причине. Временный объект, который получается при неявном преобразовании int->double можно привязывать только к ссылке на константу или rvalue-ссылке.
C++
1
2
3
4
5
6
int main()
{
   int x = 10;
   double const & y = x; //ok
   double && y1 = x; //ok
}
Кроме того, есть еще явные и неявные преобразования типов ссылок на классы в иерархии, где тип ссылки может отличаться от типа правостороннего выражения.
C++
1
2
3
4
5
6
7
8
class A {}
class B : public A {};
 
int main()
{
    B b;
    A & x = b;
}
Кроме того, есть еще возможность писать пользовательские операторы преобразования, которые тоже используют левосторонний тип для выполнения нужного преобразования.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct B
{
    operator int &()
    {
         return a;
    }
    int a;
};
 
int main()
{
    B b;
 
    int & a = b;
}
В тех же случаях, где тип правостороннего выражения точно определяет тип ссылки, вполне можно пользоваться ключевым словом auto из С++11.
Yandex
Объявления
04.07.2016, 11:33     Указание типа переменной и ссылки при объявлении\инициализации
Ответ Создать тему
Опции темы

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