Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为字符串类创建副本构造函数_C++_String_Constructor_Copy Constructor - Fatal编程技术网

C++ 为字符串类创建副本构造函数

C++ 为字符串类创建副本构造函数,c++,string,constructor,copy-constructor,C++,String,Constructor,Copy Constructor,我正在创建自己的字符串类(作为练习),我知道我需要一个复制构造函数和重载的=赋值运算符,但不确定从何处开始 该类很简单,只存储字符串,例如 char* m_string; 我目前有一个标准构造函数(MyString(const char*str)),它接受一个const char*string,然后通过m_string=new char[numChars+1]分配必要的内存(在计算参数中的字符数之后) 显然,我需要能够使用赋值运算符将一个字符串赋值给另一个字符串,但也希望能够从另一个字符串构造

我正在创建自己的字符串类(作为练习),我知道我需要一个复制构造函数和重载的=赋值运算符,但不确定从何处开始

该类很简单,只存储字符串,例如

char* m_string;
我目前有一个标准构造函数(
MyString(const char*str)
),它接受一个
const char*string
,然后通过
m_string=new char[numChars+1]
分配必要的内存(在计算参数中的字符数之后)

显然,我需要能够使用赋值运算符将一个字符串赋值给另一个字符串,但也希望能够从另一个字符串构造字符串对象。i、 e

MyString(const MyString& str)
{
}
关于重载=赋值运算符

然后,我是否根据字符数获得rhs和lhs的长度,然后根据rhs比lhs长还是短来调整内存量

我不一定想要完整的答案,因为我不相信你仅仅从被告知答案中学到任何东西,但是如果你能提供一些正确方向的建议和指导,我将不胜感激


谢谢复制构造函数必须为
str
的有效负载分配内存,然后复制内容。这与您已有的构造函数非常相似,只是
char*
不是直接作为参数提供的,而是在
str
中“隐藏”的

赋值运算符必须考虑已分配的内存

  • 它可以重用现有分配的内存。如果新内容的长度相同或更短,则此操作有效。终止
    \0
    将使末尾的附加内存对常规字符串处理函数不可见

  • 如果新字符串较大,则必须释放旧内存并分配足够大的新块

  • 为了安全起见,建议检查自我分配,即
    this==&rhs
    。如果你删除内存,然后尝试从中读取,你会遇到问题。这允许
    a=a
    工作
  • 返回对修改对象的引用也是常见的做法。 这允许
    a=b=c
    工作

    • 这可能会奏效

      MyString(const MyString & str) {
          m_string = new char[str.length() + 1];
          . . .    /// same as MyString(const char * str)'s definition
      }
      
      对于
      运算符=

      operator =(const char * str) {
          if (strcmp(mstring, str) == 0) return;    /// Optional
          delete[] mstring;
          mstring = new char[strlen(str) + 1];
          . . .    /// Same as the constructor
      }
      

      这就是我的想法,我是否先删除Lhs的内存,然后用另一个
      新的
      完全重新分配它?@未知它是一个构造函数。没有分配给删除的内存。@unknownSPY否,因为它是一个构造函数,所以没有什么可删除的。啊,好的-谢谢,这很有意义。重载=赋值运算符的情况如何?@unknownSPY对于
      运算符=()
      ,您是对的,您有一个现有的对象,必须释放(或重用,如果现有缓冲区足够大,并且您希望减少内存分配)其内存以避免内存泄漏。是否应该
      删除mstring
      删除[]mstring
      ?@unknownSPY是,已修复。您也可以添加相等性检查,但它是基于意见的而不是
      strcmp()
      。这里的问题是关于别名的。@DanAllen两者都是C样式的字符串,这将如何工作?这里的危险是
      delete[]mstring
      正在删除
      str
      ,因为它是别名。事实上,您需要处理指向“内部”mstring的
      str
      。假设
      str==mstring+1
      您的测试将为false,但代码仍将失败。