2013-04-08 22 views
11

Nadal jestem względnie nowy w C++ i nie mogę zrozumieć różnicy w następujących dwóch sposobach kodowania funkcji, która może przyjąć jeden parametr, a może dwa lub trzy lub więcej. W każdym razie, tu jest mój punktPrzeciążenie metody lub użycie wartości domyślnych? C++

funkcja przeciążenia:

int aClass::doSomething(int required) 
{ 
    //DO SOMETHING 
} 

int aClass::doSomething(int required, int optional) 
{ 
    //DO SOMETHING 
} 

jak to jest inna, wartość domyślna:

int aClass::doSomething(int required, int optional = 0) 
{ 
    //DO SOMETHING 
} 

wiem, w różnych okolicznościach, jeden może być bardziej odpowiednie niż inne, ale jakiego rodzaju rzeczy powinienem być świadomy przy wyborze pomiędzy tymi opcjami?

Odpowiedz

6

Po pierwsze, mówimy o przeciążaniu, bez przesłonięcia. Przesłanianie odbywa się dla funkcji virtual w klasie pochodnej. Przeciążanie odnosi się do tej samej nazwy funkcji z inną sygnaturą.

Różnica jest logiczna - w pierwszym przypadku (2 wersje) dwie funkcje mogą zachowywać się zupełnie inaczej, podczas gdy drugi przypadek będzie miał mniej więcej taką samą logikę. To naprawdę zależy od ciebie.

2

Korzystasz z funkcji przeciążania, jeśli podasz kilka numerów constructor. Zaletą w tym przypadku jest to, że można reagować różnie w każdym constructor na przekazanych argumentach. Jeśli to ma znaczenie, użyj przeciążenia.
Jeśli możesz podać przyzwoite wartości default dla swoich parametrów i nie wpłynie to na prawidłowe działanie twojego kodu, użyj parametrów domyślnych.

Zobacz here dla wątku na SO.

2

Kompilator nie dba o to, którego z nich używasz. Wyobraź sobie, że napisałeś to jako dwa konstruktory i skończyły one około 20 linii. Dalsze wyobrazić, że 19 linii były identyczne, a inna linia czytać

foo = 0; 

w jednej wersji i

foo = optional; 

w drugiej. W tej sytuacji użycie opcjonalnego parametru sprawia, że ​​kod jest znacznie bardziej czytelny i zrozumiały. W innym języku, który nie miał parametrów opcjonalnych, zaimplementowałbyś to, gdyby wersja jednego parametru wywołała wersję z dwoma parametrami i przekazała mu jako drugi parametr zero.

Teraz wyobraź sobie inną parę konstruktorów lub funkcji, które znowu mają około 20 linii, ale są całkowicie różne. Na przykład drugi parametr to identyfikator, a jeśli jest podany, sprawdzasz zawartość w bazie danych, a jeśli nie, ustawiasz wartości na nullptr, 0 i tak dalej. Można mieć wartość domyślną (-1 jest popularny do tego), ale potem organizm funkcji byłoby pełne

if (ID == -1) 
{ 
    foo = 0; 
} 
else 
{ 
    foo = DbLookup(ID); 
} 

które mogą być trudne do odczytania i może sprawić, że jedną funkcję o wiele dłużej niż dwa oddzielne funkcje. Widziałem funkcje z jednym gigantem if, który rozdzielał całą całość na dwa osobne bloki bez wspólnego kodu, i widziałem ten sam stan badany 4 lub 5 razy w miarę postępu obliczeń. Oba są trudne do odczytania.

To jest rzecz o C++.Istnieje wiele sposobów na osiągnięcie większości rzeczy. Ale te różne sposoby służą innym celom, a kiedy "dostaniesz" subtelne różnice, napiszemy lepszy kod. W tym przypadku "lepszy" oznacza krótszy, szybszy (wszystkie te czasy wykonania) i bardziej ekspresyjny - ludzie czytający go mogą szybko zrozumieć twoje intencje.

11

Istnieje kilka przyczyn technicznych wolą przeciążenia domyślne argumenty, są dobrze rozplanowane w Google C++ Style Guide w Default Arguments section:

wskaźniki funkcyjne są mylące w obecności domyślnych argumentów od podpisania funkcji często nie pasuje do podpisu połączenia. Dodanie domyślnego argumentu do istniejącej funkcji zmienia jej typ, , co może powodować problemy z kodem, który podjął jego adres. Dodanie funkcji przeciążenia pozwala uniknąć tych problemów. , Gdzie pojawia się w przeciwieństwie do przeciążonych funkcji „domyślny” tylko w funkcji -

domyślne parametry mogą spowodować bulkier kodu, ponieważ są one replikowane w każdym miejscu połączenia:

i definicja.

Po stronie pozytywów to mówi:

Często masz funkcję, która wykorzystuje wartości domyślne, ale czasami chcesz nadpisać domyślne. Domyślne parametry pozwalają na łatwy sposób, aby to zrobić bez konieczności definiowania wielu funkcji dla wyjątków rzadkich .

Twój wybór będzie zależał od tego, jak istotne będą dla Ciebie negatywne problemy.

+0

Dwa spadki i brak komentarzy? –

Powiązane problemy