复制构造函数 - 我是否正确设置了我的 std::字符串

copy constructor - am I setting my std::strings correctly

本文关键字:我的 std 设置 字符串 构造函数 是否 复制      更新时间:2023-10-16

我的问题是一个基本的问题。由于数组std::string,我是否在我的复制构造函数中正确处理它们?

class json{
    private:
        std::string _objectContents;
        std::string _regComments;
        bool _isJson;
        int numElements;
    public:
        json(const json&);
        ...
};
json::json(const json& source){
    _objectContents = source._objectContents;
    _regComments = source._regComments;
    _isJson = source._isJson;
    _numElements = source.numElements;
}

*编辑了删除指针并更改为有问题的数组。

我是否设置了我的标准::字符串正确

您设置了正确的它们,但它可以更好。

  1. 不需要显式定义的复制构造函数。编译器生成的一个将为您拥有的成员变量做正确的事情。

  2. 如果必须显式定义复制构造函数,请使用初始化列表初始化成员。将实现更改为:

    json::json(const json& source) : 
       _objectContents(source._objectContents),
       _regComments(source._regComments),
       _isJson(source._isJson),
       _numElements(source.numElements)
    {
    }
    

字符串赋值运算符隐式复制(或移动)基础字符数组从源字符串到目标字符串(深层副本),而不是仅复制它们的指针(浅拷贝)。
所以是的,你的代码是正确的。
由于所有成员变量都可以使用赋值运算符进行复制,因此无需显式声明复制构造函数。
尽管如果您使用 C 样式字符串,您将需要一个复制构造函数。在这种情况下,默认复制构造函数执行浅拷贝,而您可能打算执行深层复制。