[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