|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 377
|
[C++] Metodo const e modifiche sull'oggetto di invocazione - Best Practise
Salve a tutti.
Un metodo dovrebbe essere dichiarato const se e solo se la sua invocazione non produce side-effects sull'oggetto di invocazione o sulla classe di invocazione. Supponendo che la classe abbia come campo dato di istanza un puntatore ad una collezione di oggetti (vedi esempio), se dovessi fare un metodo push, questo metodo devo marcarlo come const? A rigor di logica sì. visto che non modificando nessun oggetto di invocazione, provoca comunque side-effect indirettamente. esempio: class A { vector<int> * punt; public: void push(int) const; ... A(): punt(new vector<int>); } Cosa mi consigliate? Mattia |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Prendendo come buona la tua definizione di quando una funzione dovrebbe essere const oppure non const, essendo push non referenzialmente trasparente non dovrebbe essere dichiarata const.
Fatti questa domanda: posso sostituire una chiamata alla funzione push con il valore che restituisce senza che nulla cambi nel mio programma? Se la risposta è sì, allora secondo la tua definizione di quando una funzione dovrebbe essere const ( ma cosa significa side effects sull'oggetto di invocazione? ) oppure no, push deve essere const. Altrimenti non deve esserlo. Quando si parla di c++, non si dice metodo ma funzione. Una sola volta mi pare di aver visto la parola method nel libro di stroustrup e, se non sbaglio, si riferiva ad una funzione ereditata che fa l'overriding. Sapessi quante volte sono stato bachettato io perchè usavo la parola metodo. Se parli sui canali irc iniziano a dirti, "che cosa è un metodo in c++?", "Io non so cosa è un metodo, a cosa ti riferisci?".. ahahah Scusate lo sfogo
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 Ultima modifica di __ZERO_UNO__ : 09-07-2012 alle 21:53. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
In realtà però in c++ i metodi esistono eccome, per il semplice fatto che un metodo altro non è che un altro modo (più conciso) di definire una "funzione membro". Tutto il resto lo reputo sinceramente uno sciocco gioco di termini che i puristi del c++ usano. (Così come i puristi degli altri linguaggi se la "tirano" in altri frangenti eh) |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Il C++ definisce i metodi come "member function", chiamarli solo funzioni è sbagliato. "Metodi" è genericamente il gergo OOP (mutuato da Smalltalk)
|
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Quote:
Penso che per uniformità ed evitare ambiguità sia meglio usare i termini funzione membro e funzione globale quando si parla di c++. Inoltre in tutti i testi che trattano di c++ è usata questa convenzione.
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 Ultima modifica di __ZERO_UNO__ : 10-07-2012 alle 15:40. |
|
![]() |
![]() |
![]() |
#6 | ||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
||
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Il fatto che poi tu riesca a modificare un oggetto puntato (ma non il puntatore stesso) secondo me e' poco rilevante o, se preferisci, un dettaglio implementativo.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Quote:
Quando qualcuno vuol fare il gradasso su irc e ti chiede cos'e' un metodo puoi pure dargli un link rapidshare ad una copia del libro ![]() Al di la' di questo il resto del mondo usa il termine metodo, per cui tanto vale usare un linguaggio comune.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
... 'funzione' ? O 'funzione non membro, se occorre evidenziare la differenza.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Non pensavo di tirare su una discussione così ampia su una cosa così poco rilevante. Comunque mi rimangio la bacchettata che ho fatto e dico ognuno usi la terminologia che preferisce (ovviamente). Affari suoi.
Quote:
Qui mi fermo. Bye
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 Ultima modifica di __ZERO_UNO__ : 11-07-2012 alle 10:33. |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]() ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Uno che ha fatto un linguaggio così orribile non dovrebbe parlare di cosa è una funzione o un metodo
![]() Edit: oddio l'ho postato sul serio ![]() Ultima modifica di WarDuck : 12-07-2012 alle 22:31. |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
![]() Per quanto riguarda la sottigliezza metodo/funzione... "o sono caduto o ho caduto, sempre in terra sono andato" ovverosia l'importante è capirsi. La parola di Stroutsup non è vangelo e al mio paese "A virtual member function is sometimes called a method" questo significa che una funzione membro virtual si può chiamare anche metodo. In Java sono tutte virtual e quindi sono tutti metodi. In c++ non lo sono, ma comunque a livello di comprensione il discorso fila lo stesso. Per fare i perfettini, abbiamo sprecato tonnellate di byte per scrivere corbellerie che non tolgono né tanto meno aggiungono nulla al post originario. Per quanto riguarda const... http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx Qui c'è una definizione e un esempio che mi pare sufficientemente esplicativo ![]() PS Quanto preferisco il vecchio C, liscio liscio e semplice.
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:10.