Ok, gracias por la respuestas.<br><br>Lo de const era lo que queria poner pero no tenia claro donde se ponia para decir que la funcion es constante jeje ahora ya lo se XD.<br><br>Interesante lo de las propiedades, no conocia su existencia y tambien me ha gustado las funciones que devuelven referencias a valores, mantiene la independencia pues el interfase es coherente pero clarifica el codigo.<br>
<br>Bueno, gracias y hasta otra<br><div class="gmail_quote">2009/3/9 Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola Zaka,<div class="im"><br>
<br>
Zakariae El-Abdelouarti wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola Steven,<br>
<br>
Tengo algunas preguntas sobre las respuestas a vicente lozano.<br>
<br>
El día 6 de marzo de 2009 19:19, Steven Davidson <<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>><br>
escribió:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
int x() const  { return xv; }<br>
int y() const  { return yv; }<br>
<br>
Con esto, indicamos que las funciones son constantes que significa que éstas<br>
no tienen intención alguna de modificar el estado de este objeto.<br>
</blockquote>
<br>
¿Por qué es necesario el operador const en estas declaraciones?¿De<br>
qué manera podrían las anteriores funciones modificar el estado del<br>
objeto?<br>
<br>
</blockquote>
<br></div>
Desde nuestro punto de vista, sabemos que estas funciones miembros no modificarán el objeto, pero el compilador no lo sabe. Por ello, establecemos que estas funciones miembros no modificarán el objeto para que el compilador las tenga en cuenta. Esto implica que cuando manejemos objetos constantes, podamos invocar estas funciones constantes. Por ejemplo,<br>

<br>
class punto<br>
{<div class="im"><br>
private:<br>
  int xv;<br>
  int yv;<br>
<br></div><div class="im">
public:<br>
  punto( int vx=0, int vy=0 ) : xv(vx), yv(vy)  {}<br>
<br></div><div class="im">
  int x()  { return xv; }<br>
  int y()  { return yv; }<br></div><div class="im">
  void x( int valor )  { xv=valor; }<br>
  void y( int valor )  { yv=valor; }<br></div>
};<br>
<br>
ostream &operator<<( ostream &os, const punto &pt )<br>
{<br>
  return os << '(' << pt.x() << ',' << pt.y() << ')';<br>
}<br>
<br>
El compilador te marcará un error en la sobrecarga del operador << porque 'pt' es tratado como un objeto constante, pero estás usando funciones miembros que no son constantes. El compilador no puede asegurar la constancia del objeto 'pt' y por tanto da un error.<br>

<br>
Si por el contrario, definimos la clase de esta manera, no tendremos tal problema:<br>
<br>
class punto<br>
{<div class="im"><br>
private:<br>
  int xv;<br>
  int yv;<br>
<br></div><div class="im">
public:<br>
  punto( int vx=0, int vy=0 ) : xv(vx), yv(vy)  {}<br>
<br></div><div class="im">
  int x() const  { return xv; }<br>
  int y() const  { return yv; }<br></div><div class="im">
  void x( int valor )  { xv=valor; }<br>
  void y( int valor )  { yv=valor; }<br></div>
};<br>
<br>
Ahora 'x()' e 'y()' son funciones constantes y por tanto pueden ser usadas con objetos constantes porque están aseguradas de no modificar el objeto.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

p.x() = 5;<br>
p.y() = 10;<br>
</blockquote>
<br>
Aquí supongo que estoy apelando a una de mis lagunas. Lo que hay a la<br>
izquierda de un operador de asignación de int -> int, ¿Es una<br>
variable?¿Es una dirección de memoria? ¿Puede ser cualquiera de las<br>
dos?<br>
<br>
</blockquote>
<br></div>
En general, se suele decir que lo que hay a la izquierda de un operador de asignación es el llamado "lvalue" que en inglés se refiere a "left value". Este "valor-i" debe ser una variable. A bajo nivel, ciertamente la asignación usa la dirección de memoria de la variable. Por ejemplo,<br>

<br>
int a;<br>
<br>
a = 5;<br>
<br>
Se traduciría en ensamblador como:<br>
<br>
MOVE &a, 0x05<br>
<br>
Por cierto, no estoy usando un lenguaje ensamblador específico; me lo he inventado. Esto sólo es un ejemplo, pero muestra la necesidad de saber, por parte del procesador, la dirección de memoria que será el destino de guardar el valor de 5.<br>

<br>
Obviamente, lo siguiente no tiene sentido en C/C++:<br>
<br>
int a;<br>
<br>
5 = a;<br>
<br>
Si quisiéramos escribir esto directamente en ensamblador, el resultado sería muy distinto:<br>
<br>
MOVE 0x05, [a]<br>
<br>
Posiblemente el procesador acabaría copiando el valor en 'a' en la dirección de memoria 0x05. Lo más seguro que el sistema operativo se verá forzado a terminar este programa de inmediato por haber violado el área de memoria de otro programa.<br>

<br>
<br>
En fin, el ejemplo que di a Vicente implica que esas funciones miembros retornarían una referencia a la variable privada. Es decir,<br>
<br>
p.x() = 5;<br>
<br>
equivale al siguiente comportamiento:<br>
<br>
p.xv = 5;<br>
<br>
<br>
Espero haber aclarado las dudas.<br><font color="#888888">
<br>
Steven</font><div><div></div><div class="h5"><br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br>