在 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”,是不可变的,它们的每个字符字节都是不可更改的。尽管我设法将 Yellow 分配给 p_start 指针,但改变了第一个字母。尽管通过取消引用 H 指针将单个字母 H 更改为 Y 没有做任何事情。
任何见解都会对我有所帮助,谢谢。
最佳答案
我认为您混淆了pointer 和pointee。
p_start = "Yellow"
,您正在更改指针的值,使其指向“黄色”。 *p_start = 'Y'
,您正在更改 pointee 的值,p_start
指向的内容,而不是它本身。正如您所说,“黄色”是常量字符,因此尝试修改它们的行为是 UB。
你可以在ctor中复制它,然后你可以修改由类管理的字符。是的,这将是一个新拷贝,但不会浪费内存。如果您希望它们可变,您别无选择。
关于C++ const 字符串文字和自定义字符串类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32920021/