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

Как получить значение из функции? - C++

Восстановить пароль Регистрация
 
d7d1cd
163 / 86 / 21
Регистрация: 30.06.2011
Сообщений: 765
13.06.2016, 15:55     Как получить значение из функции? #1
Приветствую всех! Требуется совет эксперта С++. Как правильнее передать в функцию значение какой-либо переменной, при условии, что функция должна значение этой переменной изменить. Посмотрите пример:
C++ (Qt)
1
2
3
4
5
6
7
8
9
int a = 1;
int b = 2;
Increment(&a, b);
 
void Increment(int *a, int &b)
{
 *a = *a + 1;
 b++;
}
В приведенном примере после работы функции Increment значение переменных a и b увеличивается на единицу. Однако значение переменной а передано по указателю, а значение b - по ссылке. Как, все же, правильнее?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ferrari F1
Заблокирован
295 / 281 / 62
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 16:08     Как получить значение из функции? #2
d7d1c, ну лучше, конечно, по ссылке передавать (со знаком &), т.к. при передаче указателя тратится драгоценная оперативная память (как правило, 4 байта), что является очень важным моментом.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
13.06.2016, 16:10     Как получить значение из функции? #3
в данном случае передача по ссылке - более в духе с++.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
т.к. при передаче указателя тратится драгоценная оперативная память
причем тут это вообще?
Ferrari F1
Заблокирован
295 / 281 / 62
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 16:10     Как получить значение из функции? #4
Цитата Сообщение от retmas Посмотреть сообщение
причем тут это вообще?
кто-то шуток не понимает...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
13.06.2016, 19:21     Как получить значение из функции? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от d7d1c Посмотреть сообщение
Как, все же, правильнее?
Эти два варианта делают ровно одно и то же. В том числе и код для них построится одинаковый (т.е. в посте #2 слова не соответствуют действительности)

Что же касается того, как правильнее, тут вопрос больше упирается в читабельность кода (т.е. в стиль програмирования). Когда ты видишь вызов

C++
foo (&x);
то ты сразу видишь, что в функцию параметр передаётся по косвенности и может быть изменён. Когда ты видишь вызов

C++
foo (x);
то придётся искать описание функции foo, чтобы понять, в реальности мы передаём по значению, или по ссылке.

Вообще этот стилевой подход на форуме много раз обсуждался, если не лень, воспользуйся поиском
Unknownx
Заблокирован
13.06.2016, 20:57     Как получить значение из функции? #6
d7d1c, если ты пишешь на С/С++, то лучше передавай по указателю, т.к параметра ссылки в Си вообще нет http://codepad.org/HD66Fs1M. Т.е написав по указателю ты сможешь при желании собирать код как Сишный и как плюсовый(это особенно существенно когда делаем сборку статических библиотек), голый сишный код - быстрей.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
d7d1c, ну лучше, конечно, по ссылке передавать (со знаком &), т.к. при передаче указателя тратится драгоценная оперативная память (как правило, 4 байта), что является очень важным моментом.
не пиши глупости, а по ссылке что по твоему заходит параметром?

d7d1cd
163 / 86 / 21
Регистрация: 30.06.2011
Сообщений: 765
13.06.2016, 21:10  [ТС]     Как получить значение из функции? #7
Спасибо всем за объяснения. С "одинокой" переменной все понятно. А как быть, если их несколько, то есть, если в функцию надо передать массив, элементы которого в функции могут меняться. В этом случае нужно передавать по указателю на этот массив, верно?
Unknownx
Заблокирован
13.06.2016, 21:28     Как получить значение из функции? #8
Цитата Сообщение от d7d1c Посмотреть сообщение
Спасибо всем за объяснения. С "одинокой" переменной все понятно. А как быть, если их несколько, то есть, если в функцию надо передать массив, элементы которого в функции могут меняться. В этом случае нужно передавать по указателю на этот массив, верно?
- bingo!(вот ещё один фактор почему указатель лучше ссылки, хотя и опасней)
Ferrari F1
Заблокирован
295 / 281 / 62
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 21:29     Как получить значение из функции? #9
Unknownx, это ты не пиши глупостей, по ссылке передается исходный объект(переменная), т.е. копирования не происходит, а при передачи указателя, копируется этот указатель.
Авторы многих книг по плюсам так уверяют...
Unknownx
Заблокирован
13.06.2016, 21:37     Как получить значение из функции? #10
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Unknownx, это ты не пиши глупостей, по ссылке передается исходный объект(переменная), т.е. копирования не происходит, а при передачи указателя, копируется этот указатель.
Авторы многих книг по плюсам так уверяют...
- где ты это увидел(конретно что передача по ссылке экономит память, покажи)?Ссылка почти тот же указатель, только без перегруженных операторов инкремента декремента. Возьми лучше асм и погляди, что идёт в функцию при передаче по ссылке и по указателю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2016, 21:48     Как получить значение из функции?
Еще ссылки по теме:

Как получить значение определенного пикселя. C++
C++ Как получить значение из метода класса, если метод возвращает указатель?
C++ Как получить промежуточное значение используя линейную интерполяцию?

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

Или воспользуйтесь поиском по форуму:
Ferrari F1
Заблокирован
295 / 281 / 62
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 21:48     Как получить значение из функции? #11
Unknownx, асм код посмотрел. И в самом деле одинаковый, НО я не виноват, что авторы многих книг по плюсам пишут, что во втором случае происходит копирование указателя И совершенно недоговаривают, что передача по ссылке по своей сути есть то же самое, но с автоматическим разыменованием (они пишут примерно так: ссылка - это просто псевдоним, и у читателя складывается устойчивое мнение, что копирования таким образом не происходит), тем самым авторы вводят в заблуждение читателя. В своем ответе я положился на информацию из подобных книг, а то, что она не являлась истинной, то моей вины в этом нет.
Yandex
Объявления
13.06.2016, 21:48     Как получить значение из функции?
Ответ Создать тему
Опции темы

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