簡體   English   中英

復制構造函數 - 我是否正確設置了 std::strings

[英]copy constructor - am I setting my std::strings correctly

我的問題是一個基本問題。 由於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;
}

*編輯刪除指針並更改為有問題的數組。

我是否正確設置了我的 std::strings

您正在正確設置它們,但它可以更好。

  1. 您不需要顯式定義的復制構造函數。 編譯器生成的那個將為您擁有的成員變量做正確的事情。

  2. 如果必須顯式定義復制構造函數,請使用初始化列表初始化成員。 將實現更改為:

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

字符串賦值運算符隱式地將底層字符數組從源字符串復制(或移動)到目標字符串(深拷貝),而不是僅復制它們的指針(淺拷貝)。
所以是的,你的代碼是正確的。
由於可以使用賦值運算符復制所有成員變量,因此您無需顯式聲明復制構造函數。
雖然如果您使用 C 樣式字符串,您將需要一個復制構造函數。 在這種情況下,默認復制構造函數會執行淺復制,而您可能打算執行深復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM