2013-06-18 16 views
7

tej pory wiem, że jeśli chcesz przekazać wartości domyślnej dla argumentu do funkcji, która jest obiektem, robisz to tak:domyślne wartości obiektu w funkcji z domyślną argumentu wartości

void function(MyObject obj = MyObject()){ 
    ... 
} 

jednak , Ostatnio udało mi się znaleźć interesującą składnię, co mnie wprawia w zakłopotanie. Co się dzieje, gdy wywołujemy taką funkcję?

void function(MyObject obj = 0){ 
    ... 
} 

Uwaga, mijamy obiekt, a nie wskaźnik. Powyższy kod kompiluje się dobrze, bez błędów i ostrzeżeń. I to zawsze wywołuje konstruktor z jednym argumentem - MyObject jest zdefiniowany następująco:

class MyObject{ 
public: 
    MyObject(double n){std::cout << "Argumented\n";} 
    MyObject(){std::cout << "Default\n";} 
}; 

Również gdzie jest to zachowanie udokumentowane (bo szukałem i nie mógł go znaleźć)?

+1

Standardowy rozdział C++ 4 (konwersja standardowa) i rozdział 12.3 (Specjalne funkcje członkowskie/Konwersje). A także 13.3.3.1 (niejawne sekwencje kowantacji). – jrok

+0

@jrok Wielkie dzięki. –

+0

Nie ma za co. Numery rozdziałów pochodzą z wersji roboczej n3337, ale oczekiwałbym, że będą takie same w oficjalnym (C++ 11) standardzie. – jrok

Odpowiedz

11

Parametr domyślny to MyObject domyślnie zbudowany z 0, przez wywołanie konstruktora MyObject(double). Ten konstruktor pozwala niejawnie instancję MyObjects takiego:

MyObject o1 = 0; 
MyObject o2 = 420/10.; 

Jeśli takie zachowanie nie jest przeznaczony, a następnie dokonać konstruktora explicit. Będzie to również wymagać zmiany function „s domyślny parametr:

explicit MyObject(double n); 

i

void function(MyObject obj = MyObject(0)); 
+1

Jeśli chcesz wyłączyć to zachowanie, możesz oznaczyć konstruktora jako 'wyraźny' – WaelJ

+0

Och, prawda ... Dlaczego wcześniej o tym nie pomyślałem? Dzięki. –

5

myObject jak pokazano ma tzw implicit converting constructor z podwójnie. Ponieważ 0 oznacza podwójne, efekt, który widzisz, jest taki sam, jak w przypadku MyObject (0.0).

4

Pod warunkiem, że następujące wyrażenie:

MyObject obj = 0; 

kompiluje i ma wartość typu MyObject, następnie wywołanie funkcji robienia MyObject będzie mógł działać w ten sam sposób.

Wyobraźmy sobie tę funkcję podpis:

void function(MyObject obj){ 
    ... 
} 

i następujący kod rozmówcy:

MyObject obj = 0; 
function(obj); 

Jest to odpowiednik tego drugiego kodu wywołującego:

function(MyObject obj = 0); 

Ponieważ wartość MyObject obj = 0; jest równy MyObject, który został skonstruowany ed w tej linii kodu.

Po prostu robisz krok do przodu i podajesz domyślną wartość parametru , korzystając z tej samej reguły.

Powiązane problemy