Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kakadyi
0 / 0 / 0
Регистрация: 30.06.2016
Сообщений: 7
1

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

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

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

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

LNK2019 при объявлении переменной типа из пространства имен в структуре
Доброго времени суток! Возникла такая проблема , при использовании типа...

Для чего при инициализации переменной писать на конце числа первую букву типа?
Например, long long a=123456789123344LL чем будет отличаться от long...

Ошибка инициализации переменной заданного типа
Ошибка в 45ой и 59ой строках. Подскажите, как все-же правильно инициализировать...

Ошибка при объявлении типа
Как устранить ошибку? class B; class A { public: B getB() { return...

Что значит * при объявлении переменной?
Пытаюсь разобраться в коде, предоставленном сторонними разработчиками в...

3
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
04.07.2016, 11:31 2
kakadyi, наверное что бы перейдя на место объявления ссылки вы имели представление о типе переменной на который она ссылается. в противном случае вам нужно было бы дополнительно искать объявление переменной. и вообще это бы нарушало религию

Добавлено через 1 минуту
...однако современный стандарт в руках уставших от клавиатуры людей дрейфует к тому что вы хотите в виде ключевого слова auto как я понял
1
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,524
04.07.2016, 11:33 3
Цитата Сообщение от kakadyi Посмотреть сообщение
Здравствуйте! Возник такой вопрос-зачем нужно указывать тип ссылки при ее инициализации?
Затем, что в C++98 еще не придумали автоматический вывод типов. Пишите auto&y=x; и будет вам счастье (но нужен C++11).
Ну и не исключен случай что x у вас потомок, а вам позарез нужна ссылка на предка. Тогда тип ссылки придется писать явно.
1
DrOffset
9013 / 4860 / 1196
Регистрация: 30.01.2014
Сообщений: 7,942
04.07.2016, 11:33 4
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Цитата Сообщение от 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.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2016, 11:33

Программа вылетает при объявлении переменной класса
При создании переменной класса tree программа вылетает. Не понимаю, в чём дело....

Взятие адреса у константной переменной при объявлении
Можно пример?

как записать в переменную символьного типа (думерный массив) несколько строк, после инициализации этой переменной?
как записать в переменную символьного типа (думерный массив) несколько строк,...


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

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

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