Speciální členské funkce - Special member functions
Speciální členské funkce[1] v C ++ jsou funkce, které překladač se automaticky vygenerují, pokud jsou použity, ale programátor je výslovně nehlásí. Automaticky generované speciální členské funkce jsou:
- Výchozí konstruktor pokud není výslovně deklarován žádný jiný konstruktor.
- Kopírovat konstruktor pokud není výslovně deklarován žádný konstruktor přesunutí a operátor přiřazení přesunutí.
- Pokud je deklarován destruktor, je zastaralé generování konstruktoru kopie (C ++ 11, návrh N3242 [2]).
- Přesuňte konstruktor pokud není výslovně deklarován žádný konstruktor kopírování, operátor přiřazení kopírování, operátor přesunutí přiřazení a destruktor.
- Zkopírujte operátor přiřazení pokud není výslovně deklarován žádný konstruktor přesunutí a operátor přiřazení přesunutí.
- Pokud je deklarován destruktor, je zastaralé generování operátoru přiřazení kopie.
- Přesunout operátor přiřazení pokud není explicitně deklarován žádný konstruktor kopírování, operátor přiřazení kopírování, konstruktor přesunu a destruktor.
- Destruktor
V těchto případech kompilátor generuje verze těchto funkcí a po členech úkon. Například destruktor generovaný destruktorem zničí každý dílčí objekt (základní třídu nebo člena) objektu.
Funkce generované kompilátorem budou veřejnost
, ne-virtuální[3] a obdrží konstruktor kopírování a operátory přiřazení konst
parametry (a nesmí být z alternativní právní formy ).
Příklad
Následující příklad zobrazuje dvě třídy: Výslovný pro které jsou výslovně deklarovány všechny speciální členské funkce a Implicitní pro které nejsou deklarovány žádné.
#zahrnout <iostream>#zahrnout <string>#zahrnout <utility>třída Výslovný { veřejnost: Výslovný() { std::cout << "Výchozí konstruktor" << zpráva_ << ''; } explicitní Výslovný(std::tětiva zpráva) : zpráva_(std::hýbat se(zpráva)) { std::cout << "Nestandardní konstruktor" << zpráva_ << ''; } Výslovný(konst Výslovný& jiný) { std::cout << "Konstruktor kopírování" << zpráva_ << ''; *tento = jiný; // vyvolat operátor přiřazení kopie } Výslovný& operátor=(konst Výslovný& jiný) { std::cout << „Operátor kopírování přiřazení“ << zpráva_ << ''; -li (tento != &jiný) { zpráva_ = jiný.zpráva_; } vrátit se *tento; } Výslovný(Výslovný&& jiný) noexcept { std::cout << "Přesunout konstruktor" << zpráva_ << ''; *tento = std::hýbat se(jiný); // vyvolat operátor přiřazení přesunu } Výslovný& operátor=(Výslovný&& jiný) noexcept { std::cout << „Přesunout operátor přiřazení“ << zpráva_ << ''; -li (tento != &jiný) { zpráva_ = std::hýbat se(jiný.zpráva_); } vrátit se *tento; } ~Výslovný() { std::cout << „Destruktor“ << zpráva_ << ''; } soukromé: příteli třída Implicitní; std::tětiva zpráva_;};třída Implicitní : veřejnost Výslovný { veřejnost: prázdnota Spew() { std::cout << "Implicitní(" << zpráva_ << ", " << člen_.zpráva_ << ")"; } soukromé: Výslovný člen_;};
Podpisy
Tady jsou podpisy speciálních členských funkcí:
Funkce | syntaxe pro třídu MyClass |
---|---|
Výchozí konstruktor | Moje třída(); |
Kopírovat konstruktor | MyClass (const MyClass a další); |
Přesuňte konstruktor | MyClass (MyClass && other) noexcept; |
Zkopírujte operátor přiřazení | MyClass & operator = (const MyClass & other); |
Přesunout operátor přiřazení | MyClass & operator = (MyClass && other) noexcept; |
Destruktor | ~ MyClass () noexcept; |
C ++ 03
V C ++ 03 před zavedením přesunout sémantiku speciální členské funkce[4] byly:
- Výchozí konstruktor (pokud není výslovně deklarován žádný jiný konstruktor)
- Kopírovat konstruktor
- Zkopírujte operátor přiřazení
- Destruktor
Reference
- ^ ISO / IEC (2011). ISO / IEC 14882: 2011 (3. vyd.). ISO / IEC. s. §12.
- ^ http://accu.org/index.php/journals/1896
- ^ S výjimkou destruktoru, pokud základní třída již má virtuální destruktor.
- ^ ISO / IEC (1998). Mezinárodní norma ISO / IEC 14882: Programovací jazyky — C ++ = Programovací jazyky — C ++ (1. vyd.). ISO / IEC. s. §12. OCLC 71718919.