簡體   English   中英

C ++:將一個對象復制到構造函數中的另一個對象

[英]C++: Copy one object to another within a constructor

在我的代碼中,我試圖創建一個字符串類(這是一個賦值),並使用一個包含以下數據的類:

private:
  int   strLen;
  int   dataLen;
  char* data;

和構造函數:

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

第三個構造函數使用字符串數組,為數據分配空間並將其復制到其中,將strLen設置為字符串中的字符數,並將dataLen設置為數組的大小。 第二個構造函數是類似的,但是它需要一個完整的對象,並且應該將其復制到該構造函數正在創建的新對象中。 一個示例可能如下所示:

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

我的問題是,有沒有一種方法可以將對象fred復制到構造函數中的對象引用中,而不復制每個單獨的數據(即strLen,dataLen和data)? 對於此分配,只有3條數據,但是說有50條或100條數據將是冗長而乏味的。 我試圖尋找答案並遇到了復制構造函數,但是我不確定它們如何工作,或者它們是否只是手動復制每個數據。 我是類語法的新手,所以如果答案是微不足道的,而我只是在所有錯誤的地方尋找答案,我深表歉意。 謝謝。

有沒有一種方法可以將對象fred復制到構造函數中的對象引用,而無需復制每個單獨的數據(即strLen,dataLen和data)?

不。 復制構造函數(和復制分配運算符)的工作是根據需要復制每個單獨的字段。 在您的情況下,由於數據是動態分配的,因此這還意味着分配新的內存塊以將字符數據復制到其中。

對於此分配,只有3條數據,但是說有50條或100條數據將是冗長而乏味的。

是的,這就是原因,這是為什么:

  1. 課程應盡可能簡短和准確。 然后可以使用較小的類來設計更大,更復雜的類,以有效地管理數據。

  2. 您應該使用編譯器可以為您復制的數據類型。 如果不提供副本構造函數(或副本賦值運算符),則編譯器會為您生成一個默認值(除非您告訴編譯器不要這樣做-僅限C ++ 11和更高版本),它會逐個成員地進行復制。 該默認實現適用於瑣碎的數據類型以及實現適當的復制語義(復制構造函數和復制賦值運算符)的用戶定義類型。

在您的示例中,如果用單個std::string字段替換了三個字段,則您的類將不再需要實現自定義副本語義,編譯器生成的副本構造函數和副本賦值運算符就足夠了。

如果您在復制數據時需要擔心執行手動內存管理,請閱讀規則以及正確的復制語義為何重要的原因。

暫無
暫無

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

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