复制构造函数 - 我正确设置我的std :: strings

时间:2015-01-20 17:34:59

标签: c++ deep-copy

我的问题是基本问题。由于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;
}

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

2 个答案:

答案 0 :(得分:3)

  

我设置我的std :: strings正确

您设置正确但可能更好。

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

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

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

答案 1 :(得分:2)

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