Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232

Передача объекта как аргумент функции

07.02.2022, 10:37. Показов 583. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В функцию аргумент можно передавать разными способами, но бывает что возникает ошибка. Хочу прояснить ситуацию как правильно передавать в функцию объект.

1. как ссылку &obj - тут всё понятно если объект не константный или rvalue то передаётся в функцию и с ним можно работать как и вне функции;
2. как const &obj - тут тоже понятно если объект lvalue то преобразуется в const и его методы уже не доступны становится константным
3. как obj - вот тут у меня есть вопрос, предполагаю что создаётся временный объект конструктором копирования или перемещения, потом уничтожается, тут вот возникает ошибка. Как надо делать правильно чтобы этого не происходило?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2022, 10:37
Ответы с готовыми решениями:

Передача потока (текущ.позиции курсора в файле) как аргумент функции
Всем привет! Столкнулся с такой проблемой, Конструкция довольно тяжелая для меня. Мне нужно чтобы я открывал файл для чтения, затем...

Передача функции в аргумент
Есть три функции: void MainMenu(); void MainMenu_MilkMenu(); bool ErrorMenu(void (*pf)()); Все прототипы находятся в...

Передача типа переменной через аргумент функции
Стоит задача: реализовать свой вариант динамических массивов без использования STL(т.е. без new, как я понимаю). При этом должно работать...

4
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.02.2022, 10:44
Ничего не понятно.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
07.02.2022, 11:21
Цитата Сообщение от pgb Посмотреть сообщение
предполагаю что создаётся временный объект конструктором копирования или перемещения
Это достаточно недалеко от истины.

Переданное lvalue будет скопировано (copied) и для того, чтобы это произошло корректно, нужен copy-конструктор.
переданное rvalue будет перемещено (moved) и для того, чтобы это произошло корректно, нужен конструктор перемещения.

Цитата Сообщение от pgb Посмотреть сообщение
тут вот возникает ошибка
Отлично. Локализованная ошибка -- половина решения.

Цитата Сообщение от pgb Посмотреть сообщение
Как надо делать правильно чтобы этого не происходило?
Непонятно, что такое "это", и что за ошибка, но универсальный совет таков: СЛЕДУЙТЕ ПРАВИЛУ ПЯТИ
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.02.2022, 12:12
Цитата Сообщение от pgb Посмотреть сообщение
1. как ссылку &obj - тут всё понятно если объект не константный или rvalue то передаётся в функцию и с ним можно работать как и вне функции;
2. как const &obj - тут тоже понятно если объект lvalue то преобразуется в const и его методы уже не доступны становится константным
3. как obj - вот тут у меня есть вопрос, предполагаю что создаётся временный объект конструктором копирования или перемещения, потом уничтожается, тут вот возникает ошибка. Как надо делать правильно чтобы этого не происходило?
Можно и &&obj объявить, но не суть. Третий пункт самый простой и если он не ясен не нужно касаться первых 2-х, - моё мнение.
Третий пункт это передача по значению. Как и водится в терминологии программирования, никакое значение не передаётся. Создаётся копия. Причём процесс "передачи" имеет семантику инициализации. То есть, в области оператора функции аргумент инициализируется копированием "передаваемого" (предоставляемого как шаблон для копирования) объекта. После окончания работы функции, все локальные объекты (включая аргументы) уничтожаются. Если есть деструктора, то они вызываются для этого. Если нет, но должны быть, - программист вызывается на ковёр и уничтожается компилятором. Морально.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.02.2022, 16:03
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если нет, но должны быть, - программист вызывается на ковёр и уничтожается компилятором. Морально.
Иногда не сразу. Но в обязательном порядке.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2022, 16:03
Помогаю со студенческими работами здесь

Выбор вложенного объекта через аргумент в конструкторе другого объекта
Предположим, у меня есть класс NativeEntity. Этот класс имеет в себе вложенные классы(к примеру выберем класс Zombie, Player, NPC, чтобы...

Передача функции заранее неизвестного объекта
Здравствуйте. Можно ли не используя шаблонов передать функции объект заранее неизвестного класса и применить к нему функцию-член? ...

Передача объекта как аргумент в метод
Метод printClass() предназначен для того, чтобы выводить класс вызвавшего метод объекта и объекта, переданного как аргумент методу. В...

Ключ объекта как аргумент функции
let votes = { Michail : 'True', Gina : 'True', Dan : 'True', Jeck : 'True' }; function checkVoter (obj, key) { ...

Передача массива как аргумент функции
Здравствуйте! Не подскажете - как передать функции массив как аргумент без использования Variant? Попробовал для этого следующий код: ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru