explicit i operator przypisania

explicit i operator przypisania
NW
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 12 lat
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:

Kopiuj
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.

hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:6 dni
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.


Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 13 godzin
0

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

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

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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
Kopiuj
Klasa obiekt;
obiekt = cośtam;

Drugi startuje tylko w chwili tworzenia obiektu

Kopiuj
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)

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
NW
przyczepiłbym się tylko do logiki posta, fakt dzięki, że mi o tym przypomniałeś bo już zdążyło wylecieć mi z głowy, jednak operator przypisania, jak sama nazwa wskazuje, występuje w obu przypadkach, za to konstruktor kopiujący jest wywoływany tylko w drugim (z Twojego posta) przypadku, jeśli coś źle napisałem to proszę jechać po mnie ;)
Shalom
Operator przypisania jest wywoływany TYLKO w pierwszej sytuacji. Konstruktor kopiujący tylko w drugiej. Co zresztą łatwo sprawdzić dodając tam gdzieś jakieś couty

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.