Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: pekfos
Programowanie obiektowe, C++

Składowe tworzone przez kompilator

[lekcja] 10. Składowe tworzone przez kompilator

Składowe tworzone przez kompilator

Kompilator może, dla prostych klas, utworzyć konstruktor domyślny, kopiujący i operator przypisania (jeśli nie zostały już utworzone):
C/C++
#include <iostream>

class Klasa
{
public:
    int x;
};

int main()
{
    Klasa k1;
    k1.x = 5;
   
    Klasa k2( k1 ); //konstruktor kopiujący
   
    std::cout << k1.x << " " << k2.x << std::endl;
   
    k2.x = 2;
    k1 = k2; //operator przypisania
    std::cout << k1.x << " " << k2.x << std::endl;
}
5 5
2 2
Jeżeli naszym celem jest utworzenie prostej, niekopiowalnej klasy, trzeba uniemożliwić automatyczne utworzenie konstruktora kopiującego i operatora przypisania. Jednym ze sposobów jest określenie konstruktora kopiującego i operatora przypisania jako prywatne lub chronione. Nie muszą być zdefiniowane:
C/C++
class Klasa
{
public:
    int x;
    Klasa() { }
   
private:
    Klasa( const Klasa & );
    Klasa & operator =( const Klasa & );
};
To rozwiązanie ma poważną wadę: jeśli funkcja lub metoda klasy zaprzyjaźnionej spróbuje skopiować obiekt tej klasy, błąd pojawi się dopiero na etapie łączenia, czyli po skompilowaniu wszystkich plików programu. Rozwiązaniem jest określenie konstruktora kopiującego i operatora przypisania jako usuniętych:
C/C++
class Klasa
{
public:
    int x;
    Klasa() { }
   
    Klasa( const Klasa & ) = delete; // C++11
    Klasa & operator =( const Klasa & ) = delete; // C++11
};
Poprzedni dokument Następny dokument
Konstruktor jawny Polimorfizm