198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|||||||||||
1 | |||||||||||
Передача в функцию - ссылки, указатели, константы16.06.2013, 23:18. Показов 5925. Ответов 37
Метки нет (Все метки)
Вот программа:
Кликните здесь для просмотра всего текста
В строке 10 я создаю переменную var и присваиваю ей значение 2, т.е. допустим по адресу 0001 у меня располагается значение 2 В строке 12 я передаю var в виде ссылке в функцию, где она получает новое имя (временное имя, псевдоним) - rhs, значение rhs располагается по тому же адресу что и var - 0001. В строке 5 я прибавляю 1 к rhs и по адресу 0001 меняется значение с 2 на 3. по этому в строке 14 мне выведет на экран 3, а не 2. Вопрос, а что происходит, как работает следующая программа: Кликните здесь для просмотра всего текста
В частности меня интересует какую роль выполняет оператор & в строке 3 и чем отличается такая же программа без &. Распишите по возможности так, как я описывал первую программу, что бы не оставалось вопрос, что бы не пришлось переспрашивать. Это первый вопрос в этой теме, дальше я буду добавлять вопросы, про указатели константы и т.д. так что если что, смотрите последние сообщения, а не первое.
0
|
16.06.2013, 23:18 | |
Ответы с готовыми решениями:
37
Передача в функцию константы вместо указателя Ссылки и указатели на функцию Передача в функцию через указатели Передача массива в функцию (указатели) |
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
||||||||||||||||
16.06.2013, 23:31 | 2 | |||||||||||||||
0
|
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
|
|
16.06.2013, 23:32 | 3 |
Всё зависит от конкретного компилятора. В стандарте написано, что возврат ссылки на локальный объект приводит к UB.
0
|
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
|
|
16.06.2013, 23:34 | 4 |
означает что функция возвращает ссылку на переменную
если бы не было & то функция производила манипуляции с переменной, делала её копию и возвращала к месту вызова
0
|
Каратель
|
|
16.06.2013, 23:36 | 5 |
В строке 12 я создаю переменную var и присваиваю ей значение 2, т.е. допустим по адресу 0001 у меня располагается значение 2
В строке 15 я передаю копию var В строке 5 я прибавляю 1 к rhs (копии var) и по адресу 0002 меняется значение с 2 на 3. В строке 7 я по этому в строке 15 происходит неопределенное поведение, так как ссылка ссылается на не существующую переменную. что происходит дальше - на совести разработчиков компилятор, возможно все! вот и сказочке конец...
2
|
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
|
|
16.06.2013, 23:38 | 6 |
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|
16.06.2013, 23:40 [ТС] | 7 |
Olivеr, т.е. правильно я понимаю что во второй программе грубо говоря происходит не return 3, а return ссылка на rhs (при этом rhs уже нет, т.к. это был временная переменная) ? а уже из этой ссылки varTwo берет значение 3?
извините за колхозное описание ситуации, мне так проще понять.
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
|||||||||||
16.06.2013, 23:43 | 8 | ||||||||||
VLK, если записано
По крайней мере так в
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|
16.06.2013, 23:44 [ТС] | 9 |
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
|
16.06.2013, 23:50 | 10 |
VLK, пишу по пунктам как я это вижу:
1. Передаем копию varOne в функцию fun, создается переменная с именем rhs (аналогичная varOne), но они никак не связаны! 2. увеличиваем значение rhs на 1 3. Возвращаем копию rhs и присваиваем ее varTwo, уничтожаем rhs Добавлено через 1 минуту Совет: напишите простенькую структуру со всеми конструкторами и деструктором. В их телах выведите на экран сообщение о том, что вызван такой то конструктор/деструктор. И проделайте ту же программу с этой структурой.
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|||||||||||
17.06.2013, 00:02 [ТС] | 11 | ||||||||||
Все равно не вижу, не понимаю разницу между
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
||||||
17.06.2013, 00:10 | 12 | |||||
Вот код. Запустите и разберетесь.
Кликните здесь для просмотра всего текста
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
||||||
17.06.2013, 17:14 [ТС] | 13 | |||||
Кликните здесь для просмотра всего текста
Вот я сделал программу, но все равно до конца не понимаю почему они (функции fun и link) работают по разному.
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
||||||
17.06.2013, 17:46 | 14 | |||||
VLK, еще раз говорю, что в этой функции ошибка:
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|
17.06.2013, 19:08 [ТС] | 15 |
Это я понимаю, получается что такая запись изначально ошибочная и не должна использоваться вообще, НО - https://www.cyberforum.ru/post955770.html
Вот в строчке 17, 21 используется, этот пример из книги, значит для чего то и как то используется, хотелось бы узнать как и что. PS кстати данную программу я хотел повторить, половина работает, но не работает строчка1 = строчк2 + строчка3 и я думаю проблема как раз кроется в этих строчках 17 и 21, но я их не понимаю по этому не могу толком найти проблему.
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
||||||
17.06.2013, 19:16 | 16 | |||||
Оператор присвоения. Зачем возвращать копию если можно и нужно возвращать ссылку? Объект то, на который ссылается ссылка, существует.
Оператор []. Предназначен для получения доступа к элементу последовательности. Почему ссылка? 1. Он существует даже после завершения функции. 2. Что бы работала запись:
Не все примеры в книгах являются корректными. Многие из них приведены для того что бы объяснить на пальцах почему так делать не стоит. В вашей программе не перегружен оператор +
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|
19.06.2013, 13:24 [ТС] | 17 |
Я примерно понял что же все же означает эта & в данном случае.
Новый вопрос по данной теме, теперь про константы, подскажите, что делает ключевое слово const и с кем, с чем, в каждом конкретном случае: 1. const int fun (int var) { } 2. int const fun (int var) { } 3. int fun (int var) const { } 4. int fun (const int var) { } 5. int fun (int const var) { }
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
|
19.06.2013, 13:44 | 18 |
1 и 2 - одно и тоже: возвращают константную копию переменной типа int
3. возвращает копию переменной типа int. указатель this - константый 4 и 5. принимает константную копию переменной типа int и возвращает копию переменной типа int
1
|
Каратель
|
|
19.06.2013, 13:44 | 19 |
эти две записи означают одно и тоже, возвращение константы, какого-то особого смысла в этом нет
эти две записи означают одно и тоже, var внутри функции ведет себя как константа такая запись допустима только для методов класса. означает она то что этот метод класса не модифицирует состояние объекта. внутри такого метода нельзя модифицировать поля класса, за исключением полей объявленных как mutable. но эти оганичения можно обойти с помощью const_cast, но если такое потребовалось то вы явноно что-то делаете не так.
1
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
||||||||||||||||
19.06.2013, 14:20 [ТС] | 20 | |||||||||||||||
т.е., вот есть небольшая программа:
Кликните здесь для просмотра всего текста
Есть 2 переменных - varOne, допустим она находится по адресу 0001 и varTwo которая находится по адресу 0002, когда начинается выполнение функции (fun) то мы создаем копию переменной varOne, имя этой копии D и располагается она по адресу 0003, и то, что мы возвращаем является константным значением, т.е. переменная расположенная по адресу 0003 является константной, но она становится константной только тогда когда мы ее возвращаем, т.е. до строчки 6 (return D) я могу с этим D делать все что угодно, а далее, в строчках 7 и 14 переменная расположенная в 0003 является константной, соответственно после строчки 14 переменная по адресу 0003 будет уничтожена, по этому данная запись бесполезна? Кликните здесь для просмотра всего текста
Тут как я понимаю в строчке 3 D присваивается значение 5 и внутри функции я его не могу менять, т.е. на строчке 5 мне выдаст ошибку. А с вот этим бы хотелось уточнить т.е. если у меня есть переменная-член var и функция int fun (int var) const { } должна ее изменить, допустим прибавить 1 к ней, то эта функция не будет работать, компилятор выдаст ошибку? Добавлено через 11 минут Кликните здесь для просмотра всего текста
Вот дописал программу - класс, как я понимаю строка 13 ошибочная из-за const.
0
|
19.06.2013, 14:20 | |
19.06.2013, 14:20 | |
Помогаю со студенческими работами здесь
20
Как лучше передавать значения в функцию? Ссылки vs указатели Передача параметров в функцию через указатели Передача значений в функцию через указатели Указатели Char, передача адреса в функцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |