【问题标题】:copy constructor - am I setting my std::strings correctly复制构造函数 - 我是否正确设置了我的 std::strings
【发布时间】:2015-01-20 17:34:58
【问题描述】:

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

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;
}

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

【问题讨论】:

  • “既然std::strings是指针”什么?
  • 1) 字符串不是指针。 2)拷贝构造函数由编译器生成,你几乎不用自己写。
  • 复制构造函数的默认实现在这种情况下应该没问题,你不需要自己写。
  • +1 到 @Borgleader,但如果你仍然想编写复制构造函数,请使用初始化列表初始化成员,而不是在正文中。
  • 我没有投反对票,但这可能与之前没有研究有关。此外,它与“拖钓”毫无关系

标签: c++ deep-copy


【解决方案1】:

我的 std::strings 设置是否正确

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

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

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

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

【讨论】:

  • 谢谢!当我在方法中使用字符串构造函数时,我不断收到错误消息。你的回答很有道理。我现在看到我也不需要为每个字符串显式地执行此操作。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多