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

Konstruktor jawny

[lekcja] 9. Konstruktor jawny.

Konstruktor jawny

Przeanalizujmy kod
C/C++
#include <iostream>

class C
{
public:
    C() { }
   
    C( const C & )
    {
        std::cout << "konstruktor kopiujacy" << std::endl;
    }
   
    C & operator =( const C & )
    {
        std::cout << "operator przypisania" << std::endl;
        return * this;
    }
};

int main()
{
    C c1;
    C c2 = c1;
    c2 = c1;
}
konstruktor kopiujacy
operator przypisania
Pomimo to, że w kodzie stoi = i taki operator był zdefiniowany, wywołany został konstruktor kopiujący. Powodem takiego działania jest to, że dwa wywołania (same w sobie) są wolniejsze, niż jedno wywołanie. Gdyby był użyty operator, musiałby być również wywołany konstruktor domyślny, a tak, jest wywołany tylko konstruktor kopiujący. Oczywiście, takie zachowanie nie dotyczy tylko konstruktora kopiującego, ale też wszystkich konstruktorów o jednym, wymaganym argumencie:
C/C++
#include <iostream>

class C
{
public:
    C( int )
    {
        std::cout << "konstruktor(int)" << std::endl;
    }
};

int main()
{
    C c = 5;
}
konstruktor(int)
Aby zabronić używania konstruktora do wykonywania niejawnych konwersji, należy zadeklarować konstruktor jako jawny (ang. explicit)
C/C++
#include <iostream>

class C
{
public:
    explicit C( int )
    {
        std::cout << "konstruktor(int)" << std::endl;
    }
};

int main()
{
    C c = 5; //Blad
   
    C c1( 5 ); // OK, jawne wywołanie konstruktora
    C c2 = static_cast < C >( 5 ); // OK, jawna konwersja
    C c3 = C( 5 ); // OK, jawne wywołanie konstruktora
    C c4 =( C ) 5; // OK, jawna konwersja
}
Poprzedni dokument Następny dokument
Operatory Składowe tworzone przez kompilator