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 konstruktorParametry 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 50Pamię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.
Wyzwanie
ŁatwyStwó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) orazquantity(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.0i 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
- Prywatne atrybuty:
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
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;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online