Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++;字符串类_C++ - Fatal编程技术网

C++ 定制C++;字符串类

C++ 定制C++;字符串类,c++,C++,我正在创建一个类似于string类的类。我在做一些实验的开始阶段 假设添加了所有头文件 class String { public: int len; char *str = NULL; // Default constructor String() {

我正在创建一个类似于string类的类。我在做一些实验的开始阶段

假设添加了所有头文件

class String
{
      public: 
          int len; 
          char *str = NULL;                                                                       

      // Default constructor 
      String()
      {                                             
           len = 0;
           str = new char[1];             
           str[0] = '\0';
           printf("New memory: %p\n", str);
      }

    // Copy constructor
    String(const char *ch)
    {
        len = strlen(ch);  

        if (str != NULL)
        {
            printf("Old memory: %p\n", str);
            delete str; 
            printf("Deleted...\n");               
        }

        str = new char[len + 1];
        printf("New memory: %p\n", str);

        for (int i = 0; i <= len; i++)
            str[i] = ch[i];
    }
};


int main()
{
    String msg;

    std::cout << msg.len << std::endl;
    std::cout << msg.str << std::endl;

    msg = "Hello";
    std::cout << msg.len << std::endl;
    std::cout << msg.str << std::endl;
}
类字符串
{
公众:
内伦;
char*str=NULL;
//默认构造函数
字符串()
{                                             
len=0;
str=新字符[1];
str[0]='\0';
printf(“新内存:%p\n”,str);
}
//复制构造函数
字符串(常量字符*ch)
{
len=strlen(ch);
如果(str!=NULL)
{
printf(“旧内存:%p\n”,str);
删除str;
printf(“已删除…\n”);
}
str=新字符[len+1];
printf(“新内存:%p\n”,str);
对于(int i=0;i您的代码执行以下操作:

  • 默认构造一个
    字符串
    “a”
  • 从表达式
    “Hello”
  • 复制将“B”分配给“A”
赋值不会调用“A”上的构造函数。每个对象只能得到一个构造

除非您另外指定(使用委托构造函数),否则在运行“复制构造函数”(或类似于您的转换构造函数)之前不会调用默认构造函数

因此:

它应该执行,因为str在默认构造函数的前面分配了一个字节的内存,并且它不是空的

这是错误的

字符串(const char*ch)
需要分配

另外,由于您正在执行分配,因此需要实现一个复制分配操作符以确保安全。

您的代码执行以下操作:

  • 默认构造一个
    字符串
    “a”
  • 从表达式
    “Hello”
  • 复制将“B”分配给“A”
赋值不会调用“A”上的构造函数。每个对象只能得到一个构造

除非您另外指定(使用委托构造函数),否则在运行“复制构造函数”(或类似于您的转换构造函数)之前不会调用默认构造函数

因此:

它应该执行,因为str在默认构造函数的前面分配了一个字节的内存,并且它不是空的

这是错误的

字符串(const char*ch)
需要分配


也因为执行赋值,所以需要实现一个拷贝赋值操作符来确保它的安全性。< /P>这不是一个复制构造函数。这是一个构造函数,它使用了<代码> const char */COD>。复制构造函数将有签名<代码>字符串(const string and and)()/c> >不是C++(包括它的各种库)已经有足够多的字符串类了?为什么还要创建另一个呢?当您为一个类调用非默认构造函数时,默认构造函数不会事先调用。当您输入

string(const char*)
时,您的
string
处于与刚输入
string()相同的状态
。这意味着
str==NULL
。也可以使用
nullptr
。@JohnFilleau我们有答案部分。谢谢。@JesperJuhl学习?实践?这是一个非常常见的练习,不是吗?那不是复制构造函数。那是一个接受
const char*
的构造函数。复制构造函数会有签名E<代码>字符串(const string and and)(/CONTRORY)< /C> > C++(包括它的各种库)已经有足够多的字符串类了吗?为什么创建另一个类?当调用类的非默认构造函数时,默认构造函数不会预先调用。
您的
字符串
处于与您刚刚输入的
字符串()相同的状态
。这意味着
str==NULL
。也可以使用
nullptr
来代替。@JohnFilleau我们有一个答案部分。谢谢。@JesperJuhl学习?练习?这是一个非常常见的练习,不是吗?啊,现在我知道你的误解在哪里了。啊,现在我知道你的误解在哪里了。