|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|||||||||||
Присваивание объектов одного типа между собой и передача объекта в функцию по значению01.02.2017, 20:27. Показов 1135. Ответов 9
Метки нет (Все метки)
При первом знакомстве с С++ усиленно не могу понять вот такие моменты :
1. Имеем вот такой код : Кликните здесь для просмотра всего текста
Мы присвоили объекты между собой и в итоге указатель из объекта str2 начал указывать на строку из объекта str1. После этого мы получаем в str2 новую строку, стирая старую (Тут первая ошибка - теперь указатель из объекта str1 начинает указывать в "никуда"). Смотрим на содержимое str2 - все хорошо. Смотрим на содержимое str1 - вот она ошибка. Далее,при выходе из программы еще получается, что мы забыли очистить память , на которую первоначально указывал указатель из объекта str2. Об этом нам сразу напомнят, выбив исключение. Так вот, тут два вопроса - правильно ли я все понимаю. (Буду раз увидеть новые подробности или более полный разбор, так как хочется реально понимать,что же там происходит) и второе,почему это так ужасно реализовано? Почему просто перебрасывается указатель из str2 на содержимое из str1? Почему это не происходит именно с удалением текущего значения str2,выделения новой памяти и копирования туда строки из str1? (Ну,не только строки, чего бы там вообще не было). Больше всего убивает именно этот "переброс" указателя. 2. Теперь имеем вот такой код : Кликните здесь для просмотра всего текста
Определили объект, конструктором выделили память под одно значение типа int. Деструктором будем ее очищать. Создаем объект такого типа. Кидаем его в функцию. Передаем именно по значению. То есть должна создаться копия объекта. Так почему при выходе из функции деструктор чистит адрес именно самого объекта? Ведь должна создаваться временная локальная копия? Пусть там с ней происходит что угодно. Какое право эта функция имеет трогать адрес ,который принадлежит объекту,переданному туда по значению? И почему она вообще его трогает? Или же здесь создается локальная копия, которая при этом получает еще и валидные текущие адреса полей? Очень непонятные для меня моменты, особенно после С,где всё было логично и связно.
0
|
|||||||||||
| 01.02.2017, 20:27 | |
|
Ответы с готовыми решениями:
9
Передача объекта типа TStringGrid в функцию в Embarcadero C++ Надо сравнить значение одного поля всех объектов между собой и выбрать самое большое значение. C++ ООП Передача в функцию динамический массив объектов первого и второго типа |
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|||
| 01.02.2017, 21:05 | |||
operator=() с требуемым вам поведением. Есть правило трех: "Если вам нужно определить хоть что-то из: деструктор, конструктор копирования, оператор присваивания - вам нужно определить все 3" (Есть еще правило пяти туда добавляются перемещающий конструктор и перемещающий оператор присваивания). Дефолтный operator=() годится только для классов, которые не управляют памятью (POD).
1
|
|||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
||
| 01.02.2017, 21:12 [ТС] | ||
|
0
|
||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
||
| 01.02.2017, 21:23 [ТС] | ||
|
Оно понятно,что на одну и ту же область в памяти могут "смотреть" сколь угодно много указателей. Просто когда это происходит таким вот образом,меня это обескураживает.
0
|
||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 01.02.2017, 21:56 | ||
|
0
|
||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
||
| 01.02.2017, 23:38 [ТС] | ||
|
Но может и правда пока не хватает теоретической базы. Добавлено через 1 час 31 минуту А при передаче в функцию объекта класса "по значению" создается копия, в которую также происходит обычное копирование переменных? Поэтому и освобождается при выходе память, на которую указывал указатель из оригинала?
0
|
||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 02.02.2017, 17:50 | ||
|
1
|
||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|||||||||||
| 03.02.2017, 00:30 [ТС] | |||||||||||
|
И в этой же теме спрошу, this ускоряет работу программы?
Есть ли разница между
0
|
|||||||||||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
| 03.02.2017, 18:33 | |
|
Notoriously, это и не псевдо, это вообще не оптимизация.
Просто явное написание того, что итак делает компилятор.
1
|
|
| 03.02.2017, 18:33 | |
|
Помогаю со студенческими работами здесь
10
Функционирование классов и объектов между собой SFML, взаимодействие объектов игры между собой Передача объекта по ссылке или о значению
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|