C ++ - 无法在成员初始化列表中初始化空字符串

时间:2017-04-20 18:25:50

标签: c++

我是C ++的新手,当我遇到这个问题时,我正在尝试构建一个字符串类的一些功能(主要是模板,指针,OOP)。有罪的代码如下所示:

string.h中

...
private:
        char* value;
...
public:
        string();
...

string.cpp

string::string() : value( '\0' ) {
    std::cout << "Initialized string value: " << this->value << "blablabla" << std::endl;
}

我认为会发生的是,“值”类的memeber在构造函数被调用时被初始化为空字符串,但显然我错了,因为当我调用它时,我在控制台上看到了这个:

"Initialized string value: "

现在,为什么输出会在打印“value”类成员后被截断?我做错了什么?

3 个答案:

答案 0 :(得分:1)

您的代码

string::string() : value( '\0' )

将整数值0(相当于nullptr或仅仅NULL)分配给一个变量,该变量是指向字符串中第一个字符的指针。

使特定代码工作的一件事是为初始化指定一个实际的字符串:

string::string() : value( "" ) // note the double-quotes to denote a string

当然,您还应该实现对char* value;缓冲区的正确处理,即确保在为其分配值时分配字符串,在不再需要时释放内存等等。

<强> N.B。
我绝不主张以这种方式实际做到这一点!我只提供了一个适用于此短代码段的示例。如果您使用默认值,我建议您使用静态成员变量作为&#34;空字符串&#34;初始化。这样,至少可以在需要分配缓冲区或释放内存时检查字符串是否为空。

在你的.h文件中:

private:
    static char empty[];

在你的.cpp文件中:

char string::empty[] = {'\0'};

string::string() : value(empty) {...}

答案 1 :(得分:1)

您正在初始化char*,其数值为0,即NULL。将NULL char*指针传递给operator<<未定义的行为。这就是您看到截断输出的原因 - std::cin正在进入失败状态,从而忽略了后续operator<<次调用。

如果您希望operator<<成功,则需要将char*指针的初始化更改为实际内存地址(即使只是nul个字符),例如:< / p>

string::string() : value( "\0" )

或者简单地说(\0是隐含的):

string::string() : value( "" )

使用"而不是'将文字定义为静态内存中的const char[]数组,并将数组衰减为指针。

现在,将char*传递给operator<<将会有明确定义的行为。

但是,如果您希望在字符串为空时char*为NULL,那么如果它为NULL,则需要注意不要将char*传递给operator<<,例如:

class myString
{
private:
    char* value;
    ...

public:
    myString();
    void print(std::ostream &out) const;
};

std::ostream& operator<<(std::ostream &out, const myString &str);

myString::mySstring() : value( 0 ) {}

void myString::print(std::ostream &out) const
{
    if (value) out << value;
}

std::ostream& operator<<(std::ostream &out, const myString &str)
{
    str.print(out);
    return out;
}

myString s;
std::cout << "Initialized string value: " << s << "blablabla" << std::endl;

答案 2 :(得分:0)

当您将char*传递给operator<< std::cout时,您的char*将被视为C字符串,这意味着它将被取消引用。

在您的特定情况下value指针初始化为'\0' - 因为您的编译器可能已经警告过您,这是一种创建空指针的隐式方法。

取消引用空指针是未定义的行为,这解释了输出的突然截断。

由于您需要取消引用指针,因此您需要确保指向某些实际有效内存。这将需要您班级的正确内存管理,并且该主题肯定不适合一个SO答案。

考虑在C ++中阅读dynamic memory上的一些教程作为开头:)