Decidí ver si la asignación de una referencia a un miembro haría referencia a un miembro. Escribí el siguiente fragmento para probarlo. Hay una clase simple Wrapper
con un std::string
como variable miembro. Tomo tomar un const string&
en el constructor y asignarlo a la variable miembro pública. Más adelante, en el método main()
, modifico la variable miembro pero el string
que pasé al constructor permanece sin cambios, ¿cómo es posible? Creo que en Java la variable habría cambiado, ¿por qué no en este fragmento de código? ¿Cómo funcionan exactamente las referencias en este caso?Pasando por referencia a un constructor
#include <iostream>
#include <string>
using namespace std;
class Wrapper
{
public:
string str;
Wrapper(const string& newStr)
{
str = newStr;
}
};
int main (int argc, char * const argv[])
{
string str = "hello";
cout << str << endl;
Wrapper wrapper(str);
wrapper.str[0] = 'j'; // should change 'hello' to 'jello'
cout << str << endl;
}
Los tipos en C++ son lo que decretas, y no se convierten mágicamente en otra cosa. Dices 'string', y obtienes una' cadena'. Si quisieras una referencia, hubieras dicho 'string &'. –
Abusaste de personas con una pregunta demasiado simple :) – Mikhail
En Java, la variable no habría cambiado porque el código ni siquiera se habría compilado; las cadenas en Java no pueden ser modificadas. –