В начале, в принципе, нет чего-то сложного, простое определение класса.
Здесь имеется 3 конструктора, первый по умолчанию (когда мы просто объявляем объект, например, STORE::Product p1). Второй уже параметризированный, с двумя переменными по умолчанию, а третий конструктор необходим для присваивания одного объекта другому.
Также, для примера есть 3 перегрузки (с ключевым словом operator) операций (1 из них дружественная функция) и 3 метода. Все они выполняют по сути одно и тоже.

Основной момент по третьей перегрузке со знаком = (operator=). Тут случай когда мы объект, допустим, p1 приравниваем к p2. Здесь есть неявное this (указание на объект p1), например, строчка m_name = another.m_name можно представить как this.m_name = another.m_name. Также есть важный момент правило трех «Если класс явно определяет хотя бы один из трёх специальных методов – деструктор, конструктор копирования или оператор присваивания копированием, – то он почти наверняка должен явно определить и два других.» для переменной m_discount в Product::Product(const Product& another) выделяется область памяти, если это не сделать, то объекты будут ссылаться на один и тот же адрес и при уничтожении объекта возникнет двойное удаление, что приведет к аварийному завершению программы, также в operator= при присваивании освобождается память, выделяется новая с копированием из другого объекта, если пропустить  delete, то произойдёт утечка памяти (по сути программа будет просто забирать память и не сможет с ней взаимоджействовать).

На что стоит обратить внимание: static int totalProducts, данную переменную (она необходима для подсчета «живых сущностей») будет необходимо инициализировать в файле .cpp нулем. Насчёт её поведения пока ничего не могу сказать, если допустим определить переменную в объявлении, то как она себя поведёт в двух разных .cpp файлах.

Методы:
void sell(int amount) – уменьшает количество товаров, соответственно изменяется и m_totalPrice
void restock(int amount)
– похож на метод выше, только делает все наоборот.
void show() const – показывает содержание объекта.
void setDiscount(double discount) – устанавливает в объект скидку, соответственно изменяется и m_totalPrice
void setTotalPrice()
– считает общую сумму
static int getTotalProducts() – возвращает количество «живых сущностей».
 
Программа, вывод в консоли.
Создаётся объект p1 необходимо инициализировать с STORE::, так как Product находится в пространстве имен  STORE. Дальше используем методы sell, restock и show.
В блоке создаётся p2, также используем using, чтобы для Product не объявлять STORE::, что мы и видим при объявлении p2. После того как блок заканчивается, то объект уничтожается. Это можно увидеть, когда мы STORE::Product::getTotalProducts() будет выведено 1, а не 2, так как блок закончился, то объект уничтожился.
Дальше используем перегрузки операций.

Name: UnknownName
Price: 0
Quantity: 0
Discount: 0
Total price: 0
Obj #1
-----------------------
QUANTITY IS NOT ENOUGH
-----------------------
Name: UnknownName
Price: 0
Quantity: 100
Discount: 0
Total price: 0
Obj #1
-----------------------
Name: Internal block
Price: 0
Quantity: 0
Discount: 0
Total price: 0
Obj #2
-----------------------
NUMBER OF OBJECTS: 1
-----------------------
Name: Jojo
Price: 1000
Quantity: 75
Discount: 0
Total price: 75000
Obj #2
-----------------------
Name: Jojo
Price: 1000
Quantity: 75
Discount: 0.3
Total price: 52500
Obj #2
-----------------------
Name: Jojo
Price: 1000
Quantity: 75
Discount: 0.3
Total price: 52500
Obj #1
-----------------------
NUMBER OF OBJECTS: 2
Просмотры: 106
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти