Различия
Показаны различия между двумя версиями страницы.
— | konstruktor_kopirovanija [2021/07/31 21:58] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Конструктор копирования C++ ====== | ||
+ | <note important> | ||
+ | * **Проблема.** Передача объекта в функцию. | ||
+ | Объекты класса можно передавать в функции в качестве аргументов точно так же, как передаются данные других типов. Однако, | ||
+ | Объект внутри функции - это побитовая копия передаваемого объекта, | ||
+ | * **Проблема.** Возврат объекта из функции. | ||
+ | Для того чтобы функция могла возвращать объект, | ||
+ | * **Проблема.** Инициализация одного объекта другим при создании. | ||
+ | В программировании есть еще один случай побитового копирования - инициализация одного объекта другим при создании: | ||
+ | < | ||
+ | # include < | ||
+ | using namespace std; | ||
+ | |||
+ | class ClassName | ||
+ | { | ||
+ | public: | ||
+ | ClassName () | ||
+ | { | ||
+ | cout << " | ||
+ | } | ||
+ | ~ClassName () | ||
+ | { | ||
+ | cout << " | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | ClassName c1; | ||
+ | |||
+ | // Вот он!!! Момент побитового копирования. | ||
+ | ClassName c2=c1; | ||
+ | } | ||
+ | </ | ||
+ | Результат работы программы: | ||
+ | < | ||
+ | ClassName!!! | ||
+ | ~ClassName!!! | ||
+ | ~ClassName!!! | ||
+ | </ | ||
+ | Конструктор вызывается один раз: для с1. Для с2 конструктор не срабатывает. Однако деструктор срабатывает для обоих объектов. А, поскольку, | ||
+ | ====== Решение проблемы ====== | ||
+ | Одним из способов обойти такого рода проблемы является создание особого типа конструкторов, | ||
+ | < | ||
+ | имя_класса (const имя_класса & obj) | ||
+ | { | ||
+ | ... // тело конструктора | ||
+ | } | ||
+ | </ | ||
+ | Здесь obj - это ссылка на объект или адрес объекта. Конструктор копирования вызывается всякий раз, когда создается копия объекта. Таким образом, | ||
+ | < | ||
+ | # include < | ||
+ | using namespace std; | ||
+ | class ClassName | ||
+ | { | ||
+ | public: | ||
+ | ClassName () | ||
+ | { | ||
+ | cout << " | ||
+ | } | ||
+ | ClassName (ClassName& | ||
+ | cout << "Copy ClassName!!!\n"; | ||
+ | } | ||
+ | ~ClassName () | ||
+ | { | ||
+ | cout << " | ||
+ | } | ||
+ | }; | ||
+ | void f(ClassName o){ | ||
+ | cout<<" | ||
+ | } | ||
+ | |||
+ | ClassName r(){ | ||
+ | ClassName o; | ||
+ | cout<<" | ||
+ | return o; | ||
+ | } | ||
+ | void main() | ||
+ | { | ||
+ | // инициализация одного объекта другим | ||
+ | ClassName c1; | ||
+ | ClassName c2=c1; | ||
+ | |||
+ | // передача объекта в функцию | ||
+ | ClassName a; | ||
+ | f(a); | ||
+ | |||
+ | // | ||
+ | r(); | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | Результат работы программы: | ||
+ | < | ||
+ | // создался объект с1 | ||
+ | ClassName!!! | ||
+ | |||
+ | // инициализация объекта с2 объектом с1 | ||
+ | Copy ClassName!!! | ||
+ | |||
+ | // создался объект а | ||
+ | ClassName!!! | ||
+ | |||
+ | // передача а в функцию по значению | ||
+ | // создалась копия о | ||
+ | Copy ClassName!!! | ||
+ | |||
+ | // отработала функция f | ||
+ | Function f!!! | ||
+ | |||
+ | // уничтожилась копия o | ||
+ | ~ClassName!!! | ||
+ | |||
+ | // создался объект o | ||
+ | // внутри функции r | ||
+ | ClassName!!! | ||
+ | |||
+ | // отработала функция r | ||
+ | Function r!!! | ||
+ | |||
+ | // возврат из функции | ||
+ | // создалась копия объекта о | ||
+ | Copy ClassName!!! | ||
+ | |||
+ | // уничтожился объект o | ||
+ | ~ClassName!!! | ||
+ | |||
+ | // уничтожилась его копия | ||
+ | ~ClassName!!! | ||
+ | |||
+ | // уничтожился объект а | ||
+ | ~ClassName!!! | ||
+ | |||
+ | // уничтожился объект с2 | ||
+ | ~ClassName!!! | ||
+ | |||
+ | // уничтожился объект с1 | ||
+ | ~ClassName!!! | ||
+ | </ | ||
+ | < | ||
+ | Теперь, | ||
+ | < |
📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.
📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Nginx простые примеры конфигурации
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах
7 Самых Популярных Обзоров
- Хостинг для Python-скриптов и приложений
- ТОП 4 лучших антидетект браузеров (Бесплатные & Платные)
- Подборка купонов (промокоды) на хостинг, антидетект браузеры
- Обзор THE.Hosting (PQ Hosting): надежный хостинг с профессиональной поддержкой
- Хостинг в России
- Хостинг в Европе
- Обзор браузера Dolphin {anty} для мультиаккаунтинга