C++中将字符串初始化为NULL

5
string a=NULL;

它报错了。为什么我要如何将字符串初始化为NULL?
但是当我写下
string a="foo";

这个工作正常。

尝试使用指针,你可以将NULL赋值给它,但不要忘记正确使用newdelete - Zaffy
@Borgleader:string a;有什么问题吗? - sbi
@sbi:没有什么,事实上可能更好。 - Borgleader
3个回答

15

实际上,要获取一个空的std::string,只需编写以下代码:

std::string a;

std::string的默认构造函数将自动创建一个空字符串,无需进一步提示。

顺便提一下,在C++中使用NULL通常是不被鼓励的,建议使用0(通常NULL也被定义为0),或者如果你有足够现代的编译器,使用nullptr


1
nullptr将会是未定义行为,因为它将尝试从空指针构造一个std::string,这在标准中是不允许的。 - Puppy
@DeadMG 我认为“as an aside”意味着它不适用于这种情况。 - Mark Ransom
1
顺便说一下,在使用预nullptr C++中,我不明白为什么使用NULL被反对...实际上它与0相同(保证定义为0),并且更清楚地表明我们正在谈论指针。 - Matteo Italia
1
@MatteoItalia foo(NULL)会调用foo(char*)还是foo(int)?你可能会说是foo(char*),因为NULL通常用于指针,但实际上它会调用foo(int)。清晰的代码很重要,不要在C++中使用NULL - user142019
2
@Zoidberg'--: 不,我会说 foo(int),因为我知道NULL就是普通的零。但如果我犯了错误,后来有人注意到调用了错误的重载,他可以立即理解我的意思并添加相关的转换(否则他必须问我是否指的是“整数零”还是“指针零”)。我同意NULL是一个失误——nullptr出现是有原因的,但我觉得它比对于指针也使用0要好。无论如何,所有这些都与问题无关(我很抱歉偏离了主题),而且现在nullptr解决了这个问题,这些都不再相关。 - Matteo Italia

4

null空字符串是有区别的(空字符串仍然是一个有效的字符串)。如果你想要一个“可为空”的对象(可以容纳最多一个特定类型的对象),你可以使用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)

-2

让我们分解一下你实际上正在做什么:

string a=NULL;

首先执行string a。 这会在堆栈上创建一个新对象,其默认值为(空字符串)。 然后执行a = NULL,这将调用字符串类的赋值函数。 但是NULL是什么? 在C++中,NULL被宏扩展为0。 因此,您正在尝试将整数分配给string变量,这当然是不可能的。
string a="abc"

这段代码能够正常工作,是因为你想要分配一个字符数组,并且string类已经重载了赋值运算符方法来处理字符数组,但是没有针对整数进行重载。这就是为什么NULL不能工作而"abc"可以工作的原因。


1
在 C 语言中,NULL 被定义为 ((void*)0),但在 C++ 中只是 0 - Zaffy
请注意类型转换 (void*)0 - 这意味着指向0的指针,而不是0的整数表示。在C++中,我认为这在很大程度上取决于编译器。 - Fergus In London
1
std::string a = NULL; 是一种初始化,而不是赋值。 operator= 没有被调用(或者至少不是直接调用,这取决于实现方式)。 - user142019
2
@Zaffy 不是。它是一个字符数组。它会衰减为指针,指针的存储方式(如果有存储)是由实现定义的。在一些疯狂的架构中,它可能是一个浮点数。 - user142019
2
@JakubZaverka,指针可以转换为像int或long这样的数值,但它是一个独特的类型。这是一个很大的区别。 - Timo Geusch
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接