Speciální členské funkce v programovacím jazyce C++ jsou funkce, které překladač vygeneruje automaticky, pokud jsou používané, ale nejsou explicitně programátorem deklarované. Automaticky generované speciální členské funkce jsou: Implicitní konstruktor, pokud žádný jiný konstruktor není explicitně deklarován. Kopírovací konstruktor, pokud není explicitně deklarován žádný přesouvací konstruktor ani přesouvací přiřazovací operátor. Pokud je deklarován destruktor, automatické vytvoření kopírovacího konstruktoru, není doporučované (C++11, návrh N3242). Přesouvací konstruktor, pokud není explicitně deklarován kopírovací konstruktor, kopírovací přiřazovací operátor, přesouvací přiřazovací operátor ani destruktor. Kopírovací přiřazovací operátor, pokud není explicitně deklarován přesouvací konstruktor ani přesouvací přiřazovací operátor jsou explicitně deklarovány. Pokud destruktor je deklarován, automatické vytvoření kopírovacího přiřazovacího operátoru není doporučované. Přesouvací operátor přiřazení, pokud není explicitně deklarován kopírovací konstruktor, kopírovací přiřazovací operátor, přesouvací konstruktor ani destruktor. Destruktor
Překladačem vytvořené implicitní verze těchto funkcí provádějí operace po jednotlivých členech. Například překladačem generovaný destruktor postupně uvolní každý podobjekt (bázovou třídu nebo člen) objektu.
Překladačem generované funkce budou public, nebudou virtuálníKromě destruktoru, pokud bázová třída již má virtuální destruktor., a parametry kopírovacího konstruktoru a operátorů přiřazení budou mít const& (a nebudou mít alternativní povolené formy).Podobně parametr přesouvacího konstruktoru a přesouvacího operátoru přiřazení budou mít &&, nikoli žádné alternativní povolené formy.
V C++03, před zavedením přesunové sémantiky v C++11, byly následující speciální členské funkce: Implicitní konstruktor (pokud žádný jiný konstruktor není explicitně deklarován) Kopírovací konstruktor Kopírovací přiřazovací operátor Destruktor __NOTOC__
Příklad Následující příklad ukazuje dvě třídy: Explicit, pro kterou jsou všechny speciální členské funkce explicitně deklarovány, a Implicit, pro kterou nejsou explicitně deklarovány žádné speciální členské funkce.
import std;
using std::string;
class Explicit { private: string message; public: Explicit() { std::println("Implicitní konstruktor {}");
explicit Explicit(string message): message{std::move(message)} { std::println("Neimplicitní konstruktor {}", message);
Explicit(const Explicit& other) { std::println("Kopírovací konstruktor {}", message); *this = other; // vyvolá kopírovací operátor přiřazení
Explicit& operator=(const Explicit& other) { std::println("Kopírovací operátor přiřazení {}", message); if (this != &other) { message = other.message;
return *this;
Explicit(Explicit&& other) noexcept { std::println("Přesouvací konstruktor {}", message); *this = std::move(other); // vyvolá přesouvací operátor přiřazení
Explicit& operator=(Explicit&& other) noexcept { std::println("Přesouvací operátor přiřazení {}", message); if (this != &other) { message = std::move(other.message);
return *this;
~Explicit() { std::println("Destruktor {}", message);
class Implicit : public Explicit { private: Explicit member; public: void spew() { std::println("Implicit({}, {})", message, member.message);
Signatury Signatury speciálních členských funkcí jsou následující:
Funkce syntax pro třída X Implicitní konstruktor X(); Kopírovací konstruktor X(const X& other); Přesouvací konstruktor X(X&& other); Kopírovací přiřazovací operátor X& operator=(const X& other); Přesouvací přiřazovací operátor X& operator=(X&& other); Destruktor ~X();
Odkazy
Reference
Kategorie:C++ Kategorie:Články s ukázkami kódu v C++