#c #string
#c #строка
Вопрос:
Допустим, у меня есть фрагмент кода, подобный этому:
else if (array[z] == 1){
string buf = string("00010");
barzip = buf;
string buf = string(NULL);
}
Излишне ли присваивать NULL buf, поскольку я собираюсь повторно использовать строковую переменную в следующем else if
операторе? Спасибо!
Комментарии:
1. Это не только избыточно, но и запрещено по
std::string
контракту, не говоря уже о том, что незаконно, посколькуbuf
уже было объявлено.NULL
(или лучше,nullptr
) предназначено для указателей.2. @chris Это то, что я предположил, но просто хотел убедиться. Спасибо
3.
string(NULL)
на самом деле вызывает неопределенное поведение. Пустой строкой являетсяstring()
илиstring("")
. И самый простой способ очистить строку — этоbuf.clear();
Ответ №1:
Это избыточно. Фактически, строка buf
выйдет из области видимости в конце блока, поэтому будет вызван buf
деструктор.
else if (array[z] == 1)
{
string buf = string("00010");
barzip = buf;
buf = string(NULL); // second declaration would not compile.
}
Должно быть просто
else if (array[z] == 1)
{
string buf("00010");
barzip = buf;
// buf goes out of scope here; destructor is called.
// Each iteration through the block will use a newly-constructed buf variable
}
Комментарии:
1. еще лучше,
barzip = string("00010");
Ответ №2:
Вам не нужно этого делать. Область действия переменной buf находится только в этой ветви else инструкции if. Если этот код не выполняется, то buf никогда не создается. Кроме того, если этот же код выполняется в цикле, это каждый раз новый buf, поскольку, как только вы покидаете ветку else if там, buf забывается.
обратите также внимание, что вы можете сделать это:
string buf("00010");
Вместо:
string buf = string("00010");
Ответ №3:
Прежде всего,
string buf = string("00010");
barzip = buf;
string buf = string(NULL);
не будет компилироваться, потому что вы пытаетесь объявить две переменные с одинаковым именем ( buf
) в одном блоке.
Во-вторых, вы нигде не присваиваете NULL
значение. Вы инициализируете неназванную временную строку с помощью NULL
. Это неопределенное поведение, которое означает, что при запуске программы может произойти что угодно.
Если вам повезет, он немедленно завершит работу и покажет вам, что в вашем коде есть ошибка. Если вам не повезет, это не приведет к сбою и не причинит ничего вредного в течение первых 20 раз, когда вы выполняете программу, и завершится сбоем с 21-й попытки, что приведет к бесконечному поиску ошибок.
После незаконной инициализации вы технически присваиваете buf
эту неназванную временную строку, но поскольку поведение на тот момент уже не определено, бессмысленно рассуждать об этом дальше.
Похоже, у вас есть опыт работы с C и вы привыкли к ручной обработке char
указателей. В C лучше концептуально обрабатывать std::string
объекты точно так же, как встроенные типы без указателей. Вы «очищаете» int
, когда оно больше не используется? Вы, конечно, этого не делаете. Вы «очищаете» a double
перед присвоением ему нового значения? Опять же, вы этого не делаете. Так что не пытайтесь делать такие вещи с std::string
, либо. Это просто не имеет смысла.