Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++ С;opy构造函数不起作用_C++_Constructor_Copy Constructor - Fatal编程技术网

C++ С;opy构造函数不起作用

C++ С;opy构造函数不起作用,c++,constructor,copy-constructor,C++,Constructor,Copy Constructor,我自己在写字符串课。我不知道如何编写Сopy构造函数。 我有这样的代码 class S { private: char *string; int l; public: S::S(const S &s){ string = new char[l+1]; memcpy(string,s.string,l+1);

我自己在写字符串课。我不知道如何编写Сopy构造函数。 我有这样的代码

class S { 
         private:
            char *string;
            int l;
         public:   
            S::S(const S &s){
                 string = new char[l+1];
                 memcpy(string,s.string,l+1);
               }
};
编译器未给出任何错误,但.exe因未知错误而关闭。我尝试在main()函数中使用它

S pop("Q6");
S str(pop);

所以我期待着你的帮助。

在你的副本构造函数中

 string = new char[l+1]

l
尚未初始化为字符串的长度,因此它可以是任何值。在使用它之前,应该初始化它(通过从
s.l
复制值)。

一旦有了复制构造函数,还需要提供赋值运算符和析构函数。这就是我们所知道的

但是最好是使用智能指针,这样你就不需要注意它了,三的规则就成了最好的选择

您还忘了初始化
l
。另外, MeMCPY 在C++代码中没有真实的位置。使用标准库算法,而不是C函数(在本例中为
std::copy
)。

试试这个

public:
    S::S(const S &s) : l(s.l)
    {
        string = new char[l+1];
        memcpy(string,s.string,l+1);
    } 

问题出在
l+1
中<代码>l未初始化。您需要分配它,比如,
l=s.l使用前。

为什么不在初始化列表中也初始化字符串?@Rocketq,这是初始化列表。例如,请参阅。@LuchianGrigore-如果字段的顺序不同,我会这样做(应该始终使用与它们声明的顺序相同的初始化列表。也可能要考虑是否使用<代码>新< /COD>的版本,它在失败时返回零指针或抛出异常。在生产中,您可能想考虑在这种情况下需要什么。完全符合我的<代码>关于我< /Cord>文本。谢谢。对于你的建议。我会尝试跟随他们。我不知道C++复制函数)这回答了这个问题,但是IMHO应该提到拷贝分配和破坏,以及智能指针是如何更好的开始。这个班级就像一颗定时炸弹。