Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzioni senza argomenti
Forum - C/C++ - Funzioni senza argomenti

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
streghetta (Normal User)
Newbie


Messaggi: 20
Iscritto: 19/02/2010

Segnala al moderatore
Postato alle 22:30
Martedì, 23/02/2010
Volevo sapere...perchè in c++ si ha la possibilità di dichiarare e definire le funzioni anche senza argomenti (se gli argomenti sono definiti in una classe per esempio)? che vantaggi si hanno? qual è la differenza rispetto ad una funzione dichiarata e definita con argomenti?
grazie...

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:36
Martedì, 23/02/2010
Cosa intendi con funzioni senza argomenti?

Intendiforse funzioni void o la definizione dei prototipi?

Ultima modifica effettuata da Poggi Marco il 23/02/2010 alle 22:41
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 22:42
Martedì, 23/02/2010
poggi marco: gli argomenti sono i parametri passati in ingresso, non i valori di ritorno.
(hai editato, ora va meglio)

streghetta:come tu stessa hai detto, in una classe i metodi devono agire sui dati della classe stessa, quindi non hanno bisogno di nessun parametro(ovviamente nei metodi di classe viene passato comunque in ingresso il puntatore this ma questa è una cosa del tutto trasparente per il programmatore)

comunque, anche in C normale ci sono le funzioni senza parametri, servono ovviamente per lavorare sulle variabili globali, anche se certo non è una grande soluzione.

Ultima modifica effettuata da lorenzo il 23/02/2010 alle 22:43
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:59
Martedì, 23/02/2010
Concordo con lorenzo!

Una funzione non dovrebbe usare le variabili globali.
Tuttavia non si può neanche escludere la possibilità di programmare une funzione senza argomenti.

Es.:

Codice sorgente - presumibilmente C/C++

  1. ...
  2. void pausa()
  3. {
  4.    cout<<"\nPremi un tasto per continuare...";
  5.    fflush(stdin);
  6.    cin.get();
  7. }
  8. ...




Ultima modifica effettuata da Poggi Marco il 23/02/2010 alle 23:17
PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 9:32
Mercoledì, 24/02/2010
Testo quotato

Postato originariamente da streghetta:

Volevo sapere...perchè in c++ si ha la possibilità di dichiarare e definire le funzioni anche senza argomenti (se gli argomenti sono definiti in una classe per esempio)? che vantaggi si hanno? qual è la differenza rispetto ad una funzione dichiarata e definita con argomenti?
grazie...


Aggiungo che, sebbene una classe definisca metodi e attributi è necessario, ai fini di una buona programmazione, nascondere all'utilizzatore (chi andrà ad usare la tua classe) attributi e metodi che non sono di sua competenza (information hiding).
Ad esempio:
Codice sorgente - presumibilmente C++

  1. class Intero {
  2.         private:
  3.                 int valore;
  4.         public:
  5.                 Intero () {
  6.                         valore = 0;
  7.                 }
  8.                 void setValore (int _valore) {
  9.                         valore = _valore;
  10.                 }
  11.                 int getValore () {
  12.                         return valore;
  13.                 }
  14.                 void incrementa () {
  15.                         valore+=1;
  16.                 }
  17.                 void decrementa () {
  18.                         valore-=1;
  19.                 }
  20. }


In questo piccolo esempio puoi notare che incrementa() e getValore() non ricevono parametri , ma, a differenza di incrementa(), il metodo getValore() ritornerà l'intero "salvato" nell'oggetto (con oggetto si intende l'istanza di una classe).

Quindi un metodo può non avere attributi se è un getter oppure se esegue una modifica, allo stato dell'oggetto, che non richiede informazioni aggiuntive.

Nel caso di incrementa() abbiamo considerato un incremento unitario... il metodo potrebbe essere facilmente modificato come di seguito:
Codice sorgente - presumibilmente C/C++

  1. void incrementa (int _incremento = 1) {
  2.         valore += _incremento;
  3. }



PM Quote
Avatar
streghetta (Normal User)
Newbie


Messaggi: 20
Iscritto: 19/02/2010

Segnala al moderatore
Postato alle 13:14
Mercoledì, 24/02/2010
Quindi se scrivo una cosa del genere è sbagliato??
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. class Operazione
  4. {
  5. public:
  6.           int x;
  7.           int y;
  8.  
  9.           int addizione();
  10. };
  11.  
  12. int Operazione::addizione()            
  13. {
  14.    std::cout << "Primo numero: ";
  15.    std::cin << x;
  16.    std::cout << "Secondo numero: ";
  17.    std::cin << y;
  18.                            
  19.    return (x + y);                                
  20. }



E' sbagliato,è un errore grave definire gli attributi tutti public?oppure è una programmazione un pò "sporca"??
Col puntatore this non ci riesco proprio...

Ultima modifica effettuata da streghetta il 24/02/2010 alle 13:15
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 14:21
Mercoledì, 24/02/2010
1) non inserire mai in un metodo di classe le operazioni i/o a console. Ricordati che la tua classe deve essere generica e potrebbe essere usata da chiunque: magari io programmatore vorrei stampare a video cose diverse dalle tue e dovrei riscrivere il metodo cosa sbagliata.

2) mettendo gli attributi public sfasci i pilastri della programmazione ad oggetti. Ogni classe deve avere attributi privati(ci sono eccezioni ma rare ed eliminabili).
A questi attributi l'utilizzatore deve arrivare solo tramite i metodi che tu gli dai da usare.

es:
Codice sorgente - presumibilmente C++

  1. class Operazione
  2. {
  3. private:
  4.       int x;
  5.       int y;
  6.  
  7. public:
  8.       Operazione();
  9.       Operazione(int, int);
  10.       int addizione();
  11.  
  12.       void setx(int a) { x = a; }
  13.       void sety(int b) { y = b; }
  14.       int getx() const { return x; }
  15.       int gety() const { return y; }
  16. };
  17.  
  18. Operazione::Operazione() { x = y = 0; }
  19. Operazione::Operazione(int a, int b)
  20. {
  21.   x = a;
  22.   y = b;
  23. }
  24. int Operazione::addizione()            
  25. {
  26.    return (x + y);                                
  27. }



ps: il costruttore di default deve essere sempre messo.

Ultima modifica effettuata da lorenzo il 24/02/2010 alle 14:23
PM Quote
Avatar
streghetta (Normal User)
Newbie


Messaggi: 20
Iscritto: 19/02/2010

Segnala al moderatore
Postato alle 15:58
Mercoledì, 24/02/2010
@lorenzo:mi daresti una mano a capirne di più?
Allora...
Operazione() indica il costruttore, mentre Operazione(int, int) e la sua successiva implementazione a cosa servono?

Le funzioni set e get indicano, rispettivamente, il settaggio e il prelievo di info contenute in variabili private (quindi sostanzialmente le inserisco per poter utilizzare gli attributi privati,giusto????).

Poi...
Operazione::Operazione() { x = y = 0; } è l'implementazione del costruttore a cui va aggiunto anche il distruttore di defalut dichiarato prima come public, e poi implementato:
Operazione::~Operazione(){std::cout << "Fine dell'addizione";} (o nell'implementazione va anche altro???)

Poi infine l'implementazione di int Operazione::addizione()

Spero tu mi dia una mano...grazie in anticipo!

**********************
Ho eseguito il tuo programma,introducendo un main ma ho grosse difficoltà a capire come utilizzare gli attributi privati.Ti posto il codice:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Operazione
  6. {
  7. private:
  8.       int x;
  9.       int y;
  10.  
  11. public:
  12.       Operazione();  
  13.       ~Operazione();
  14.       Operazione(int, int);
  15.       int addizione();
  16.  
  17.       void setx(int a) { x = a; }
  18.       void sety(int b) { y = b; }
  19.       int getx() const { return x; }
  20.       int gety() const { return y; }
  21. };
  22.  
  23. Operazione::Operazione() { x = y = 0; }
  24.  
  25. Operazione::~Operazione()
  26. {
  27. std::cout << "Fine dell'addizione";
  28. }
  29. Operazione::Operazione(int a, int b)
  30. {
  31.   x = a;
  32.   y = b;
  33. }
  34. int Operazione::addizione()            
  35. {
  36.    return (x + y);                                
  37. }
  38.  
  39. int main()
  40. {
  41.  
  42.     int risultato;
  43.    
  44.     Operazione op;
  45.    
  46.     std::cout << "Inserisci il primo numero: ";  
  47.     std::cin >> ??;
  48.     std::cout << "Inserisci il primo numero: ";
  49.     std::cin >> ??;
  50.     risultato = op.addizione();
  51.     std::cout <<"Il risultato dell'operazione e': " << risultato;
  52.     system("pause");
  53.     return 0;
  54. }


Ho inserito la dichiarazione e definizione del distruttore ma noterai che ho lasciato dei punti interrogativi dopo std::cin >> perchè non so cosa mettere: x,y,a,b, oppure devo definire nuove variabili nel main???Vorrei capire come fare...

Ultima modifica effettuata da streghetta il 24/02/2010 alle 16:14
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:19
Mercoledì, 24/02/2010
Ciao!

I costruttori Operazione() e Operazione(imt, int), sono sottoposti ad overloading.
Ciò significa che, per definire un oggetto Operazione, è possibile effettuarlo in due modi:

1° Operazione a; // viene richiamato il costruttore Operazione()
2° Operazione b(5, 7); // in questo caso viene richiamato il costruttore
                          Operazione(int, int)

Il distruttore ~Oprrazione() viene richiamato, in automatico, quando l' oggetto Operazione va fuori ambito. In questo caso, non necessita di ulteriori implementazioni perchè non si fa uso della memoria dinamica ( non ci sono istruzioni new).

La funzione int Operazione::addizione() somma i membri x e y e ritorna il risultato.
Cosa non ti è chiaro?

Per accedere alle funzioni membro di una classe, è possibile tramite l' operatore punto ( . ) o , in caso si definisse un puntatore ad un oggetto, con l' operatore freccia ( -> )

Ecco un esempio:  ( scrivo solo la funzione main() )

Codice sorgente - presumibilmente C++

  1. ...
  2. using namespace std;
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.     Operazione a(4, 7);
  7.     cout<<"x vale "<<a.getx()<<endl;
  8.     cout<<"y vale "<<a.gety()<<endl;
  9.     cout<<"La loro somma e' "<<a.addizone();
  10.     a.setx(10);
  11.     a.sety(12);
  12.     cout<<"ora x vale "<<a.getx()<<endl;
  13.     cout<<"ora y vale "<<a.gety()<<endl;
  14.     getch();
  15.     return 0;
  16. }
  17. ...



PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo