При использовании a char*
, Я могу инициализировать его к NULL
и более поздняя проверка, если это установлено путем выполнения сравнения. Как сделать то же самое для a std::string
? Как проверить, установлена ли строка или нет?
Править: Что, если строка я установил на, также пусто? Сделайте я должен использовать дополнительный флаг, чтобы проверить если std::string
установлен или нет?
Используйте empty()
:
std::string s;
if (s.empty())
// nothing in s
Как несколько ответов, на которые указывают, std::string
, не имеет никакого понятия 'пустых' для его значения. При использовании пустой строки как таковой значение не достаточно хорошо (т.е., необходимо различать строку, которая не имеет никаких символов и строки, которая не имеет никакого значения), можно использовать std::string*
и установить его в NULL или к допустимому std::string
экземпляр как соответствующий.
можно хотеть использовать своего рода тип интеллектуального указателя (повышение:: scoped_ptr или что-то), чтобы помочь управлять временем жизни любого std::string
объект, на который Вы устанавливаете указатель.
Вы не можете; по крайней мере, не тот же способ, которым можно протестировать, является ли указатель NULL
.
А std::string
объект всегда инициализируется и всегда содержит строку; его содержание по умолчанию является пустой строкой (""
).
можно протестировать на пустоту (использующий s.size() == 0
или s.empty()
).
Нет никакого состояния "сброса" для std::string
, это всегда набор к чему-то.
Конструктор по умолчанию для станд.:: представьте в виде строки всегда возвращает объект, который установлен на пустую строку.
Я не думаю, что можно сказать со станд.:: строковый класс. Однако при реальной необходимости в этой информации Вы могли бы всегда получать класс из станд.:: представьте в виде строки и дайте производному классу способность сказать, было ли это изменено начиная с конструкции (или некоторый другой произвольный момент времени). Или еще лучше, просто запишите новый класс, который переносит станд.:: строка начиная с получения из станд.:: строка не может быть хорошей идеей, учитывая отсутствие базового класса виртуальный деструктор. Это - вероятно, больше работы, но больше работы имеет тенденцию быть необходимым для оптимального решения.
, Конечно, можно всегда просто принимать, содержит ли это что-то другое, чем, "" затем это было "установлено", это не обнаружит его вручную устанавливаемый на "" все же.