Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204

Использовать структуру при передаче функции параметров по ссылке

20.10.2018, 06:37. Показов 1226. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример из Шилдта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
struct mystruct {
  int a;
  int b;
};
 
mystruct &f(mystruct &var);
 
int main()
{
  mystruct x, y;
  x.a = 10; x.b = 20;
 
  cout << "Original x.a and x.b: ";
  cout << x.a << ' ' << x.b << '\n';
 
  y = f(x);
 
  cout << "Modified x.a and x.b: ";
  cout << x.a << ' ' << x.b << '\n';
  cout << "Modified y.a and y.b: ";
  cout << y.a << ' ' << y.b << '\n';
 
  return 0;
}
 
// Receive and return a reference to a structure.
mystruct &f(mystruct &var)
{
  var.a = var.a * var.a;
  var.b = var.b / var.b;
  return var;
}
Результат работы программы:

Original x.a and x.b: 10 20
Modified x.a and x.b: 100 1
Modified y.a and y.b: 100 1


Я не понимаю, что происходит в строках 9 и 30. Если заменить &f на f, то результат работы программы не изменится. Зачем применяется символ амперсанд перед объявлением и определением функции?

Добавлено через 54 минуты
Цитата Сообщение от Jzx Посмотреть сообщение
Зачем применяется символ амперсанд перед объявлением и определением функции?
На самом деле перед именем в объявлении и определении. Я просто неаккуратно выразился.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2018, 06:37
Ответы с готовыми решениями:

Почему выдает ошибку при передаче по ссылке параметров?
#include &lt;iostream&gt; /* run this program using the console pauser or add your own getch, system(&quot;pause&quot;) or input loop */ void...

функции в языке с: (использовать механизм передачи параметров по ссылке)
реализовать функцию, осущ. поиск в целочисленном массиве 4-го максимума и 3-го минимума. В качестве параметров функции выступают массив и...

Почему при передаче по ссылке возвращается *this, а не this?
Доброго времени суток! Изучаю перегрузку операции присваивания с указателем *this (ниже). Возврат идёт по ссылке на объект, то есть...

4
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
20.10.2018, 07:04
Цитата Сообщение от Jzx Посмотреть сообщение
символ амперсанд перед объявлением и определением функции?
он применяется и не только в функциях.
любую переменную c & объяви в программе из просто main без всяких функций и посмотри, что это значит.
А значит это наличие ссылки.
Что такое ссылки - гугли отдельно. Главное, разделяй мух от котлет. Узнаешь, что такое ссылка - и тебе уже будет не страшно её видеть и в функциях и в структурах, но знакомиться с нею нужно, конечно на примерах попроще.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
20.10.2018, 10:15  [ТС]
Kuzia domovenok, я не понимаю, почему Шилдт предпочёл именно в этом примере определить функцию f так, чтобы она возвращала ссылку. Ведь можно было использовать определение
C++
1
2
3
4
5
mystruct f(mystruct &var){
  var.a = var.a * var.a;
  var.b = var.b / var.b;
  return var;
}
и получить тот же результат.
0
 Аватар для all_this_pain
45 / 30 / 16
Регистрация: 25.02.2017
Сообщений: 103
20.10.2018, 11:51
в этом случае нет разницы:
C++
1
y = f(x);
если сделать так:
C++
1
f(x) = y;
то функция вернет ссылку на переменную (модифицированная x) и ей присвоится значение y
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
20.10.2018, 19:26
Лучший ответ Сообщение было отмечено Jzx как решение

Решение

Jzx, при работе со структурами немного экономится время работы на быстром копировании.
C++
1
2
3
4
5
6
7
8
// Receive and return a reference to a structure.
mystruct &f(mystruct &var)
{
  var.a = var.a * var.a;
  var.b = var.b / var.b;
  return var;
}
y = f(x);
тут фактически не выделяется дополнительной переменной, числа записываются прямо в поля икса
а затем икс копируется в у
если бы было так
C++
1
2
3
4
5
6
7
8
// Receive and return a reference to a structure.
mystruct f(mystruct &var)
{
  var.a = var.a * var.a;
  var.b = var.b / var.b;
  return var;
}
y = f(x);
тут числа записываются прямо тоже в поля икса
но затем икс копируется во временную переменную(временный объект), который будет возвращён returnом и затем снова скопирован в у
Для встроенных типов данных предотвращать это второе копирование - экономия на спичках, ничего страшного от создания лишней копии одного/четырёх/восьми байт не случится, но структуры, в которых может содержаться множество данных лучше передавать/возвращать из функции по ссылке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.10.2018, 19:26
Помогаю со студенческими работами здесь

Аллокация памяти при передаче string в функцию по константной ссылке
Поясните пожалуйста данный пример: // C++11 #include &lt;string&gt; void get_vendor_from_id(const std::string&amp; id) { // аллоцирует память,...

Вызов size контейнера vector при его передаче в функцию по ссылке
Как по-правильному вызвать size контейнера vector, если он передаётся в функцию по ссылке? Можно, конечно, передать размер как отдельный...

Получение значений функцией (что происходит при передаче аргумента по значению/ссылке)
Разъясните, пожалуйста, пояснение в скобках

Шаблонная функция не компилируется при передаче двух параметров
При передаче двух параметров в шаблонную функцию программа не компилируется. Ума не приложу что не так. По отдельности всё работает. ...

Передача параметров функции по значению, ссылке и указателю
Вычислить F=f(a)-5f^3(sin(b/2))+1/f(1+c^4), де f(x)=3x^2-2x^2+7, при a=5.08, b=-0.65, c=3.87 Добавлено через 45 минут #include...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru