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

标签 c++ string constants 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”,是不可变的,它们的每个字符字节都是不可更改的。尽管我设法将 Yellow 分配给 p_start 指针,但改变了第一个字母。尽管通过取消引用 H 指针将单个字母 H 更改为 Y 没有做任何事情。

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

最佳答案

我认为您混淆了pointerpointee

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

你可以在ctor中复制它,然后你可以修改由类管理的字符。是的,这将是一个新拷贝,但不会浪费内存。如果您希望它们可变,您别无选择。

关于C++ const 字符串文字和自定义字符串类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32920021/

相关文章:

c# - 在 Umbraco 的 Razor 中的潜在字符串上使用 string.IsNullOrEmpty

c++ - 协变 cv 限定符是否适用于 C++ 中的原始类型?

R 如何使用格式代码/字符串将一列字符串拆分为多列?

c++ - 在复制构造函数中调用 const 引用的方法

const 指针的 C++ typedef 解释

c++ - 模板函数重载

c++ - 为什么有或没有 const 修饰符会使效率相差 4 倍?

android - 加速 ImageView 中的缩放功能

c++ - perl 内联 cpp 不工作 windows 32 位

java - 在Java中删除字符串中的重复字符