Quina diferència hi ha entre les funcions de la paraula clau const en C ++ i la final a Java?


Resposta 1:

Pregunta: Quina diferència hi ha entre les funcions de la paraula clau const a C ++ i la final a Java?

S'utilitzen lleugerament de manera diferent en cada idioma respectiu. Ho mantindré limitat a les funcions, tal com heu especificat a la vostra pregunta.

final a Java quan s'aplica a un mètode significa que no es pot substituir aquest mètode en cap subclasse. Tot i això, a C ++, const quan s'aplica al final d'una signatura del mètode significa que el mètode no o promet no modificar cap part de la classe (camps o trucant a altres mètodes que no estan marcats com a const).

No hi ha res per evitar que un programador de C ++ modifiqui la classe dins d’un mètode const. Segur que per defecte, no us permetrà, però si feu servir l'operador const_cast, podeu canviar "això" d'un punter const a un punter no const o * això d'una referència const a una referència no const.

Si prefix la const a la signatura del mètode, això només vol dir que retorna un tipus de dades constant ... Per exemple:

Llista const  i  :: getListOfSchmucks ()
{
retorn (getListOfSchmucksInternal ());
}

 obj;
obj.getListOfSchmucks (). append (Schmuck (...)); // Il·legal com és!

Com que a la línia 7, es podria fer:

const_cast  &> (obj.getListOfSchmucks ()). append (Schmuck (...));

Rarament hi torno una referència d’alguna cosa que he prefixat una const per això, de manera que no hi ha referències constants. És massa temptador de desconcertar-lo i canviar-lo, però si és un valor (no una referència), és, en certa manera, una llista que no es pot modificar, si es tracta d’una llista, definir, mapa, etc.

Ara per als paràmetres, C ++ i java són força similars. final i const són pràcticament sinònims de paràmetres: tots dos signifiquen constant amb una diferència. A Java, és pràcticament impossible canviar l'estat final d'una variable o un paràmetre / argument, fins i tot amb reflexió. A C ++, de nou es pot fer servir const_cast per descongestionar una variable o paràmetre / argument, però intento dur-ho. El motiu pel qual personalment utilitzo el paràmetre o els arguments finals o const per assegurar-me que no * * apunto i modifiqueu l’entrada que intento assignar a un camp… Com:

void Point :: setX (const int iX)
{
iX = 5; // il·legal

miX = iX;
}

Tot i que no us limitaria directament a 5, en una funció més llarga, puc assignar-ho a una tipografia. Puc acabar inadvertidament escrivint: iX = miX també, que d’altra manera seria legal, però no el que vull. Per tant, establir iX com a const em impedeix fer una revisió que podria ser molt difícil de trobar més endavant, ja que no hi hauria excepcions ni rastres de pila per identificar, només dades incorrectes.