Los objetos CString también pueden utilizarse como si fueran arrays de chars, concretamente del tipo LPCTSTR (puntero largo constante a cadena).
Como ya hemos visto, el operador LPCTSTR permite la conversión de un objeto CString a su puntero LPCTSTR, y cómo uno de los constructores nos permite crear un objeto CString a partir de una cadena LPCTSTR.
Además, existe un nuevo método, para acceder a al array de caracteres de un objeto CString: a través de las funciones GetBuffer() y ReleaseBuffer().
GetBuffer() nos retorna un puntero LPTSTR (puntero modificable) a la cadena interna del objeto CString. Esto nos permite consultar el contenido interno del objeto o incluso modificarlo, aunque en este caso habría que llamar a ReleaseBuffer() después de la modificación.
ReleaseBuffer() nos libera el buffer previamente reservado con GetBuffer(). Siempre hay que llamar a ReleaseBuffer() cuando hayamos terminado de manipular la cadena obtenida con GetBuffer(), y con más razón cuando esta cadena ha sido modificada.
Hasta aquí la parte fácil del asunto, pero... ¿qué pasaría si pasamos un objeto CString a la función printf?
Lo primero que se nos pasa por la cabeza es que eso no debe permitirlo el compilador... pero no es así, ya que las funciones con argumentos variables (como printf, sprintf, scanf, etc.) no hacen comprobación de tipos.
Entonces... ¿qué es lo que ocurre con el siguiente código?
CString objeto = "hola mundo";
char buffer[16];
::sprintf(buffer, "%s", objeto);
Cuando la función procese el primer algumento variable (llamado "objeto"), considerará que es un puntero a una cadena de caracteres terminada en '\0'. Y así es, ya que, como hemos visto, la implementación de la clase CString solamente tiene un atributo, y este es un puntero a una cadena de caracteres. Así que la memoria ocupada por el objeto comenzará con un puntero al contenido del propio objeto, seguido por el resto de los componentes de la clase (en nuestro caso, solo funciones miembro).
El código anterior podría ser equivalente a este otro, saltándonos la seguridad del atributo protected:
CString objeto = "hola mundo";
char buffer[16];
::sprintf(buffer, "%s", objeto.m_pchData);
Este engaño que hace la clase CString a la función sprintf, lo podremos hacer nosotros mismos, siempre y cuando definamos una clase cuyo primer atributo sea un puntero a cadena de texto, y pasemos el objeto, y no la referencia al objeto.
Como norma general, podríamos decir que cuando pasamos un objeto por parámetro, en realidad estamos pasando la dirección de memoria donde está el primer atributo de ese objeto.