Konstruktory i listy inicjalizacyjne składowych
Czytelnie inicjalizuj składowe za pomocą list inicjalizacyjnych składowych
Konstruktory i listy inicjalizacyjne składowych to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Czym jest konstruktor
Konstruktor to specjalna metoda uruchamiana podczas tworzenia obiektu. Ma taką samą nazwę jak klasa i nie ma typu zwracanego.
class Point {
public:
Point() { // default constructor
x_ = 0;
y_ = 0;
}
private:
int x_, y_;
};Konstruktory sparametryzowane
Konstruktory mogą przyjmować parametry i można zdefiniować kilka ich przeciążeń.
class Point {
int x_, y_;
public:
Point() : x_(0), y_(0) {}
Point(int x, int y) : x_(x), y_(y) {}
};Listy inicjalizatorów składowych
Składnia : member(value) przed treścią konstruktora to lista inicjalizatorów składowych. Składowe są inicjalizowane tutaj — a nie przypisywane później w treści konstruktora.
class Person {
std::string name_;
int age_;
public:
Person(std::string n, int a) : name_(std::move(n)), age_(a) {}
};Po co używać list inicjalizacyjnych
Składowe są konstruowane dokładnie raz, z właściwą wartością. Bez listy są konstruowane domyślnie, a następnie przypisywane — jest to nieefektywne w przypadku typów nietrywialnych.
Kolejność inicjalizacji
Składowe są inicjalizowane w kolejności, w jakiej zadeklarowano je w klasie — nie w kolejności z listy inicjalizacyjnej. Zachowaj tę samą kolejność, aby uniknąć nieporozumień.
Domyślne inicjalizatory w klasie (C++11)
Można nadać składowym wartości domyślne bezpośrednio w treści klasy. Jest to przydatne, gdy większość konstruktorów korzysta z tych samych wartości domyślnych.
class Buffer {
size_t size_ = 0;
char* data_ = nullptr;
public:
Buffer() = default;
Buffer(size_t n) : size_(n), data_(new char[n]) {}
};= default i = delete
Można polecić kompilatorowi dostarczenie specjalnej funkcji składowej albo jej usunięcie:
class Widget {
public:
Widget() = default; // compiler-generated default
Widget(const Widget&) = delete; // disable copy
};Konstruktory delegujące (C++11)
Konstruktor może wywołać inny konstruktor tej samej klasy, aby współdzielić logikę inicjalizacji.
class Box {
int w_, h_, d_;
public:
Box(int w, int h, int d) : w_(w), h_(h), d_(d) {}
Box() : Box(1, 1, 1) {} // delegates to the 3-arg ctor
};Jawne konstruktory
Konstruktory jednoargumentowe mogą być używane w konwersjach niejawnych. Oznacz je jako explicit, aby zapobiec nieoczekiwanym konwersjom.
class Vector {
public:
explicit Vector(size_t n);
};
Vector v = 10; // ERROR: explicit prevents this
Vector v(10); // OKDestruktory
Destruktor ~ClassName() jest wykonywany, gdy obiekt zostaje zniszczony. Używaj go do zwalniania zasobów, takich jak pliki, gniazda i pamięć surowa.
Reguła pięciu (zajawka)
Jeśli definiujesz dowolną ze specjalnych funkcji składowych — destruktor, konstruktor kopiujący, operator przypisania kopiującego, konstruktor przenoszący lub operator przypisania przenoszącego — weź pod uwagę wszystkie pięć. Temat ten omówiono w kursie o semantyce przenoszenia.
Szybkie sprawdzenie
Co określa kolejność inicjalizacji składowych klasy?
Podsumowanie
Używaj konstruktorów do ustalania stanu obiektu. Preferuj listy inicjalizacyjne składowych zamiast przypisań w treści konstruktora. Oznaczaj konstruktory jednoargumentowe jako explicit i używaj = default / = delete, aby wyrażać intencje.
Często zadawane pytania
Czy lekcja „Konstruktory i listy inicjalizacyjne składowych” jest bezpłatna?
Tak — pełny tekst „Konstruktory i listy inicjalizacyjne składowych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Konstruktory i listy inicjalizacyjne składowych”?
Czytelnie inicjalizuj składowe za pomocą list inicjalizacyjnych składowych Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Konstruktory i listy inicjalizacyjne składowych”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- struct a class — kiedy używać którego
- Zmienne składowe i metody
- Konstruktory i listy inicjalizacyjne składowych
- Wskaźnik this i enkapsulacja