string a=NULL;
它报错了。为什么我要如何将字符串初始化为NULL?
但是当我写下
string a="foo";
这个工作正常。
实际上,要获取一个空的std::string
,只需编写以下代码:
std::string a;
std::string
的默认构造函数将自动创建一个空字符串,无需进一步提示。
顺便提一下,在C++中使用NULL通常是不被鼓励的,建议使用0(通常NULL也被定义为0),或者如果你有足够现代的编译器,使用nullptr
。
nullptr
将会是未定义行为,因为它将尝试从空指针构造一个std::string
,这在标准中是不允许的。 - Puppynullptr
C++中,我不明白为什么使用NULL
被反对...实际上它与0
相同(保证定义为0),并且更清楚地表明我们正在谈论指针。 - Matteo Italiafoo(NULL)
会调用foo(char*)
还是foo(int)
?你可能会说是foo(char*)
,因为NULL
通常用于指针,但实际上它会调用foo(int)
。清晰的代码很重要,不要在C++中使用NULL
。 - user142019foo(int)
,因为我知道NULL
就是普通的零。但如果我犯了错误,后来有人注意到调用了错误的重载,他可以立即理解我的意思并添加相关的转换(否则他必须问我是否指的是“整数零”还是“指针零”)。我同意NULL
是一个失误——nullptr
出现是有原因的,但我觉得它比对于指针也使用0要好。无论如何,所有这些都与问题无关(我很抱歉偏离了主题),而且现在nullptr
解决了这个问题,这些都不再相关。 - Matteo Italianull和空字符串是有区别的(空字符串仍然是一个有效的字符串)。如果你想要一个“可为空”的对象(可以容纳最多一个特定类型的对象),你可以使用boost::optional
:
boost::optional<std::string> str; // str is *nothing* (i.e. there is no string)
str = "Hello, world!"; // str is "Hello, world!"
str = ""; // str is "" (i.e. empty string)
让我们分解一下你实际上正在做什么:
string a=NULL;
string a
。 这会在堆栈上创建一个新对象,其默认值为(空字符串)。 然后执行a = NULL
,这将调用字符串类的赋值函数。 但是NULL
是什么? 在C++中,NULL
被宏扩展为0
。 因此,您正在尝试将整数分配给string
变量,这当然是不可能的。string a="abc"
这段代码能够正常工作,是因为你想要分配一个字符数组,并且string
类已经重载了赋值运算符方法来处理字符数组,但是没有针对整数进行重载。这就是为什么NULL
不能工作而"abc"可以工作的原因。
NULL
被定义为 ((void*)0)
,但在 C++ 中只是 0
。 - Zaffy(void*)0
- 这意味着指向0的指针,而不是0的整数表示。在C++中,我认为这在很大程度上取决于编译器。 - Fergus In Londonstd::string a = NULL;
是一种初始化,而不是赋值。 operator=
没有被调用(或者至少不是直接调用,这取决于实现方式)。 - user142019
NULL
赋值给它,但不要忘记正确使用new
和delete
。 - Zaffystring a;
有什么问题吗? - sbi