Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查是否设置了std::string?_C++ - Fatal编程技术网

C++ 如何检查是否设置了std::string?

C++ 如何检查是否设置了std::string?,c++,C++,如果使用char*,我可以将其初始化为NULL,然后通过比较检查是否设置了它。如何对std::string执行相同的操作?如何检查字符串是否已设置 编辑: 如果我设置的字符串也是空的呢?是否必须使用附加标志来检查std::string是否已设置?使用empty(): std::string的默认构造函数总是返回设置为空字符串的对象。您不能;至少与测试指针是否为空的方法不同 std::string对象始终初始化并始终包含字符串;默认情况下,其内容为空字符串(“”) 您可以测试空性(使用s.size

如果使用
char*
,我可以将其初始化为
NULL
,然后通过比较检查是否设置了它。如何对
std::string
执行相同的操作?如何检查字符串是否已设置

编辑: 如果我设置的字符串也是空的呢?是否必须使用附加标志来检查
std::string
是否已设置?

使用
empty()


std::string的默认构造函数总是返回设置为空字符串的对象。

您不能;至少与测试指针是否为空的方法不同

std::string
对象始终初始化并始终包含字符串;默认情况下,其内容为空字符串(
“”


您可以测试空性(使用
s.size()==0
s.empty()

std::string没有“unset”状态,它总是设置为某个值。

我认为std::string类无法分辨。但是,如果您确实需要这些信息,您可以始终从std::string派生一个类,并让派生类能够判断它是否在构造后(或其他任意时间)发生了更改。或者更好的是,只需编写一个包装std::string的新类,因为由于缺少基类虚拟析构函数,从std::string派生可能不是一个好主意。这可能需要更多的工作,但要找到最佳解决方案,往往需要更多的工作


当然,您总是可以假设,如果它包含“”以外的内容,那么它已被“设置”,但这不会检测到手动将其设置为“”。

正如一些答案所指出的,
std::string
的值没有“空”的概念。如果将空字符串用作此类值不够好(即,需要区分没有字符的字符串和没有值的字符串),可以使用
std::string*
并将其设置为NULL或有效的
std::string
实例


您可能希望使用某种智能指针类型(boost::scoped_ptr或其他类型)来帮助管理您设置指针的任何
std::string
对象的生存期。

如果字符串是
@nakiya:那是空的,会发生什么
std::string
不是指针,您不能为其分配null。因此,基本上,如果我分配的字符串可以是任何内容,包括
,我必须保留另一个
bool
或其他内容,以检查它是否已设置:S@nakiya:按照Michael Burr的建议,要么使用指向
std::string
的指针。或者使用提供此类功能的包装器(如Boost.Optional)。@nakiya自C++17以来,有
std::Optional
可以用作包装器来表示未实例化的字符串。就像James McNellis已经从Boost中建议了一个等价的方法一样。要明确的是,默认构造函数返回一个空字符串,
std::string()==std::string(“”)
,从标准库容器公开派生通常是个坏主意,因为它们没有虚拟析构函数。最好将
std::string
封装为成员变量。@James McNellis:我明白这一点。我将把它合并到答案中。你为什么想要这种行为?你也可以使用
boost::optional
。模板
boost::optional
的存在正是为了支持非自然类型的“空值”。
std::string s;

if (s.empty())
    // nothing in s