2016-12-04 43 views
0

在我的代碼,我試圖做一個字符串類(這是一個分配),並具有下列數據的類中的一個對象複製到另一個:C++:</p> <pre><code>private: int strLen; int dataLen; char* data; </code></pre> <p>和構造函數:一個構造函數

myStr(); 
myStr(const myStr&); 
myStr(const char*); 

第三構造函數採用一個字符串數組,分配空間數據並把它複製在,設置的strlen到字符的字符串中的量,並且DATALEN到陣列的大小。第二個構造函數是相似的,但它需要一個完整的對象,並且應該將其複製到構造函數創建的新對象中。一個例子可能是這樣的:

myStr fred("Fred"); 
myStr quote(fred); 

我的問題是,有沒有辦法複製的對象弗雷德反對在構造函數中報價不復制數據(即STRLEN,DATALEN和數據)的每個單獨的作品呢?對於這個任務,只有3個數據,但是說有50個,或100個,這將是漫長而乏味的。我試圖尋找答案,並且遇到了複製構造函數,但是我不知道它們是如何工作的,或者如果他們只是手動複製每一塊數據。我對類的語法很陌生,所以我很抱歉如果答案很微不足道,我只是在所有錯誤的地方尋找答案。謝謝。

+2

沒有。你必須按照正確的順序乖乖地複製需要複製的所有內容。在這裏,你不能只複製一切。您還需要將新對象的指針初始化爲新的動態分配的「數據」。並且不要忘記賦值運算符。 –

+1

如果您在班級中有50或100名成員,您會遇到嚴重的設計問題。 –

回答

0

有沒有辦法在構造函數中將對象fred複製到對象引用而不復制每個單獨的數據片段(即strLen,dataLen和data)?

沒有。複製構造函數(和複製賦值運算符)的作用是根據需要複製每個單獨的字段。在你的情況下,由於你的數據是動態分配的,這也意味着分配一個新的內存塊來複制字符數據。

對於這個任務,只有3個數據,但說有50個,或100個,這將是漫長而乏味的。

是的,這會是這樣,這是爲什麼:

  1. 類應儘可能短和精確。然後可以使用更小的類來設計更大更復雜的類,以有效地管理數據。

  2. 您應該使用編譯器可以爲您複製的數據類型。如果您沒有提供複製構造函數(或複製賦值運算符),則編譯器會爲您生成一個默認函數(除非您告訴編譯器不要這樣做 - 僅限C++ 11和更高版本)複製。對於普通數據類型以及實現適當複製語義(複製構造函數和複製賦值運算符)的用戶定義類型,該默認實現可以正常工作。

在您的例子,如果你有一個std::string場更換你的三個領域,你的類就不需要自定義實現複製語義了,編譯器生成的拷貝構造函數和拷貝賦值操作符就足夠了。

如果您在複製數據時需要考慮實施手動內存管理,請閱讀Rule of Three以及爲什麼適當的複製語義非常重要。

相關問題