explicit i operator przypisania

Odpowiedz Nowy wątek
2011-08-10 23:06
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.

Pozostało 580 znaków

2011-08-10 23:14
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.

Pozostało 580 znaków

2011-08-11 07:36
0

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

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

Pozostało 580 znaków

2011-08-11 08:23
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;
  2. 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)
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 ;) - nwnuinr 2011-08-11 08:42
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 - Shalom 2011-08-11 09:02

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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