explicit i operator przypisania

0

Cześć,

mam pewne pytanie dotyczące słówka explicit i tworzenia obiektu z operatorem "=". Otóż jak wiemy słówko explicit uniemożliwia stworzenie konstruktora konwertującego (w sensie, że konstruktor konwertujący staje się "normalnym" konstruktorem). Jednak gdy na naszym konstruktorze użyjemy tego słowa kluczowego explicit, to wtedy nie można stworzyć obiektu w ten sposób:

class aaa {
public:
  explicit aaa( const char[] x ) { // blabla }
};

// ...

aaa o = "tekst"; // blad! mozna jedynie aaa o( "tekst" );

dlaczego? Jaki jest sens w blokowaniu tworzenia obiektów za pomocą pierwszego sposobu (z operatorem przypisania)?

Pozdrawiam i dziękuję za pomoc.

0

By nie powstawała niejawna konwersja z typu argumentu na klasę, często jest to potrzebne ze względów bezpieczeństwa jak np. przy auto_ptr.

0

aa o = "tekst"; // blad! mozna jedynie aaa o( "tekst" );

no bo próbujesz właśnie dokonać konwersji z const char * na aaa.

0

@nwnuinr

  1. Pierwszy błąd: operator przypisania to nie to samo co konstruktor kopiujący! Pierwszy startuje jeśli masz obiekt i coś do niego przypisujesz
Klasa obiekt;
obiekt = cośtam;

Drugi startuje tylko w chwili tworzenia obiektu

Klasa obiekt = cośtam;
  1. Explicit uniemożliwia ci niejawną konwersję typu tym konstruktorem. Czasem tak bywa że ci ta konwersja przeszkadza np. wprowadzając niejednoznaczności (sprawdź jaki jest algorytm dopasowywania wywołania funkcji do jej definicji)

1 użytkowników online, w tym zalogowanych: 0, gości: 1