【问题标题】:string initializing as NULL in C++字符串在 C++ 中初始化为 NULL
【发布时间】:2012-12-03 13:22:34
【问题描述】:
string a=NULL;

它给出了错误。为什么以及如何将字符串初始化为 NULL?

但是当我写的时候

string a="foo";

这个很好用。

【问题讨论】:

  • 尝试使用指针,可以给它赋值NULL,但不要忘记正确使用newdelete
  • @Borgleader:string a; 怎么了?
  • @sbi: 没什么,事实上它可能更好。

标签: c++ string null


【解决方案1】:

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"
    

    有效,因为您想分配一个 char 数组,并且 string 类具有为 char 数组重载的赋值运算符方法,但不适用于整数。这就是为什么NULL 不起作用而“abc”起作用的原因。

    【讨论】:

    • 在 C 中,NULL 被定义为 ((void*)0),但在 C++ 中它只是 0
    • 注意类型转换(void*)0 - 这意味着指向0的指针;不是 0 的整数表示。在 C++ 中,我认为这在很大程度上取决于编译器。
    • std::string a = NULL; 是初始化,而不是赋值。 operator= 未被调用(或至少不是直接调用,具体取决于实现)。
    • @Zaffy 没有。这是一个字符数组。它衰减为一个指针,并且该指针的存储方式(如果它被存储的话)是实现定义的。它可能是疯狂架构上的浮点数。
    • @JakubZaverka,指针可以转换为 int 或 long 等数值,但它是一种不同的类型。这是一个很大的不同。
    【解决方案3】:

    其实要得到一个空的std::string,你就写

    std::string a;
    

    std::string 的默认构造函数会给你一个空字符串,无需进一步提示。

    顺便说一句,通常不鼓励在 C++ 中使用 NULL,建议使用 0(NULL 往往被定义为无论如何),或者如果您有足够现代的编译器,nullptr

    【讨论】:

    • nullptr 将是 UB,因为它将尝试从空指针构造 std::string,这是标准不允许的。
    • @DeadMG 我认为“顺便说一句”意味着它不适用于这种情况。
    • 顺便说一句,我看不出在nullptr C++ 之前是如何不鼓励使用NULL...实际上它与0 相同(保证定义为0),更清楚地表明我们在谈论指针。
    • @MatteoItalia foo(NULL) 会调用foo(char*) 还是foo(int)?你会说foo(char*),因为NULL 用于指针,但它实际上是在调用foo(int)。清晰的代码很重要。永远不要在 C++ 中使用NULL
    • @Zoidberg'--: 不,我会说 foo(int) 因为我知道 NULL 是零。但是,如果我犯了错误,后来其他人注意到调用了错误的重载,他可以立即理解我的意思并添加相关的强制转换(否则他将不得不问我我的意思是“整数零”还是“指针零”) .我同意 NULL 是个烂摊子 - 引入 nullptr 是有原因的,但我觉得它也比将 0 用于指针要好。无论如何,所有这些都与问题无关(我很抱歉让它脱轨),而且现在nullptr 解决了这个问题。
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多