我是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”类成员后被截断?我做错了什么?
答案 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上的一些教程作为开头:)