2012-06-05 26 views
6

Ho usato C++ e Java da diversi anni. Una cosa che non riesco a capire è che perché abbiamo bisogno di fornire ai costruttori di una classe un nome? Ad esempio, se devo definire una classe FOO in C++/Java, sarò costretto a fornire FOO come nome del costruttore. Tuttavia, poiché il costruttore non viene mai chiamato esplicitamente, quale è il senso nel compilatore che mi costringe a fornirgli un nome dopo tutto.Che senso ha dare nomi ai costruttori

Il paradigma dell'astrazione detta, nascondiamo i dettagli non necessari dai programmatori. Questo è il motivo, i costruttori non hanno un tipo di ritorno, poiché è già ben definito ciò che un costruttore deve restituire. Nello stesso spirito, perché non possiamo solo dare un nome generico per i costruttori di tutte le classi - per esempio qualcosa di significativo, come initialize() o forse solo nulla e solo argomenti ([arg [,arg]])

spero, io sono in grado di esprimermi . Se qualcuno ha delle risposte definitive, cortesemente fammi sapere.

+0

Come sidenote interessante, PHP ha un nome generico per costruttori '__construct' – xbonez

+2

Questa domanda è più adatta per [Programmatori] (http://programmers.stackexchange.com/). –

+1

+1 per il pensiero radicale !! – WickeD

risposta

2

Dalla C++ standard (12,1) (sottolineatura mia):

Costruttori non hanno nomi. Una sintassi di dichiaratore speciale viene utilizzata per dichiarare o definire il costruttore. La sintassi utilizza:

  • un decl-specifier-Seq opzionale in cui ogni decl-specifier è o una funzione-identificatore o constexpr,
  • nome della classe del costruttore, e
  • una lista di parametri

In C++, non si sta fornendo un nome, si sta scrivendo una sintassi speciale che è stata decisa dai creatori del linguaggio per dichiarare un costruttore.

+0

Sì, lo so. Tuttavia, dal punto di vista del linguaggio, non è ottimale applicare questa sintassi. Capisco perfettamente che i costruttori non saranno rappresentati come altri metodi, che il loro nome viene scartato, ma il dover fare del lavoro in più sembra noioso. Immagina una classe in cui abbiamo 10 versioni sovraccaricate. Una notazione concisa sarebbe stata una scelta di design migliore. – VaidAbhishek

+1

@VaidAbhishek: che può essere discusso. In C++, C# e Java, viene utilizzato il nome della classe. Personalmente penso che sia il modo più logico. –

+0

@VaidAbhishek: È davvero un compito così oneroso copiare/incollare il nome della classe una volta per ogni costruttore e distruttore? – Blastfurnace

-2

poiché non è possibile chiamare esplicitamente il costruttore, qual è lo scopo di assegnare un nome speciale ad esso? e sui costruttori che hanno un nome uguale alla classe: la costruzione può essere eseguita solo in una funzione, quindi il costruttore è una funzione. e poiché è una funzione speciale, tra le altre funzioni di classe dovrebbe avere una firma speciale. i progettisti di linguaggi volevano che fossero identificati con la classe.

1

è uno standard per la lingua, se si desidera avere un nome generico per costruttore, quindi provare ad apprendere un'altra lingua o magari creare la propria lingua. = p

+2

In attesa di 125 punti reputazione. – VaidAbhishek

0

I costruttori sono funzione membro speciale e il costruttore restituisce sempre l'indirizzo di memoria creato dall'operatore 'nuovo'. Poiché una funzione restituisce solo una cosa alla volta, nessun altro valore può essere restituito dal costruttore. È lo standard java per definire un nome costruttore come il nome della classe.

+0

Capisco la semantica, ma la mia domanda è a livello di progettazione. Perché forzare un programmatore a definire un nome dopo tutto. Penso che tu non abbia capito la mia domanda. – VaidAbhishek

0

Primo, non è necessario scrivere un costruttore. se non ne scrivi uno - il compilatore creerà per te un costruttore predefinito.

secondo, a volte è necessario utilizzarne uno (ad esempio, se si dispone di variabili di classe finali, è necessario inizializzarle al momento della creazione dell'oggetto). In questo caso devi scrivere un costruttore e lo userai quando installi l'oggetto.

public class Foo { 
    final int a; 

    public Foo (int val){ 
     this.a = val 
    } 
} 

Foo foo = new Foo (23); 
3

In costruttori C++ non hanno nomi (C++ 03 12.1), ma dal momento che i costruttori sono essenzialmente definite come funzioni, era logico assegnare loro un nome in qualche modo.
Assegnare loro un nome diverso dal nome della classe avrebbe aggiunto nuove parole chiave e quindi, alla fine, sono stati nominati come il nome della classe.
In breve, è stata una decisione logica che ha evitato nuove parole chiave e allo stesso tempo ha garantito l'intuitività.

+0

Sì, hai ragione. Ma qui sto parlando di non aggiungere parole chiave aggiuntive, ma semplicemente di rimuovere un vincolo, che sembra un dettaglio non necessario. Ad esempio, qualcuno ha menzionato che in PHP abbiamo alcuni notation __construct, per definire un costruttore, che è comune a tutte le classi. In python abbiamo anche la parola chiave __init__ per definire una funzionalità simile al costruttore. Questi nomi rendono il costruttore emergente più esplicito nel loro significato. Ad ogni modo, penso che sia una decisione di progettazione e forse può essere migliorata nelle iterazioni future.Stavo solo riflettendo su di esso e ho deciso di sollecitare pareri su di esso. – VaidAbhishek

+1

@VaidAbhishek: gli esempi di lingua che hai citato aggiungono nuove parole chiave, quando il C++ è stato progettato ci sono stati sforzi consapevoli per mantenere le parole chiave al minimo, quindi usare una nuova parola chiave sarebbe un sovraccarico. ** Non esiste un vincolo specifico **. Un altro linguaggio ti costringerebbe ad usare una parola chiave, il C++ ti obbliga ad usare il nome della classe (* nel processo non inventando una nuova parola chiave *). Inoltre, ogni lingua è progettata con una grammatica specifica, Non si possono discutere aspetti di questa grammatica , è semplicemente perché il designer però lo voleva. –

+0

C++ avrebbe bisogno di più di un solo nome. Anche i distruttori e i costruttori di copie non hanno nomi. Ma siamo realistici: qualsiasi IDE decente può usare la codifica a colori. Vedere un nome di classe colorato come un nome di funzione è una chiara indicazione visiva che hai a che fare con il ctor. – MSalters

1

Per Java e C++, il nome del costruttore deve essere uguale al nome della classe. Inoltre, sai che è un costruttore, perché non dichiara un tipo di reso. Questo modo di dichiarare un costruttore ti aiuta a dichiarare un metodo il cui nome è __init__, initialize o __constructor. Questo non è possibile in Python, ad esempio, perché utilizza __init__ come nome del costruttore.

0

Hai ragione riguardo la tua linea di pensiero. La sintassi Java adottata è solo un artefatto storico.

Nelle lingue più recenti che supportano l'OOP, questa ridondanza è generalmente assente. Scala chiama this *, F # chiama new *, Python chiama __init__, Ruby chiama initialize ecc


* costruttori ausiliari comunque. I costruttori primari in queste lingue sono gli stessi argomenti di classe.

Problemi correlati