Передать строковую переменную класса по ссылке в C ++ - PullRequest
0 голосов
/ 15 февраля 2020

Посмотрите на следующий код:

#include <iostream>
#include <string>
using namespace std;
void reverseStr(string arr, int start, int end)
{
    while (start < end)
    {
        swap(arr[start], arr[end]);
        ++start;
        --end;
    }
}
int main()
{
    string str = "CPP";
    reverseStr(str, 0, 3);
    cout << str;
    return 0;
}

Выход равен CPP, в то время как ожидается P CC.

Вопрос: Как передать строку по ссылке в C ++? Строки - это обычный массив? Если да, то ссылка должна быть передана автоматически, в то время как она просто создает копию в формальных параметрах.

Мой вопрос заключается в том, почему я должен использовать свою функцию как void reverseStr(string &arr, int start, int end) вместо просто void reverseStr(string arr, int start, int end). Почему я должен использовать дополнительные & неофициальные параметры? Разве строковые переменные не являются просто другими массивами?

Ответы [ 4 ]

4 голосов
/ 15 февраля 2020

Как передать строку по ссылке в C ++?

Вы просто добавляете & к параметру.

Являются ли строки обычным массивом?

Нет, std::string не является массивом.

0 голосов
/ 15 февраля 2020

Вы должны перейти по ссылке, потому что так устроен язык.

Ваша теория о том, что "строки - это массивы", неверна. Строки - это строки.

Это правда, что по историческим причинам передача C массивов по значению на самом деле , по-видимому, передает их по ссылке (в действительности имя массива уменьшается до указателя ). Но это не то, что у вас есть, и дело не в том, как работает остальная часть языка.

Если вы передаете по значению, обычно вы получаете копию . Таким образом, ваша функция работает с копией. Передача ссылки означает, что вместо этого вы работаете с исходным объектом.

0 голосов
/ 15 февраля 2020

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

Также вызов должен быть:

reverseStr(str, 0, 2);

Диапазон 0 до 2, или еще лучше:

reverseStr(str, 0, str.size() - 1);

Как видно из использования .size() метода, std::string - это не массив char, это typedef шаблона класса std::basic_string<char>.

Узнайте больше о типе строки C ++ в https://pt.cppreference.com/w/cpp/string

0 голосов
/ 15 февраля 2020

Синтаксис для ссылок в C ++:

void reverseStr(string &arr, int start, int end);

Вы можете думать о arr как о указателе, который автоматически разыменовывается.

Дополнительная информация о ссылках здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...