在C ++字符串文字中,“Hello”是const并且是不可变的。我想创建一个自定义字符串类,其字符串不是常量字符,因此它们可以更改
以下是一段代码,可以说明我正在尝试做的事情:
#include <iostream>
class String {
public:
char * p_start;
String(char * strSourc) // Constructor
{
p_start = strSourc;
}
};
int main()
{
String myString("Hello");
// Create object myString, send "Hello" string literal as argument
std::cout << myString.p_start << std::endl;
// Prints "Hello"
*myString.p_start = 'Y';
// Attempt to change value at first byte of myString.p_start
std::cout << myString.p_start << std::endl;
// Prints "Hello" (no change)
myString.p_start = "Yellow";
// Assigning a string literal to p_start pointer
std::cout << myString.p_start << std::endl;
// Prints Yellow, change works. I thought myString "Hello" was const chars, immutable
return 0;
}
所以,我很困惑。我到处寻找,它说字符串文字,如“Hello”,是不可变的,它们的每个char字节都是不可更改的。虽然我设法将黄色指定给p_start指针,但更改了第一个字母。虽然通过解除引用H指针将单个字母H更改为Y但没有做任何事情。
任何见解都会对我有所帮助,谢谢。
答案 0 :(得分:1)
我认为你对指针和指针感到困惑。
p_start = "Yellow"
,你正在改变指针的值,指向“黄色”。 *p_start = 'Y'
,您正在更改指针的值,内容p_start
指向的内容,而不是其自身。正如你所说,“黄色”是常量字符,因此尝试修改它们的行为是UB。
您可以在ctor中复制它,然后您可以修改由该类管理的字符。是的,它将是一个新副本,但它不会是浪费的内存。如果你想让它们变得更好,你别无选择。