В чем разница между string и string&?

В чем разница между:

void function(string stroka) {
}

и

void function(string& stroka) {
}

Гуглил, не нашёл инфы. Там все, что угодно, но не мой вопрос, даже близко. Если подобный вопрос был на [ru]SO, дайте ссылку...


Ответы (2 шт):

Автор решения: Harry

В первом случае создается копия строки и передается в функцию. Все, что вы будете делать с ней, никак не скажется на оригинале.

Во втором случае передается ссылка на существующую строку. Все, что вы будете делать с ней, вы будете делать с оригиналом.

И, кстати, поэтому

function("Hello");

в первом случае сработает, а во втором — нет.

О const string& поговорим в другой раз :)

→ Ссылка
Автор решения: Artyomka

Дополню ответ Harry.

Знак амперсанда в приведенном ниже примере означает не "оператор взятия адреса", а "ссылка на объект".

string str = "Hello World!";
string& stroka = str; // ссылка на объект str

Если сказать еще проще, ссылка — это псевдоним объекта на который ссылается ссылка.

void function1(string stroka)
{
    stroka = "Something..."; // Это параметр (копия основного объекта str)
    cout << &stroka << endl; // Имеет другой адрес, не такой как у str
}

void function2(string& stroka)
{
    stroka = "Something..."; // Тут stroka играет роль псевдонима str
    cout << &stroka << endl; // Имеет тот же адрес, что и str
}



int main()
{
    string str = "Hello World!";
    
    cout << "address str: " << &str << endl; // Адрес переменной str
    cout << "value std: " << str << endl; // Значение переменной str

    cout << endl;

    cout << "Function 1." << endl;
    function1(str);
    cout << str << endl; // Значение str не изменилось!

    cout << endl;

    cout << "Function 1." << endl;
    function2(str);
    cout << str << endl; // Значение str изменилось, в результате работы function2


    return 0;
}

Что касается ссылок на константные значения, то принцип работы у них точно такой же, как и у ссылок на неконстантные, за исключением того, что изменить значение объекта, на которую ссылается ссылка, будет невозможно

void function3(const string& stroka)
{
    stroka = "Something..."; // Будет ошибка!

    cout << stroka << endl; // Все ок, тк мы не пытаемся изменить данные

    cout << &stroka << endl; // Имеет тот же адрес, что и str
}
→ Ссылка