Menu
Coddy logo textTech

Konstruktor z parametrami

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 19 z 104.

Konstruktor parametryzowany przyjmuje argumenty, które pozwalają zainicjalizować obiekt określonymi wartościami w chwili jego tworzenia. Zamiast polegać na wartościach domyślnych, możesz dostosować stan początkowy każdego obiektu.

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);

Możesz zdefiniować wiele konstruktorów sparametryzowanych z różnymi listami parametrów. Nazywa się to przeciążaniem konstruktorów, a kompilator wybiera odpowiedni konstruktor na podstawie podanych przez Ciebie argumentów.

class Rectangle {
    int width, height;
public:
    Rectangle(int side) {          // Kwadrat
        width = height = side;
    }
    
    Rectangle(int w, int h) {      // Rectangle
        width = w;
        height = h;
    }
};

Rectangle square(10);        // Wywołuje pierwszy konstruktor
Rectangle rect(10, 20);      // Wywołuje drugi konstruktor

Parametry mogą mieć wartości domyślne, dzięki czemu niektóre argumenty są opcjonalne. Ogranicza to potrzebę tworzenia wielu przeciążonych konstruktorów.

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

Enemy goblin("Goblin");       // damage domyślnie ma wartość 10
Enemy dragon("Dragon", 50);   // damage ustawione na 50

Pamiętaj z poprzedniej lekcji: gdy zdefiniujesz konstruktor z parametrami, kompilator nie generuje już automatycznie konstruktora domyślnego. Jeśli potrzebujesz obu, musisz jawnie zdefiniować konstruktor domyślny.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system magazynowy, który pokazuje, jak konstruktory z parametrami umożliwiają tworzenie obiektów z określonymi wartościami początkowymi oraz jak przeciążanie konstruktorów zapewnia elastyczność podczas tworzenia obiektów.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • Product.h: Zdefiniuj klasę Product, która reprezentuje produkty w magazynie. Twoja klasa powinna mieć:
    • Prywatne atrybuty: name (ciąg znaków), price (liczba typu double) oraz quantity (liczba całkowita)
    • Konstruktor przyjmujący wszystkie trzy parametry (name, price, quantity), aby w pełni zainicjalizować produkt
    • Konstruktor przyjmujący tylko name i price, z domyślną wartością quantity równą 1
    • Konstruktor przyjmujący tylko name, z domyślną wartością price równą 0.0 i domyślną wartością quantity równą 0
    • Metodę display(), która wyświetla informacje o produkcie w formacie: "<name>: $<price> (x<quantity>)"
    • Metodę getTotalValue(), która zwraca iloczyn price i quantity
  • main.cpp: Pokaż działanie wszystkich trzech konstruktorów, wczytując dane i tworząc produkty na różne sposoby. Wczytaj następujące dane:
    • Pierwszy wiersz: nazwę produktu, cenę i ilość (oddzielone spacjami)
    • Drugi wiersz: nazwę produktu i cenę (oddzielone spacjami)
    • Trzeci wiersz: tylko nazwę produktu
    Utwórz trzy obiekty Product, używając odpowiedniego konstruktora dla każdego zestawu danych wejściowych, wywołaj dla każdego z nich display(), a następnie wyświetl łączną wartość wszystkich trzech produktów w formacie: "Total inventory value: $<value>"

Wyświetlaj ceny z dokładnością do dwóch miejsc po przecinku. Na przykład, jeśli utworzysz produkt "Laptop" z ceną 999.99 i ilością 5, wyświetlone powinno być "Laptop: $999.99 (x5)".

Dołącz plik nagłówkowy w pliku main.cpp za pomocą #include "Product.h".

Spróbuj swoich sił

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

using namespace std;

int main() {
    // Wczytaj pierwszy produkt: nazwę, cenę i ilość
    string name1;
    double price1;
    int quantity1;
    cin >> name1 >> price1 >> quantity1;
    
    // Wczytaj drugi produkt: nazwę i cenę
    string name2;
    double price2;
    cin >> name2 >> price2;
    
    // Wczytaj trzeci produkt: tylko nazwę
    string name3;
    cin >> name3;
    
    // TODO: Utwórz trzy obiekty Product, używając odpowiedniego konstruktora dla każdego z nich
    
    // TODO: Wywołaj display() dla każdego produktu
    
    // TODO: Oblicz i wypisz łączną wartość zapasów
    // Format: "Total inventory value: $<value>"
    // Użyj fixed i setprecision(1), aby wyświetlić jedno miejsce po przecinku
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online