[C con Clase] Algo explícito e implícito en C o C++
Steven Davidson
srd4121 en njit.edu
Vie Mar 13 00:52:43 CET 2009
Hola Samuel,
Samuel Porras wrote:
> Buenas noches,
> en muchas ocasiones, he leído por la lista y en los libros/manuales
> hacer algo explicito y no consigo entender a que se refiere,
> por ejemplo, se dice:
> - un valor puede ser convertido solo a un valor inferior, asignando
> de manera explícita el valor a una variable de tipo menor inferior.
>
> He mirado algunos sinónimos pero no me aclaran la forma de asignar de
> esa manera:
> Explícito: Claro, manifiesto, expreso, categórico, evidente, rotundo,
> tajante, meridiano, sincero, franco.
>
> y tampoco por los antónimos:
> Implícito, tácito, oscuro.
>
> Al buscar por el google, me ha salido algo sobre Visual Basic en la
> página de msdn (Tampoco se VisualBasic pero por probar):
> Declaración explícita e implícita.
>
> pero tampoco me resuelve la duda, espero que me podáis poner algunos
> ejemplos de asignaciones, declaraciones, explícitas e implícitas para
> que me queden un poco mas claros esos conceptos.
>
Las palabras "explícito" e "implícito" no tienen unas definiciones
especiales en la informática. Cuando hablamos de formas, maneras,
expresiones, escritos implícitos, estamos diciendo que no hace falta que
los escribamos porque se sobreentiende y quedan incluidos en otra
expresión o escrito. Con formas explícitas, sí hay que escribirlas
claramente para hacerse entender. Podríamos decir que "explícito" es
sinónimo de "directo" mientras que "implícito" es "indirecto". Por ejemplo,
double exp( double base, long int exponente );
int main()
{
long double fNum = 1.3;
short int nExp = 100;
long double fRes = exp( (double)fNum, nExp );
...
}
Aquí diríamos que al invocar 'exp()', tenemos que realizar un cásting
explícito para 'fNum' de 'long double' a 'double'. Para el segundo
parámetro, 'nExp', el cásting de 'short int' a 'long int' es implícito.
Esto quiere decir que no hace falta que escribamos el cásting; C++ y el
compilador sobreentienden que el cásting existe y que se debe realizar.
Te doy otro ejemplo con clases:
class Cadena
{
private:
char *ptr;
public:
Cadena( const char *pszCadena );
Cadena( const Cadena &ref );
~Cadena();
bool igual( const Cadena &ref );
...
};
int main()
{
Cadena cad( "hola" );
if( cad.igual( "Hola" ) )
cout << "son iguales" << endl;
else
cout << "no son iguales" << endl;
return 0;
}
Aquí tenemos varias instanciaciones e invocaciones implícitas y algunas
explícitas. Declaramos e instanciamos explícitamente el objeto 'cad', lo
cual implica que se invoca su constructor implícita y automáticamente.
En la condición posterior, mientras invocamos explícitamente la función
miembro 'igual()', instanciamos implícitamente un objeto temporal
invocando el constructor de 'Cadena' implícitamente. Al finalizar la
evaluación de la expresión condicional de la sentencia 'if', destruimos
implícitamente el objeto temporal que previamos creamos. Esta
destrucción implícita implica invocar implícitamente su destructor. Al
terminar 'main()', destruimos el objeto 'cad' implícitamente lo cual
implica invocar implícitamente su destructor.
Espero haber aclarado el asunto.
Steven
Más información sobre la lista de distribución Cconclase