Reguły deklarowania konstruktorów
Konstruktor ma taką samą nazwę jak klasa.Zgodnie z regułami przeciążania funkcji można zadeklarować dowolną liczbę konstruktorów. (Aby uzyskać więcej informacji, zobacz Przeciążanie.)
class-name ( argument-declaration-list )
Uwagi
argument-declaration-list może być pusta.
Język C++ definiuje dwa specjalne rodzaje konstruktorów: domyślny i kopiujący (zostały one opisane w poniższej tabeli).
Konstruktory: domyślny i kopiujący
Rodzaj konstrukcji |
Argumenty |
Cel |
---|---|---|
Konstruktor domyślny |
Może być wywoływany bez argumentów |
Konstruuje domyślny obiekt o typie danej klasy |
Konstruktor kopiujący |
Może zaakceptować pojedynczy argument odwołania do typu tej samej klasy |
Kopiuje obiekty o typie danej klasy |
Konstruktory domyślne mogą być wywoływane bez argumentów.Jednakże, możesz zadeklarować konstruktor domyślny z listą argumentów, pod warunkiem, że wszystkie argumenty mają wartości domyślne.Podobnie, konstruktory kopiowania muszą akceptować pojedynczy argument odwołania do typu tej samej klasy.Można dostarczyć więcej argumentów, pod warunkiem, że każdy kolejny argument posiada wartość domyślną.
Jeśli nie dostarczysz żadnego konstruktora, kompilator spróbuje wygenerować konstruktor domyślny.Jeśli nie dostarczysz konstruktora kopiującego, kompilator spróbuje go wygenerować.Konstruktory wygenerowane przez kompilator są traktowane jak publiczne funkcje elementów członkowskich.Jeśli określisz konstruktor kopiujący, którego pierwszy argument jest obiektem, a nie odwołaniem, to wygenerowany zostanie błąd.
Konstruktor domyślny wygenerowany przez kompilator ustawia obiekt (inicjuje vftables i vbtables, jak opisano wcześniej) i wywołuje konstruktory domyślne klas podstawowych oraz elementów członkowskich, ale nie podejmuje żadnej innej akcji.Konstruktory klas podstawowych i elementów członkowskich są wywoływane tylko jeśli istnieją, są dostępne i jednoznaczne.
Konstruktor kopiujący wygenerowany przez kompilator ustawia nowy obiekt i wykonuje kopię zawartości wszystkich elementów członkowskich kopiowanego obiektu.Jeśli istnieje konstruktor klasy podstawowej lub elementu członkowskiego, to zostanie on wywołany; w przeciwnym razie wykonywane jest kopiowanie bitowe.
Jeśli wszystkie klasy podstawowe i elementów członkowskich klasy type mają konstruktory kopiujące, które akceptują argument const, to konstruktor kopiujący wygenerowany przez kompilator też będzie akceptować pojedynczy argument typu consttype**&.W przeciwnym razie, konstruktor kopiujący wygenerowany przez kompilator akceptuje pojedynczy argument typu type&**.
Możesz użyć konstruktora, aby zainicjować obiekt const lub volatile, ale sam konstruktor nie może zostać zadeklarowany jako const ani volatile.Jedyną dozwoloną klasą magazynowania dla konstruktora jest w tekście; użycie innego modyfikatora klasy magazynowania konstruktora, łącznie ze słowem kluczowym __declspec, spowoduje błąd kompilatora.
Konwencja wywoływania stdcall jest używana dla statycznych funkcji elementów członkowskich oraz funkcji globalnych, zadeklarowanych przy użyciu słowa kluczowego __stdcall i nieużywających listy zmiennych argumentów.Jeśli użyjesz słowa kluczowego __stdcall na niestatycznej funkcji elementu członkowskiego, takiej jak konstruktor, to kompilator użyje konwencji wywoływania "thiscall".
Konstruktory klas podstawowych nie są dziedziczone przez klasy pochodne.Gdy tworzony jest obiekt o typie klasy pochodnej, konstrukcja rozpoczyna się od składników klasy podstawowej, a następnie przenoszona jest na składniki klasy pochodnej.Kompilator używa konstruktora każdej klasy podstawowej, gdy inicjowana jest część kompletnego obiektu (z wyjątkiem przypadków dziedziczenia wirtualnego, jak opisano w Inicjowanie klasy podstawowej).