Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Il più recente robot per la pulizia domestica di Dreame, modello Aqua10 Ultra Roller, abbina un potente motore di aspirazione della polvere a un sofisticato sistema di lavaggio con rullo integrato. Il tutto governato dalla logica di intelligenza artificiale, per i migliori risultati
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Siamo volati fino a Belfast, capitale dell'Irlanda Del Nord, per scoprire il nuovo Realme 15 Pro 5G Game Of Thrones Limited Edition. Una partnership coi fiocchi, quella tra Realme e HBO, un esercizio di stile davvero ben riuscito. Ma vi raccontiamo tutto nel nostro articolo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-07-2012, 18:49   #1
oRpo
Senior Member
 
L'Avatar di oRpo
 
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
oRpo è offline   Rispondi citando il messaggio o parte di esso
Old 07-07-2012, 16:39   #2
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
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.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2012, 22:57   #3
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
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
Mah, sinceramente non sono d'accordo. Il c++ è legato al termine "funzione" per la sola sua discendenza dal c. Oltre a questo il c++ pur incorporando principi del paradigma OOP non lo abbraccia al 100% e rimane in quella "mezza strada" che lo rende performante/potente e astio allo stesso tempo.
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)
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 07:51   #4
tomminno
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)
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 15:29   #5
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Mah, sinceramente non sono d'accordo. Il c++ è legato al termine "funzione" per la sola sua discendenza dal c. Oltre a questo il c++ pur incorporando principi del paradigma OOP non lo abbraccia al 100% e rimane in quella "mezza strada" che lo rende performante/potente e astio allo stesso tempo.
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)
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?
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.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 15:50   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?
L'osservazione di Kendall mi pare abbastanza pertinente:
Quote:
Originariamente inviato da Kendall
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".
Puoi usare il termine "metodo" come un sinonimo di "funzione membro" senza questo renda neccessario trovare un sinonimo per "funzione globale", o sbaglio?
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 22:52   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da oRpo Guarda i messaggi
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.
A rigor di logica no visto che logicamente l'oggetto e' stato modificato.
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 22:59   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Quando si parla di c++, non si dice metodo ma funzione.
Si possono usare indifferentemente entrambe le forme, in C++ vogliono dire la medesima cosa.

Quote:
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
La prima che dice Stroustroup quando introduce le funzioni membro, dice che si chiamano 'funzioni membro' o 'metodi'. Ne piu' ne meno.
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 23:02   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?
... '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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2012, 10:30   #10
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
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:
Originariamente inviato da marco.r Guarda i messaggi
La prima che dice Stroustroup quando introduce le funzioni membro, dice che si chiamano 'funzioni membro' o 'metodi'. Ne piu' ne meno.
Nella mia edizione (special edition) del libro di Stroustrup non c'è scritto quello, ma testuali parole: "A virtual member function is sometimes called a method" .
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.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2012, 13:24   #11
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
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.


Nella mia edizione (special edition) del libro di Stroustrup non c'è scritto quello, ma testuali parole: "A virtual member function is sometimes called a method" .
Qui mi fermo.
Bye
doh, guardando il glossario di Stroustrup non posso che darti ragione. La mia copia del libro e' in italiano (peccati di gioventu'), ed evidentemente e' stata tradotta in modo infelice.
__________________
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2012, 13:33   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da marco.r Guarda i messaggi
La mia copia del libro e' in italiano (peccati di gioventu')...
...
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2012, 22:26   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12851
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.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 07:20   #14
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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
Se ti candidi ti voto come presidente del consiglio
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!
ingframin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti Recensione Realme 15 Pro Game Of Thrones: un ver...
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Panasonic Lumix S9: disponibile in quatt...
Nikon presenta due obiettivi: NIKKOR Z D...
Horizon vs Light of Motiram, si entra ne...
Atari rilancia Intellivision Sprint e fa...
Leapmotor lancia in Italia il SUV elettr...
QNAP punta sempre più in alto con...
Scandalo ibride plug-in: consumano come ...
L'intelligenza artificiale fa sempre pi&...
Oracle dal punto di vista dell’Europa: l...
James Dyson Award 2025: dall'accessibili...
Xiaomi: gli smartphone con display poste...
Final Fantasy 7 Remake Part 3 offrir&agr...
Chery presenta Omoda 4, da benzina a ele...
TSMC alza i prezzi: Qualcomm e MediaTek ...
Una Offline Room per aiutare gli student...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:43.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v