Menu
Coddy logo textTech

Параметризованный конструктор

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 19 из 104.

Параметризованный конструктор принимает аргументы, которые позволяют инициализировать объект конкретными значениями в момент создания. Вместо того чтобы полагаться на значения по умолчанию, вы можете настроить начальное состояние каждого объекта.

class Player {
    std::string name;
    int health;
    int level;
public:
    Player(std::string n, int h, int lvl) {
        name = n;
        health = h;
        level = lvl;
    }
};

Player hero("Archer", 100, 5);
Player mage("Wizard", 80, 7);

Вы можете определить несколько параметризованных конструкторов с различными списками параметров. Это называется перегрузкой конструкторов, и компилятор выбирает подходящий на основе предоставленных вами аргументов.

class Rectangle {
    int width, height;
public:
    Rectangle(int side) {          // Квадрат
        width = height = side;
    }
    
    Rectangle(int w, int h) {      // Прямоугольник
        width = w;
        height = h;
    }
};

Rectangle square(10);        // Вызывает первый конструктор
Rectangle rect(10, 20);      // Вызывает второй конструктор

Параметры могут иметь значения по умолчанию, что делает некоторые аргументы необязательными. Это снижает необходимость в использовании множественных перегруженных конструкторов.

class Enemy {
    std::string type;
    int damage;
public:
    Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};

Enemy goblin("Goblin");       // damage по умолчанию равен 10
Enemy dragon("Dragon", 50);   // damage установлен на 50

Вспомните из предыдущего урока: как только вы определяете параметризованный конструктор, компилятор больше не создает конструктор по умолчанию автоматически. Если вам нужны оба, вы должны определить конструктор по умолчанию явно.

challenge icon

Задание

Легко

Давайте создадим систему инвентаризации товаров, которая демонстрирует, как параметризованные конструкторы позволяют создавать объекты с определенными начальными значениями, и как перегрузка конструкторов обеспечивает гибкость при создании объектов.

Вы создадите два файла для организации вашего кода:

  • Product.h: Определите класс Product, который представляет товары в инвентаре. Ваш класс должен иметь:
    • Приватные атрибуты для name (string), price (double) и quantity (integer)
    • Конструктор, который принимает все три параметра (name, price, quantity) для полной инициализации товара
    • Конструктор, который принимает только name и price, при этом quantity по умолчанию равно 1
    • Конструктор, который принимает только name, при этом price по умолчанию равно 0.0, а quantity по умолчанию равно 0
    • Метод display(), который выводит информацию о товаре в формате: "<name>: "<name>: $<price> (x<quantity>)"lt;price> (x<quantity>)"
    • Метод getTotalValue(), который возвращает цену, умноженную на количество
  • main.cpp: Продемонстрируйте работу всех трех конструкторов, считывая входные данные и создавая товары разными способами. Считайте из входного потока следующее:
    • Первая строка: название товара, цена и количество (разделенные пробелом)
    • Вторая строка: название товара и цена (разделенные пробелом)
    • Третья строка: только название товара
    Создайте три объекта Product, используя соответствующий конструктор для каждого ввода, вызовите display() для каждого из них, а затем выведите общую стоимость всех трех товаров вместе в формате: "Total inventory value: "Total inventory value: $<value>"lt;value>"

Для вывода цены используйте два знака после запятой. Например, если вы создаете товар "Laptop" с ценой 999.99 и количеством 5, метод display должен показать "Laptop: $999.99 (x5)".

Включите ваш заголовочный файл в main.cpp с помощью #include "Product.h".

Попробуйте сами

#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"

using namespace std;

int main() {
    // Чтение первого продукта: название, цена и количество
    string name1;
    double price1;
    int quantity1;
    cin >> name1 >> price1 >> quantity1;
    
    // Чтение второго продукта: название и цена
    string name2;
    double price2;
    cin >> name2 >> price2;
    
    // Чтение третьего продукта: только название
    string name3;
    cin >> name3;
    
    // TODO: Создайте три объекта Product, используя соответствующий конструктор для каждого
    
    // TODO: Вызовите display() для каждого продукта
    
    // TODO: Рассчитайте и выведите общую стоимость инвентаря
    // Формат: "Total inventory value: $<значение>"
    // Используйте fixed и setprecision(1) для одного десятичного знака
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование