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

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

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

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

04.07.2016, 11:14. Просмотров 198. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указание типа переменной и ссылки при объявлении\инициализации (C++):

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

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

Ошибка инициализации переменной заданного типа - C++
Ошибка в 45ой и 59ой строках. Подскажите, как все-же правильно инициализировать переменную t типа "rabotnik"? /* Исходный список...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,526
04.07.2016, 11:31 #2
kakadyi, наверное что бы перейдя на место объявления ссылки вы имели представление о типе переменной на который она ссылается. в противном случае вам нужно было бы дополнительно искать объявление переменной. и вообще это бы нарушало религию

Добавлено через 1 минуту
...однако современный стандарт в руках уставших от клавиатуры людей дрейфует к тому что вы хотите в виде ключевого слова auto как я понял
1
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
04.07.2016, 11:33 #3
Цитата Сообщение от kakadyi Посмотреть сообщение
Здравствуйте! Возник такой вопрос-зачем нужно указывать тип ссылки при ее инициализации?
Затем, что в C++98 еще не придумали автоматический вывод типов. Пишите auto&y=x; и будет вам счастье (но нужен C++11).
Ну и не исключен случай что x у вас потомок, а вам позарез нужна ссылка на предка. Тогда тип ссылки придется писать явно.
1
DrOffset
7153 / 4294 / 968
Регистрация: 30.01.2014
Сообщений: 7,096
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.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2016, 11:33
Привет! Вот еще темы с ответами:

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

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

Ошибка компилятора при объявлении переменной в другом файле - C++
Здравствуйте, подскажи пожалуйста почему возникает ошибка ||error: ld returned 1 exit status| Моя программа: main.cpp #include...

Изменяется ли адрес или значение переменной при объявлении ее как const? - C++
При объявлении const у нас значение переменной или адрес переменной не изменяется?


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

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

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