Programowanie obiektowe, C++
Konstruktor jawny
[lekcja] 9. Konstruktor jawny.Konstruktor jawny
Przeanalizujmy kod
#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:
#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)
#include <iostream>
class C
{
public:
explicit C( int )
{
std::cout << "konstruktor(int)" << std::endl;
}
};
int main()
{
C c = 5;
C c1( 5 );
C c2 = static_cast < C >( 5 );
C c3 = C( 5 );
C c4 =( C ) 5;
}
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.