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

Передача в функцию - ссылки, указатели, константы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
16.06.2013, 23:18     Передача в функцию - ссылки, указатели, константы #1
Вот программа:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
 
 void fun(int &rhs) 
{
rhs++;
}
 
int main()
{
int var = 2;
        
fun(var);
 
std::cout << var << "\n";
    
system("pause");
return 0;
}


В строке 10 я создаю переменную var и присваиваю ей значение 2, т.е. допустим по адресу 0001 у меня располагается значение 2
В строке 12 я передаю var в виде ссылке в функцию, где она получает новое имя (временное имя, псевдоним) - rhs, значение rhs располагается по тому же адресу что и var - 0001.
В строке 5 я прибавляю 1 к rhs и по адресу 0001 меняется значение с 2 на 3.

по этому в строке 14 мне выведет на экран 3, а не 2.

Вопрос, а что происходит, как работает следующая программа:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
 
 int & fun(int rhs) 
{
rhs++;
 
return rhs;
}
 
int main()
{
int varOne = 2;
int varTwo;
        
varTwo = fun(varOne);
 
std::cout << varTwo << "\n";
    
system("pause");
return 0;
}


В частности меня интересует какую роль выполняет оператор & в строке 3 и чем отличается такая же программа без &.

Распишите по возможности так, как я описывал первую программу, что бы не оставалось вопрос, что бы не пришлось переспрашивать.

Это первый вопрос в этой теме, дальше я буду добавлять вопросы, про указатели константы и т.д. так что если что, смотрите последние сообщения, а не первое.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 23:18     Передача в функцию - ссылки, указатели, константы
Посмотрите здесь:

Ссылки или указатели (Написать функцию , которая вычисляет гипотенузу, площадь и периметр прямоугольного треугольника) C++
Указатели и массивы. Передача массива в функцию по указателю C++
как лучше передавать значения в функцию? ссылки vs указатели C++
Ссылки и указатели на функцию C++
Передача в функцию через указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 15:17     Передача в функцию - ссылки, указатели, константы #21
Цитата Сообщение от VLK Посмотреть сообщение
Есть 2 переменных - varOne, допустим она находится по адресу 0001 и varTwo которая находится по адресу 0002, когда начинается выполнение функции (fun) то мы создаем копию переменной varOne, имя этой копии D и располагается она по адресу 0003, и то, что мы возвращаем является константным значением, т.е. переменная расположенная по адресу 0003 является константной, но она становится константной только тогда когда мы ее возвращаем, т.е. до строчки 6 (return D) я могу с этим D делать все что угодно, а далее, в строчках 7 и 14 переменная расположенная в 0003 является константной, соответственно после строчки 14 переменная по адресу 0003 будет уничтожена, по этому данная запись бесполезна?
да

Цитата Сообщение от VLK Посмотреть сообщение
компилятор выдаст ошибку?
возьми да проверь, что за манера спрашивать то что можно узнать самому
Кликните здесь для просмотра всего текста
да, выдаст


Добавлено через 31 секунду
Цитата Сообщение от VLK Посмотреть сообщение
Вот дописал программу - класс
программа не класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,409
19.06.2013, 15:50     Передача в функцию - ссылки, указатели, константы #22
Тут уже озвучили, что привязка временного объекта к ссылке на const в стеке продлевает время жизни объекта на время существования данной ссылки?
Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int fun(int rhs)
{
    rhs++;
 
    return rhs;
}
 
int main()
{
    int varOne = 2;
 
    const int& varTwo = fun(varOne);
 
    std::cout << varTwo << "\n";
 
    return 0;
}
абсолютно корректно. А вот то, что привел Olivеr настоящий UB, просто по счастливой случайности данные в том участке памяти, где сидела локальная переменная не изменились. Ну вроде это уже и без меня озвучили, мне поворчать охота)
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.06.2013, 15:51     Передача в функцию - ссылки, указатели, константы #23
C++
1
int & fun(int rhs) { rhs++; return rhs; }
int& означает что ты возвращает ссылку на локальную переменную которая создана в функции rhs.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
19.06.2013, 16:19     Передача в функцию - ссылки, указатели, константы #24
Цитата Сообщение от MrGluck Посмотреть сообщение
абсолютно корректно. А вот то, что привел Olivеr настоящий UB, просто по счастливой случайности данные в том участке памяти, где сидела локальная переменная не изменились. Ну вроде это уже и без меня озвучили, мне поворчать охота)

Не по теме:

Так это ж в учебных целях.
VLK никак не понимал, что происходит когда возвращается ссылка. И я уже писал, что ссылка на временный объект - плохая примета



Добавлено через 4 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int fun(int rhs)
{
    rhs++;
 
    return rhs;
}
 
int main()
{
    int varOne = 2;
 
    const int& varTwo = fun(varOne);
 
    std::cout << varTwo << "\n";
 
    return 0;
}
Корректен, но здесь будет копирование.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
19.06.2013, 16:33  [ТС]     Передача в функцию - ссылки, указатели, константы #25
Цитата Сообщение от Olivеr Посмотреть сообщение
И я уже писал, что ссылка на временный объект - плохая примета
Ну что я могу сделать, если почти в каждом примере в книге по которой я учусь (опустим тот момент хорошая она или плохая, и стоит ли мне учится тогда по другой книге, сойдемся на том, что я ее более менее понимаю) есть подобные записи типа int & fun(int rhs)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,409
19.06.2013, 16:52     Передача в функцию - ссылки, указатели, константы #26
VLK, будете прекрасно проходить быдлокод, а потом потратите в 3 раза больше сил на то, чтобы переучиться. Читайте нормальную литературу. Дейтелов "Как программировать на С++", Страуструпа, на крайний случай "С++ для чайников", она правда старовата уже, но их всех книг, что я читал, там самым понятным текстом объясняется. После неё все же стоило бы прочитать одного из кандидатов выше.

А книгу сжечь, проведя ритуальные танцы вокруг костра с отбивкой в барабан, ожерельем из кокосов и перьями индейцев на голове.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
19.06.2013, 22:57  [ТС]     Передача в функцию - ссылки, указатели, константы #27
Я изначально учил по книге Дейтелов "Как программировать на С++" - все закончилось печально, я не понимал половину того, что там пишут, и чем дальше, тем больше эта половина превращалось во "все".
Сейчас изучаю по книге Джесс Либерти - Освой самостоятельно C++ за 21 день, там 90% материала написано доступно.

И по поводу переучивания, лично я когда закончу с Джесс Либерти, еще раз все повторю, закреплю по книгам Страуструпа, хотя говорят что если ты разбираешься в C++, то все равно сложно понять что пишет этот Страуструп, если не получится по нему то по Дейтелу.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 23:08     Передача в функцию - ссылки, указатели, константы #28
Цитата Сообщение от VLK Посмотреть сообщение
Сейчас изучаю по книге Джесс Либерти - Освой самостоятельно C++ за 21 день, там 90% материала написано доступно.
если бы было доступно, то не возникло бы вопросов
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.06.2013, 23:14     Передача в функцию - ссылки, указатели, константы #29
Цитата Сообщение от VLK Посмотреть сообщение
И по поводу переучивания, лично я когда закончу с Джесс Либерти, еще раз все повторю, закреплю по книгам Страуструпа, хотя говорят что если ты разбираешься в C++, то все равно сложно понять что пишет этот Страуструп, если не получится по нему то по Дейтелу.
Да Страуструпа не бери 100% не пойдет, лучше уже после Дейтелов. Да лучше Дейтелов книги по С++ я еще не видел. (Хотя я только одну книгу по С++ прочитал Дейтела )
Да Дейтелы золотая книга я самостоятельно по ней разобрался и очень все хорошо описано, да и примеры кода нормальные.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
19.06.2013, 23:19     Передача в функцию - ссылки, указатели, константы #30
ninja2, у Дейтелов, насколько я помню, нет описания виртуальных функций...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,409
19.06.2013, 23:22     Передача в функцию - ссылки, указатели, константы #31
Цитата Сообщение от VLK Посмотреть сообщение
Джесс Либерти - Освой самостоятельно C++ за 21 день
вы всерьез думаете, что эта книга написана не для монетизации и профессиональным автором? Само по себе название должно отталкивать. Как высокофункциональный язык, который люди изучают годами можно освоить за 21 день? Вдобавок её пинают на каждом шагу. Это ведь из ряду "Похудеем за 7 дней", "Удалить обвисший живот за 3 дня", "Увеличение *** на 15 см" Да, именно в этом ряду книга и стоит.

И вам надо будет именно переучиваться, а не повторять основы. Возьмите "С++ для чайников", там попроще будет, чем у Дейтелов, хоть и не так профессионально.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,409
19.06.2013, 23:24     Передача в функцию - ссылки, указатели, константы #32
xtorne21st,
Передача в функцию - ссылки, указатели, константы
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
19.06.2013, 23:53     Передача в функцию - ссылки, указатели, константы #33
MrGluck, значит, подвела память
Olivеr
20.06.2013, 00:45
  #34

Не по теме:

Есть еще одна хорошая книга - Язык программирования C++ Липпман С. Б.
Всё написано простыми словами и часто повторяется. К недостаткам можно отнести плохую последовательность материала. На русском есть четвертое издание 2007 года. Уже вышло пятое, но пока только на английском.

VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
20.06.2013, 13:24  [ТС]     Передача в функцию - ссылки, указатели, константы #35
Я вот одной вещи понять не могу, довольно часто упоминаю, что изучаю C++ по книге - Джесс Либерти "Освой самостоятельно C++ за 21 день" и всегда от экспертов программирования слышу что эта книга полный треш, при этом на вопрос: "а ты сам читал ее?" - я всегда слышу ответ: "нет".

Откуда у вас такое мнение если вы ее сами не читали? что вас так раздражает, словосочетание "за 21 день"? так я вам скажу, что 21 день это маркетинговый ход, за 21 день нереально по этой книге выучить C++, я лично учу уже 3-й месяц, правда это моя лень растягивает это удовольствие (изучение C++).

Ссылки я давать не буду, т.к. их скорее всего удалят, а меня за это наградят, но на сторонних сайтах (особенно трекерах), где можно скачать эту книгу ( Джесс Либерти "Освой самостоятельно C++ за 21 день" ) есть комментарии, отзывы, так вот эти комментарии все положительные, т.е. я еще ни разу не встречал плохого отзыва об этой книге.

Прямо какая то нехорошая ситуация вокруг этой книги, хотя создавай про нее тему в разделе - http://www.cyberforum.ru/holywars/
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,409
20.06.2013, 13:34     Передача в функцию - ссылки, указатели, константы #36
Я вот одной вещи понять не могу, довольно часто упоминаю, что изучение C++ по книге - Джесс Либерти "Освой самостоятельно C++ за 21 день" это треш и всегда от экспертов программирования слышу что эта книга полный треш, при этом на вопрос: "а ты пробовал разобраться в программировании с помощью нескольких нормальных авторов?" - я всегда слышу ответ: "нет".

Откуда у вас такое мнение если вы еще не знаете язык и верите всему, что пишут? что вас так манит словосочетание "за 21 день"? так я вам скажу, что 21 день это полная чухня, ни за 21 день и ни за какой другой срок нереально по этой книге выучить C++, я лично по Дейтелам учился и не 3 месяца, правда это моя лень растягивает это удовольствие (изучение C++).


VLK, вам видимо примера с возвращением ссылки на локальную переменную было мало?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.06.2013, 10:43     Передача в функцию - ссылки, указатели, константы #37

Не по теме:

@VLK, я пробовал читать этот 21 день. Мне изложение не понравилось. Я никогда не говорю, что книга плоха из-за названия (глупость полная - так судить), но то, как там объясняются некоторые вещи, да и вообще стиль, мне страшно не понравились. Дейтелов люблю очень, по сути с неё началось моё изучение плюсов, она мне очень помогла.


А теперь по теме.
@VLK, я целиком все посты не читал, но у меня сложилось впечатление, что вы поняли так, что любая функция/метод, который возвращает ссылку, априори работает не правильно. Это не так. Неверно возвращать ссылки только на локальные переменные, время жизни которых меньше времени жизни ссылок на них. Никто не запрещает из метода, например, вернуть ссылку на поле класса, а из функции (говорю только для примера) - ссылку на глобальную переменную. Именно про это говорили, упоминая оператор присваивания (возвращается ссылка на объект, стоящий слева от оператора присваивания) или оператор индексации (возвращается ссылка на элемент внутреннего массива). Все эти примеры правильные, поскольку после выхода из этих методов объект, ссылки на которые были возвращены, продолжают существовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2013, 10:54     Передача в функцию - ссылки, указатели, константы
Еще ссылки по теме:

C++ Передача массива в функцию (указатели)
Передача ссылки на массив в функцию C++
Передача ссылки и указателя в функцию C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
25.06.2013, 10:54     Передача в функцию - ссылки, указатели, константы #38
Цитата Сообщение от VLK Посмотреть сообщение
"а ты сам читал ее?" - я всегда слышу ответ: "нет".
Прочитал половину, может поболее и бросил (хорошо что не вслух читал, иначе бы какого-нибудь демона вызвал ).
Ошибки в тексте можно списать на переводчиков, ошибки в примерах - черт с ними, спишем на невнимательность автора и переводчиков, а вот некорректное и часто неверное изложение материала списать уже не на кого
Если читать эту книгу первой и учиться по ней, то потом придется переучиваться

Добавлено через 3 минуты
Цитата Сообщение от VLK Посмотреть сообщение
что вас так раздражает, словосочетание "за 21 день"?
ага
Цитата Сообщение от VLK Посмотреть сообщение
т.е. я еще ни разу не встречал плохого отзыва об этой книге.
первый день на форуме?
Yandex
Объявления
25.06.2013, 10:54     Передача в функцию - ссылки, указатели, константы
Ответ Создать тему
Опции темы

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