C ++ const字符串文字和自定义字符串类

时间:2015-10-03 07:23:50

标签: c++ string const literals string-literals

在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但没有做任何事情。

任何见解都会对我有所帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

我认为你对指针指针感到困惑。

p_start = "Yellow",你正在改变指针的值,指向“黄色”。 *p_start = 'Y',您正在更改指针的值,内容p_start指向的内容,而不是其自身。正如你所说,“黄色”是常量字符,因此尝试修改它们的行为是UB。

您可以在ctor中复制它,然后您可以修改由该类管理的字符。是的,它将是一个新副本,但它不会是浪费的内存。如果你想让它们变得更好,你别无选择。