Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Конструкторы копирования
Конструктор копирования создает объект класса, копируя при этом данные из уже существующего объекта данного класса. В связи с этим он имеет в качестве единственного параметра константную ссылку на объект класса (const Т&) или просто ссылку на объект класса (Т&). Использование первого предпочтительнее, так как последний не позволяет копировать константные объекты. Ссылка передается всякий раз, когда новый объект инициализируется значениями существующего объекта. Если вы не предусмотрели конструктор копирования, компилятор генерирует конструктор копирования по умолчанию. В C++ различают поверхностное и глубинное копирование данных. При поверхностном копировании происходит передача только адреса от одной переменной к другой, в результате чего оба объекта указывают на одни и те же ячейки памяти. Конструктор копирования по умолчанию, созданный компилятором, создает буквальную (или побитную) копию объекта, то есть осуществляет поверхностное копирование. Полученная копия объекта, скорее всего, будет непригодной, если она содержит указатели или ссылки. В случае глубинного копирования происходит действительное копирование значений всех переменных из одной области памяти в другую. Если эти указатели или ссылки ссылаются на динамически распределенные объекты или на объекты, встроенные в копируемый объект, они будут недоступны в созданной копии объекта. Поэтому для классов, содержащих указатели и ссылки, следует включать в определение класса конструктор копирования, который будет осуществлять глубинное копирование, не полагаясь на созданный компилятором конструктор копирования по умолчанию. В этом конструкторе, как правило, выполняется копирование динамических структур данных, на которые указывают или на которые ссылаются члены класса. Класс должен содержать конструктор копирования, если он перегружает оператор присваивания. Если в классе не определен конструктор, компилятор пытается сгенерировать собственный конструктор по умолчанию и, если нужно, собственный конструктор копирования. Эти сгенерированные компилятором конструкторы рассматриваются как открытые функции-члены. Подчеркнем, что компилятор генерирует эти конструкторы, если в классе не определен никакой другой конструктор. Приведём пример использования конструктора копирования: { // закрытые члены класса
char name; double x, y; public: // конструкторы с параметрами Dot (char Name, double X, double Y) { name = Name; x = X; y = Y; } Dot (char Name): name(Name), x (0), y (0) { } Dot (char Name, const Dot& A) { name = Name; x = A.x; y = A.y; } // конструктор копирования Dot (const Dot& A) { name = (char) 226; x = A.x; y = A.y; } void Print (); // выводит на экран имя и координаты текущей точки }; void main () {
Dot A ('A', 3, 4); Dot B ('B'); Dot C (A); C.Print (); // вызов конструктора копирования Dot (const Dot& A) // выводит на экран: Координаты точки т: x=3 y=4
Dot D = B; D.Print (); // вызов конструктора копирования Dot (const Dot& A) // выводит на экран: Координаты точки т: x=0 y=0
// вызов конструктора Dot (char Name, const Dot& A) // выводит на экран: Координаты точки E: x=3 y=4 } Конструктор копирования по умолчанию выполняет поверхностное копирование, которое в нашей задаче копирует не только координаты, но и имена точки. Хотя наш объект не содержит динамических чле- Объектно-ориентированное программирование Лекция 3 Функции-члены класса нов-данных, такое копирование нас не устраивает, поскольку мы хотим, чтобы каждая точка имела уникальное имя и не изменяла его в ходе выполнения программы. В приведённом примере точки С и D объявлены с помощью конструктора копирования объявленного нами. В этом конструкторе имя точки инициализируется фиксированным значением - русской буквой “ т ”. Для решения этой задачи в приведённом примере объявлен конструктор: Dot (char Name, const Dot& A) { name = Name; x = A.x; у = A.y; }, Этот конструктор в качестве параметров принимает имя и точку, координаты которой используются для инициализации объявляемой точки.
|