perché gli argomenti predefiniti in C++ sono quelli finali?perché gli argomenti predefiniti sono quelli finali?
risposta
se avessi void func(int a = 0, int b);
, come specificheresti di utilizzare il parametro predefinito nel chiamare questa funzione?
So che non è possibile in C++, ma altri linguaggi lo gestiscono con 'func (, some_val_for_b)', o parametri con nome. –
@Dominic Rodger: a me sembra davvero brutto. – dierre
@Dominic Rodger, beh, il C++ no. Se vuoi puoi fare causa a Stroupstroup: P –
Perché in una chiamata di funzione è necessario chiamare gli argomenti non predefiniti in ogni caso. Se metti l'argomento predefinito all'inizio dell'elenco degli argomenti, come dovresti dire che stai impostando l'argomento predefinito o gli altri?
Cos'è che rende l'inizio di una lista così fondamentalmente diversa dalla fine della lista? Le liste sono simmetriche! –
Sì, ma immaginate questo: void func (int a, int b = 0, int c, int d = 0); Cosa stai facendo quando chiami func (1, 2, 3); –
E quale fine della lista, esattamente, è 'b' su? –
Solo per integrare la risposta di @ tenfour. Domande frequenti su C++ Lite ha un argomento che descrive named parameters e penso che l'argomento risolva in qualche modo il problema.
Perché è così che è stato progettato il linguaggio.
Una domanda più interessante sarebbe: quali sono le alternative?
Supponiamo di avere void f(A a = MyA, B b);
- Segnaposto/argomento vuoto:
f(_, abee)
of(, abee)
- argomenti con nome (come in Python):
f(b = abee)
Ma quelli sono sottigliezze e certamente non necessarie, a causa a differenza di Python C++ supporta l'overloading delle funzioni:
void f(A a, B b);
void f(B b) { f(MyA, b); }
e, quindi, gli argomenti di default sono inutili ... soprattutto se si considera che ci sono problemi quando viene utilizzato con OO-codice perché gli argomenti predefiniti sono risolti staticamente (compile-time)
struct Base
{
virtual void func(int g = 3);
};
struct Derived
{
virtual void func(int g = 4);
};
int main(int argc, char* argv[])
{
Derived d;
d.func(); // Derived::func invoked with g == 4
Base& b = d;
b.func(); // Derived::func invoked with g == 3 (AH !!)
}
EDIT: su parametri denominati ->
Il la funzione può essere emulata usando gli oggetti funzione.
class Func
{
public:
Func(B b): mA(MyA), mB(b) {}
A& a(A a) { mA = a; }
B& b(B b) { mB = b; }
void operator()() { func(mA, mB); }
private:
A mA;
B mB;
};
int main(int argc, char* argv[])
{
A a; B b;
Func(b)();
Func(b).a(a)();
}
Nel caso in cui non si desidera copiare gli argomenti, si ha la possibilità di utilizzare i riferimenti/puntatori anche se può complicarsi.
È un pratico idioma quando si hanno un sacco di valori predefiniti senza un vero ordine di priorità.
L'overloading delle funzioni non aiuta se 'A' e' B' sono entrambi dello stesso tipo ... –
@Oli: perché? dato il primo prototipo 'func' è chiaro che se c'è un solo parametro allora il valore di default dovrebbe essere usato per il primo parametro, qualunque sia il loro tipo. Le cose si complicano quando si hanno due impostazioni predefinite;) In generale, i parametri denominati sono l'unica cosa che può risolvere il problema, e ciò che è grande è che sono una soluzione in fase di compilazione. –
Sì, hai ragione. Ho pensato che stavate usando il sovraccarico per disambiguare 'func (A a, B b)', 'func (B b)' * e * 'func (A a)'. –
- 1. Perché il costruttore ereditato non dovrebbe ereditare gli argomenti predefiniti?
- 2. Perché gli argomenti predefiniti non sono consentiti in una sezione Scala con parametri ripetuti?
- 3. Perché gli eventi con accessori personalizzati non possono essere attivati direttamente come fanno quelli predefiniti?
- 4. Template argomenti predefiniti
- 5. match.call con argomenti predefiniti
- 6. Perché gli argomenti non sono File.new invece di stringhe?
- 7. Dove sono definiti gli alias predefiniti in PowerShell?
- 8. argomenti predefiniti in JAR-manifesto
- 9. OCaml: valori predefiniti per gli argomenti delle funzioni?
- 10. Come definire gli argomenti JVM predefiniti in IDEA?
- 11. Imposta gli argomenti predefiniti per il blocco del codice Sweave
- 12. Perché non posso avere template e argomenti predefiniti?
- 13. Mantenere gli zero finali
- 14. Perché gli indici Rday Weekday sono diversi da quelli di Ruby?
- 15. Prolog - Gli argomenti non sono sufficientemente istanziati
- 16. Gli argomenti NULL sono una cattiva pratica?
- 17. Quali sono gli argomenti "struct file_operations"?
- 18. Prolog - Gli argomenti non sono istanziati
- 19. Gli argomenti Prolog non sono sufficientemente istanziati
- 20. funzione con argomenti predefiniti dipendenti
- 21. Ordine di default e argomenti non predefiniti
- 22. Come sono gli shader GLSL predefiniti? per la versione 330
- 23. È possibile inserire parametri predefiniti del modello prima di quelli non predefiniti?
- 24. Perché non ci sono valori predefiniti personalizzati in proto3?
- 25. Perché i membri protetti sono consentiti nelle classi java finali?
- 26. argomenti chiave Spacchettare, ma solo quelli che corrispondono alla funzione
- 27. Perché TextBlock taglia gli spazi finali dal testo?
- 28. Perché ARC mantiene gli argomenti del metodo?
- 29. Sono davvero necessari tutti gli script predefiniti caricati da Magento?
- 30. Quali sono gli indici di slice predefiniti in Python * veramente *?
La risposta che hai selezionato non risponde affatto alla tua domanda. – juanchopanza