2012-04-11 15 views
7

Sto studiando strutture dati (Elenco, Stack, Coda) e questa parte di codice mi confonde.operatore di assegnazione con parametro funzione C++

ListNode(const Object& theElement = Object(), ListNode * node = NULL); 


template<class Object> 
ListNode<Object>::ListNode(const Object& theElement, ListNode<Object> * node) { 
    element = theElement; 
    next = node; 
} 
  1. Perché ci sono operatori di assegnazione all'interno di parametri di funzione?
  2. Che cosa fa la chiamata Object()?

risposta

15

Questi non sono operatori di assegnazione. Questi sono default arguments per la funzione.

Una funzione può avere uno o più argomenti predefiniti, il che significa che se al punto di chiamata non viene fornito alcun argomento, viene utilizzato il valore predefinito.

void foo(int x = 10) { std::cout << x << std::endl; } 

int main() 
{ 
    foo(5); // will print 5 
    foo(); // will print 10, because no argument was provided 
} 

Nel codice di esempio che hai postato, il costruttore ListNode ha due parametri con argomenti predefiniti. Il primo argomento predefinito è Object(), che chiama semplicemente default constructor per Object. Ciò significa che se non viene passata l'istanza Object al costruttore ListNode, verrà utilizzato un valore predefinito di Object(), che significa semplicemente un valore predefinito Object.

Consulta anche:
Advantage of using default function parameter
Default value of function parameter

+0

Sono tentato di up-voto, se si desidera ricordare che i parametri di default sono una delle caratteristiche più "male" C++. Trasformano i costruttori innocenti nella conversione di costruttori o costruttori predefiniti. Fanno fatica a "legare" le funzioni. Sono un ostacolo quando devono essere specificati solo alcuni parametri e altri lasciati al valore predefinito. – pmr

+0

Neanch'io. Una taglia non va bene per tutti. A volte sono molto utili. – Spook

+0

@ pmr, non sono necessariamente d'accordo con te sul fatto che siano "cattivi". Sono un modo utile per evitare di ripetere te stesso scrivendo più costruttori, quando puoi semplicemente fornire un costruttore con un parametro predefinito. Le implementazioni di libreria standard spesso ne traggono vantaggio, ad es. 'vector (const allocator_type & a = allocator_type());' –

3

Le assegnazioni in dichiarazioni forniscono valori di default per parametri opzionali. Object() indica una chiamata al costruttore predefinito di Object.

L'effetto dei parametri predefiniti è il seguente: è possibile richiamare il costruttore ListNode con zero, uno o due parametri. Se si specificano due espressioni parametriche, queste vengono passate come al solito. Se si specifica solo un'espressione, il suo valore viene passato come primo parametro e il secondo è impostato su NULL. Se non si passano parametri, il primo parametro viene impostato come predefinito su un'istanza di Object creata con il costruttore predefinito e la seconda è impostata su NULL.