|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 9431
|
[C++]: inizializzare membri di classe
ciao a tutti ragazzi
spero in un vostro aiuto per quanto riguarda questo dubbio sul modo di scrivere un costruttore vi pongo due esempi, e vorrei capire quale è il più indicato Codice:
class AUTO{ private: const int n =50; char * marca; int prezzo; char targa [n]; public: AUTO () AUTO( char * m, int p, char t) ...... Codice:
AUTO::AUTO { const int dim=30; marca=new char [dim]; prezzo=0; for(int i=0, i<=n, i++) targa[i]=0; } oppure è meglio questa versione Codice:
class AUTO{ private: const int n =50; char * marca; int prezzo; char targa [n]; public: AUTO ():marca(0),prezzo(0),targa(0){}; AUTO( char * m, int p, char t) ......
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W 2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 9431
|
ciao sottovento
![]() grazie della risposta ho letto quello che mi hai indicato però non ho trovato la risposta alla mia domanda, o almeno in parte: se non avevo variabili particolari come array o quelli con estensione dinamica non avrei fatto la domanda il primo file di implementazione può essere sostituito da Codice:
AUTO ():marca(0),prezzo(0),targa(0){}
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W 2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
In effetti non puoi allocare dinamicamente, se metti tutto nell'initialisation list.
Ma questa e' una cosa che devi valutare tu. Onestamente preferisco effettuare le allocazioni cosi' come le hai fatte tu, nel costruttore: un'eventuale eccezione portera' alla mancata costruzione dell'oggetto e mi sembra una caratteristica importante. Ma ovviamente si tratta di gusti
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 9431
|
Quote:
![]() ![]() poichè mi sto addentrando nella programmazione e vorrei sapere se possibile le cose correte. Se ce ne sono di più forse è anche meglio: quindi posso usare l'uno o l'altro ,ma preferisci la prima versione poichè più completa? ciao ![]()
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W 2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370. |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Pero' non puoi sempre far tutto in questo modo, per esempio non puoi allocare memoria per i tuoi membri; in questo caso usi la seconda versione. La maggior parte delle volte non vedrai differenza fra le due versioni; esistono dei casi in cui la differenza potrebbe esistere. Quando possibile, usa l'initialisation list.
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12847
|
Che io sappia è possibile fare:
Codice:
class Test { int* n; public: Test() : n( new int(3) ) { } }; |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Puo' essere, mi trovi impreparato. Mi informo
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Hai ragione.
Ho trovato questa discussione su stackoverflow (che non e' la Bibbia ma e' affidabile): http://stackoverflow.com/questions/1...d-memory-alloc (Vabbe', le parentesi devono essere quadre, non tonde, ma e' un dettaglio insignificante)
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12847
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
C'ho ripensato: allocare vettori nella initialisation list e' una cattiva idea.
Beh, lo e' anche nel costruttore classico. Anche se possibile, ritengo che sia da evitare, o quantomeno prestare molta attenzione: Codice:
class myClass { private: int *m_buf1; int *m_buf2; ... ... public: myClass(): ..., m_buf1(new int[1000]), m_buf2(new int[5000]) { ... } }
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Questa e' davvero un'ottima idea
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 9431
|
Quote:
Sto seguendo un certo percorso. Però ora mi avete creato dei dubbi: che devo preferire per correttezza?
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W 2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370. Ultima modifica di Bandit : 28-02-2013 alle 15:46. |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Nel 90% dei casi non vedrai differenze fra i due tipi di costruttori, quindi scegli quello che ti pare vai alla grande. Il rimanente 10% sara' occupato da casi nel quale l'initialisation list sara' da preferirsi o sara' la sola opzione possibile. Per esempio, se nella tua classe hai una variabile membro che e' un oggetto, ma tale oggetto non ha il costruttore di default (cioe' quello senza parametri), non potrai far altro che usare l'initialisation list. Infine: presta sempre attenzione quando devi allocare memoria in un costruttore, potresti creare dei leak. Ma per ora questo non mi sembra ti interessi.
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 9431
|
a me la lista di inizializzazione mi pare molto più efficiente poichè scrivo meno codice e quindi meno possibilità di commettere errori, che fa sempre bene
era solo per via del vettore e del dato con estensione dinamica che mi creava dubbi nell'utilizzo della lista di inizializzazione
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W 2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:57.