какова область действия этой переменной в c ++? - PullRequest
0 голосов
/ 30 мая 2020

Если я определю такую ​​функцию, как эта

std::string& returnstring(std::istringstream &ist)
{
    std::string temp;
    std::getline(ist,temp);
    return temp;
}

, и если я использую этот temp, который передается по ссылке другой такой функции

void displaystring(std::string &temp)
{
    std::cout<<temp;
}

, будет ли string temp все еще будет в области действия, когда я передам его по ссылке на функцию displaystring?

Ответы [ 4 ]

3 голосов
/ 30 мая 2020

Область видимости переменной - это область, в которой она объявлена. std::string temp; объявляется в теле функции returnstring, поэтому это тело функции является областью действия переменной. Это автоматическая c переменная, и поэтому ее время жизни заканчивается в конце ее области видимости, и она автоматически уничтожается.

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

Чтобы исправить функцию, простое решение - вместо этого вернуть значение.

1 голос
/ 30 мая 2020

Нет, поскольку временная переменная является локальной для функции returnstring, и как только код выходит из функции retuernstring, временная переменная больше не действительна. Если вы вообще хотите отправить ссылку и получить ответ, то лучший вариант - отправить аргумент по ссылке, как показано ниже:

void copyLineAsString(std::istringstream &ist, std::string& tempString)
{
    std::getline(ist,tempString);
    return;
}

У меня есть несколько других предложений по вашему коду для хорошей практики кодирования, никогда используйте '&' для типа возвращаемого значения / возвращайте переменную по ссылке. Используйте верблюжий регистр или разделитель _ для имен функций (например, returnString или return_string).

1 голос
/ 30 мая 2020

Нет. Объем temp ограничен блоком, в котором он объявлен. Поскольку вы объявили его в стеке (вы не использовали ключевое слово new), переменная temp будет уничтожена в момент выхода из функции. Единственный способ сохранить переменную - это скопировать значение temp в переменную вне функции. Например, это будет работать:

std::string returnstring(std::istringstream &ist)
{
    std::string temp;
    std::getline(ist,temp);
    return temp;
}

Поскольку возвращаемое значение является копией, а не ссылкой, тогда вы можете выполнить std :: string return_string = returnstring (ist); И скопируйте значение temp во вновь объявленную переменную, которая может использоваться для вашей функции displaystring.

В общем, я бы избегал объявления переменных внутри функции, которые вам понадобятся вне области действия функции. Вместо этого возвращайтесь по значению всякий раз, когда вы возвращаете переменные, встроенные в функцию (однако, не рекомендуется для больших массивов и объектов).

0 голосов
/ 30 мая 2020

this - это ссылочная переменная, которая ссылается на текущий объект класса, который ее вызвал. он имеет область видимости только внутри класса и такой же, как время жизни вызвавшего его объекта.

...