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

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

Войти
Регистрация
Восстановить пароль
 
Познающая
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 25
#1

Непонятки по ссылкам - C++

04.04.2013, 22:16. Просмотров 292. Ответов 4
Метки нет (Все метки)

Доброго времени суток!
Помогите, пожалуйста разобраться. Изучаю ссылки и мне кое-что не понятно.
Допустим мы объявили функцию:

C++
1
2
3
4
void RefFunction (Cat & rCat)
{
    rCat.Speak();
}
а затем ее вызываем в главной функции и передаем ей ссылку на объект:

C++
1
2
3
4
5
6
int main ()
{
Cat * ptr=new Cat;
RefFunction (* ptr);
return 0;
}
Мне не понятно, почему в строчке "RefFunction (*ptr);" мы передаем разыменнованый указатель * ptr, т. е. значение объекта, а не адрес на этот объект, содержащийся в этом указателе, ведь при объявлении ссылки мы присваиваем ей адрес объекта?
По мне, так должно было быть так:
RefFunction (ptr);
Где я ошибаюсь?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2013, 22:16     Непонятки по ссылкам
Посмотрите здесь:

C++ возврат по ссылкам
C++ непонятки
C++ Что будет выведено на экран по данным указателям и ссылкам?
Непонятки с синтаксисом C++
C++ Непонятки с wchar_t
C++ Непонятки со scanf
Непонятки с классами C++
C++ непонятки с for
Накидать задачек по ссылкам и указателям C++
Ищу литературу по созданию бота, переходящего по ссылкам C++
C++ Передача параметров по значению и по константным ссылкам применительно к шаблонам
C++ Как реализовать переход по новым ссылкам и сохранение страниц в браузере в автономном режиме?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.04.2013, 22:19     Непонятки по ссылкам #2
потому что результат выражения *ptr - это ссылка.
из ссылок могут конструироваться значения за счет конструктора копирования, который принимает константную ссылку. но это делается тогда, когда нужно. а если не нужно - то и не происходит ничего. в вашем случае функция принимает ссылку а не значение.
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.04.2013, 22:22     Непонятки по ссылкам #3
Цитата Сообщение от Познающая Посмотреть сообщение
т. е. значение объекта
Все же скорее ссылку. При разыменовании получается ссылка.
//В стандарте я подобного не видел, но так проще запомнить.
Цитата Сообщение от Познающая Посмотреть сообщение
ведь при объявлении ссылки мы присваиваем ей адрес объекта
Нет, сам объект, то есть как бы даем второе имя.

имхо, чтобы понять ссылки, нужно просто знать, что это синтаксический сахар над указателями.
Т.е. при
C++
1
2
int a = 2;
int &ref = a;
На самом деле происходит
C++
1
int *ref = &a;
А при
C++
1
2
int &ref = a;
int c = ref;
Получается
C++
1
2
int *ref = &a;
int c = *ref;
Познающая
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 25
21.04.2013, 10:01  [ТС]     Непонятки по ссылкам #4
У меня появился еще один вопрос по ссылкам в перегруженном операторе индексирования:
C++
1
2
3
4
5
6
7
char & String::operator[](int offset)
{
 if (offset>itsLen)
  return itsString[itsLen-1];
 else
  return itsString[offset];
}
где itsLen - закрытая переменная-член класса String, хранящая длину строки без нулевого символа, также данный класс содержит указатель на массив char * itsString.
Я не понимаю почему результатом выполнения этого оператора является itsString[itsLen-1] или itsString[offset], если должна возвращаться ссылка на символ, а здесь, как мне кажется, возвращается сам символ? По мне, здесь должно быть так: * itsString[itsLen-1] и * itsString[offset], если я правильно поняла предыдущее объяснение. Подскажите, пожалуйста, где я ошибаюсь?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.04.2013, 10:34     Непонятки по ссылкам #5
Возвращается ссылка на символ. itsString имеет тип char*. itsString[что-то] эквивалентно *(itsString + что-то), а *(itsString + что-то) может неявно приводиться к char, char& или const char&. Всё окей.
Yandex
Объявления
21.04.2013, 10:34     Непонятки по ссылкам
Ответ Создать тему
Опции темы

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