2010-02-20 28 views
7

Myślałem, że inicjalizacja kontroli konstruktorów i operator = kontrola funkcji w C++. Dlaczego ten kod działa?Przypisanie vs Inicjalizacja w C++

#include <iostream> 
#include <cmath> 
using namespace std; 

class Deg { 
    public: 
     Deg() {} 
     Deg(int a) : d(a) {}   
     void operator()(double a) 
     { 
      cout << pow(a,d) << endl; 
     } 

    private: 
     int d; 
}; 

int 
main(int argc, char **argv) 
{ 
    Deg d = 2; 
    d(5); 
    d = 3; /* this shouldn't work, Deg doesn't have an operator= that takes an int */ 
    d(5); 
    return 0; 
} 

Na trzeciej linii głównej funkcji, jestem przypisywania int do obiektu klasy Deg. Ponieważ nie mam funkcji operator=(int), myślałem, że to z pewnością nie powiedzie się ... ale zamiast tego wywołuje konstruktor Deg(int a). A więc czy konstruktorzy również kontrolują przypisanie?

Odpowiedz

18

Jest to tak zwana niejawna konwersja typu. Kompilator sprawdzi, czy istnieje konstruktor, który bezpośrednio zmieni typ przypisywany do typu, który próbujesz przypisać, i wywołaj go. Można zatrzymać jej dzieje poprzez dodanie słowa kluczowego explicit przed konstruktora nie chciałby być niejawnie nazywa, tak:

explicit Deg(int a) : d(a) {}

+0

+1 do wyraźnej – dimba

+3

Przynajmniej jednej firmie pracowałem na miał regułę „stosowanie na jawne wszystkich konstruktorów, chyba że istnieje dobry powód, aby nie "wśród swoich standardów kodowania. Pomaga to uniknąć takich zagadkowych sytuacji. – Sean

+0

Przypuszczam, że masz na myśli wszystkie konstruktory, które można wywoływać za pomocą pojedynczego argumentu :)? –

4

prostu do wyjaśnienia JonM za odpowiedź:

uzyskać jak linia d = 3, operator przypisania jest zaangażowany w. 3 jest niejawnie konwertowane na Deg, jak JonM powiedział, a następnie Deg jest przypisany do d przy użyciu operatora przypisania przypisania generowane przez kompilator (który domyślnie wykonuje przypisanie członka). Jeśli chcesz, aby zapobiec zadanie, trzeba zadeklarować prywatny operator przypisania (a nie realizować go):

//... 
private: 
    Deg& operator=(const Deg&); 
} 
Powiązane problemy